def setup_module(mod): """ Sets up the pytest environment * `mod`: module name """ testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... json_file = "{}/ospfv3_nssa.json".format(CWD) tgen = Topogen(json_file, mod.__name__) global topo topo = tgen.json_topo # ... and here it calls Mininet initialization functions. # get list of daemons needs to be started for this suite. daemons = topo_daemons(tgen, topo) # Starting topology, create tmp files which are loaded to routers # to start daemons and then start routers start_topology(tgen, daemons) # Creating configuration from JSON build_config_from_json(tgen, topo) # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) result = verify_ospf6_neighbor(tgen, topo) assert result is True, "setup_module: Failed \n Error:" " {}".format( result) logger.info("Running setup_module() done")
def setup_module(mod): """ Sets up the pytest environment * `mod`: module name """ # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: pytest.skip("Kernel requirements are not met") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Master Topology: \n {}".format(TOPOLOGY)) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... tgen = Topogen(CreateTopo, mod.__name__) # ... and here it calls Mininet initialization functions. # get list of daemons needs to be started for this suite. daemons = topo_daemons(tgen, topo) # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen, daemons) # Don"t run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Creating configuration from JSON build_config_from_json(tgen, topo) logger.info("Running setup_module() done")
def setup_module(mod): """ Sets up the pytest environment * `mod`: module name """ global ADDR_TYPES testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... tgen = Topogen(CreateTopo, mod.__name__) # ... and here it calls Mininet initialization functions. # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen) # Creating configuration from JSON build_config_from_json(tgen, topo) # Checking BGP convergence global bgp_convergence # Don"t run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Api call verify whether BGP is converged bgp_convergence = verify_bgp_convergence(tgen, topo) assert bgp_convergence is True, ("setup_module :Failed \n Error:" " {}".format(bgp_convergence)) logger.info("Running setup_module() done")
def setup_module(mod): """ Sets up the pytest environment * `mod`: module name """ # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: pytest.skip("Kernel requirements are not met") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... tgen = Topogen(CreateTopo, mod.__name__) # ... and here it calls Mininet initialization functions. # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen) # Creating configuration from JSON build_config_from_json(tgen, topo) global ADDR_TYPES global BGP_CONVERGENCE ADDR_TYPES = check_address_types() BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format( BGP_CONVERGENCE) logger.info("Running setup_module() done")
def setup_module(mod): """Sets up the pytest environment.""" global topo testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... tgen = Topogen(CreateTopo, mod.__name__) # ... and here it calls Mininet initialization functions. # get list of daemons needs to be started for this suite. daemons = topo_daemons(tgen, topo) # Starting topology, create tmp files which are loaded to routers # to start daemons and then start routers start_topology(tgen, daemons) # Creating configuration from JSON build_config_from_json(tgen, topo) # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Api call verify whether OSPF converged ospf_covergence_ipv4 = verify_ospf_neighbor(tgen, topo) assert ospf_covergence_ipv4 is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence_ipv4) # Api call verify whether OSPF6 converged ospf_covergence_ipv6 = verify_ospf6_neighbor(tgen, topo) assert ospf_covergence_ipv6 is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence_ipv6) logger.info("Running setup_module() done")
def test_ospf_p2p_tc3_p0(request): """OSPF IFSM -Verify state change events on p2p network.""" tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) global topo step("Bring up the base config as per the topology") reset_config_on_routers(tgen) step("Verify that OSPF is subscribed to multi cast services " "(All SPF, all DR Routers).") step("Verify that interface is enabled in ospf.") step("Verify that config is successful.") dut = "r0" input_dict = { "r0": { "links": { "r3": { "ospf": { "mcastMemberOspfAllRouters": True, "ospfEnabled": True } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Delete the ip address") topo1 = { "r0": { "links": { "r3": { "ipv4": topo["routers"]["r0"]["links"]["r3"]["ipv4"], "interface": topo["routers"]["r0"]["links"]["r3"]["interface"], "delete": True, } } } } result = create_interfaces_cfg(tgen, topo1) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Change the ip on the R0 interface") topo_modify_change_ip = deepcopy(topo) intf_ip = topo_modify_change_ip["routers"]["r0"]["links"]["r3"]["ipv4"] topo_modify_change_ip["routers"]["r0"]["links"]["r3"]["ipv4"] = str( IPv4Address(frr_unicode(intf_ip.split("/")[0])) + 3) + "/{}".format( intf_ip.split("/")[1]) build_config_from_json(tgen, topo_modify_change_ip, save_bkup=False) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": { "links": { "r3": { "ospf": { "ipAddress": topo_modify_change_ip["routers"]["r0"]["links"]["r3"] ["ipv4"].split("/")[0], "ipAddressPrefixlen": int(topo_modify_change_ip["routers"]["r0"]["links"] ["r3"]["ipv4"].split("/")[1]), } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Modify the mask on the R0 interface") ip_addr = topo_modify_change_ip["routers"]["r0"]["links"]["r3"]["ipv4"] mask = topo_modify_change_ip["routers"]["r0"]["links"]["r3"]["ipv4"] step("Delete the ip address") topo1 = { "r0": { "links": { "r3": { "ipv4": ip_addr, "interface": topo["routers"]["r0"]["links"]["r3"]["interface"], "delete": True, } } } } result = create_interfaces_cfg(tgen, topo1) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Change the ip on the R0 interface") topo_modify_change_ip = deepcopy(topo) intf_ip = topo_modify_change_ip["routers"]["r0"]["links"]["r3"]["ipv4"] topo_modify_change_ip["routers"]["r0"]["links"]["r3"]["ipv4"] = str( IPv4Address(frr_unicode(intf_ip.split("/")[0])) + 3) + "/{}".format(int(intf_ip.split("/")[1]) + 1) build_config_from_json(tgen, topo_modify_change_ip, save_bkup=False) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": { "links": { "r3": { "ospf": { "ipAddress": topo_modify_change_ip["routers"]["r0"]["links"]["r3"] ["ipv4"].split("/")[0], "ipAddressPrefixlen": int(topo_modify_change_ip["routers"]["r0"]["links"] ["r3"]["ipv4"].split("/")[1]), } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) topo1 = { "r0": { "links": { "r3": { "ipv4": topo_modify_change_ip["routers"]["r0"]["links"]["r3"] ["ipv4"], "interface": topo_modify_change_ip["routers"]["r0"]["links"]["r3"] ["interface"], "delete": True, } } } } result = create_interfaces_cfg(tgen, topo1) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) build_config_from_json(tgen, topo, save_bkup=False) step("Change the area id on the interface") input_dict = { "r0": { "links": { "r3": { "interface": topo["routers"]["r0"]["links"]["r3"]["interface"], "ospf": { "area": "0.0.0.0" }, "delete": True, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) input_dict = { "r0": { "links": { "r3": { "interface": topo["routers"]["r0"]["links"]["r3"]["interface"], "ospf": { "area": "0.0.0.1" }, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": { "links": { "r3": { "ospf": { "area": "0.0.0.1", "ospfEnabled": True } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) input_dict = { "r0": { "links": { "r3": { "interface": topo["routers"]["r0"]["links"]["r3"]["interface"], "ospf": { "area": "0.0.0.1" }, "delete": True, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) input_dict = { "r0": { "links": { "r3": { "interface": topo["routers"]["r0"]["links"]["r3"]["interface"], "ospf": { "area": "0.0.0.0" }, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) # Api call verify whether BGP is converged ospf_covergence = verify_ospf_neighbor(tgen, topo) assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) write_test_footer(tc_name)
def ospfv3_router_id_tc14_p2(request): """OSPF Router ID - Verify OSPF router id changes.""" tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) global topo step(" Bring up the base config as per the topology") reset_config_on_routers(tgen) step("Configure system router id as 1.1.1.1 on R1 , clear ospf router") ospf_rid = {"r0": {"ospf6": {"router_id": "1.1.1.1"}}} result = create_router_ospf(tgen, topo, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) step("configure ospf router id as 1.1.1.2 on R1, clear ospf router") ospf_rid = {"r1": {"ospf6": {"router_id": "1.1.1.2"}}} result = create_router_ospf(tgen, topo, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) topo1 = deepcopy(topo) step("Verify that OSPF takes system router ID as ospf router id.") topo1["routers"]["r0"]["ospf6"]["router_id"] = "1.1.1.1" topo1["routers"]["r1"]["ospf6"]["router_id"] = "1.1.1.2" for rtr in topo["routers"]: clear_ospf(tgen, rtr, ospf="ospf6") ospf_covergence = verify_ospf6_neighbor(tgen, topo1) assert ospf_covergence is True, "OSPF NBRs not up.Failed \n Error:" " {}".format( ospf_covergence) step(" delete ospf router id and clear ospf process.") ospf_rid = {"r0": {"ospf6": {"del_router_id": "1.1.1.1"}}} result = create_router_ospf(tgen, topo, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) ospf_rid = {"r1": {"ospf6": {"del_router_id": "1.1.1.2"}}} result = create_router_ospf(tgen, topo, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) reset_config_on_routers(tgen) step(" Configure R0 R1 R2 with same router ids") ospf_rid = {"r0": {"ospf6": {"router_id": "1.1.1.1"}}} result = create_router_ospf(tgen, topo, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) step("configure ospf router id as 1.1.1.2 on R1, reboot router") ospf_rid = {"r1": {"ospf6": {"router_id": "1.1.1.1"}}} result = create_router_ospf(tgen, topo, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) ospf_covergence = verify_ospf6_neighbor(tgen, topo, expected=False) assert (ospf_covergence is not True), "OSPF NBRs are up.Failed \n Error:" " {}".format( ospf_covergence) topo1 = {} topo1 = deepcopy(topo) for rtr in ["r1", "r2", "r3", "r0"]: topo1["routers"][rtr]["ospf6"].pop("router_id") build_config_from_json(tgen, topo1, save_bkup=False) ospf_covergence = verify_ospf6_neighbor(tgen, topo) assert ospf_covergence is not True, ( "Testcase {} :Failed \n Neighborship " "should not up as no router id is configured. Error: {}".format( tc_name, result)) step("Clear ospf process and check nbrs should not be up.") for rtr in topo["routers"]: clear_ospf(tgen, rtr, ospf="ospf6") ospf_covergence = verify_ospf6_neighbor(tgen, topo) assert ospf_covergence is not True, ( "Testcase {} :Failed \n Neighborship " "should not up as no router id is configured. Error: {}".format( tc_name, result)) topo1 = deepcopy(topo) step("Configure system router id on routers , clear ospf router") ospf_rid = { "r0": { "ospf6": { "router_id": "1.1.1.1" } }, "r1": { "ospf6": { "router_id": "1.1.1.2" } }, "r2": { "ospf6": { "router_id": "1.1.1.3" } }, "r3": { "ospf6": { "router_id": "1.1.1.4" } }, } result = create_router_ospf(tgen, topo1, ospf_rid) assert result is True, "Testcase : Failed \n Error: {}".format(result) topo1["routers"]["r0"]["ospf6"]["router_id"] = "1.1.1.1" topo1["routers"]["r1"]["ospf6"]["router_id"] = "1.1.1.2" topo1["routers"]["r2"]["ospf6"]["router_id"] = "1.1.1.3" topo1["routers"]["r3"]["ospf6"]["router_id"] = "1.1.1.4" ospf_covergence = verify_ospf6_neighbor(tgen, topo1) assert ospf_covergence is True, "OSPF NBRs not up.Failed \n Error:" " {}".format( ospf_covergence) step(" Bring up the base config as per the topology") reset_config_on_routers(tgen) ospf_covergence = verify_ospf6_neighbor(tgen, topo) assert ospf_covergence is True, "OSPF NBRs not up.Failed \n Error:" " {}".format( ospf_covergence) write_test_footer(tc_name)
def test_bgp_with_loopback_interface(request): """ Test BGP with loopback interface Adding keys:value pair "dest_link": "lo" and "source_link": "lo" peer dict of input json file for all router's creating config using loopback interface. Once BGP neighboship is up then verifying BGP convergence """ tgen = get_topogen() if BGP_CONVERGENCE is not True: pytest.skip("skipped because of BGP Convergence failure") # test case name tc_name = request.node.name write_test_header(tc_name) # Creating configuration from JSON reset_config_on_routers(tgen) for routerN in sorted(topo["routers"].keys()): for bgp_neighbor in topo["routers"][routerN]["bgp"]["address_family"]["ipv4"][ "unicast" ]["neighbor"].keys(): # Adding ['source_link'] = 'lo' key:value pair topo["routers"][routerN]["bgp"]["address_family"]["ipv4"]["unicast"][ "neighbor" ][bgp_neighbor]["dest_link"] = { "lo": { "source_link": "lo", } } # Creating configuration from JSON build_config_from_json(tgen, topo) input_dict = { "r1": { "static_routes": [ {"network": "1.0.2.17/32", "next_hop": "10.0.0.2"}, {"network": "1.0.3.17/32", "next_hop": "10.0.0.6"}, ] }, "r2": { "static_routes": [ {"network": "1.0.1.17/32", "next_hop": "10.0.0.1"}, {"network": "1.0.3.17/32", "next_hop": "10.0.0.10"}, ] }, "r3": { "static_routes": [ {"network": "1.0.1.17/32", "next_hop": "10.0.0.5"}, {"network": "1.0.2.17/32", "next_hop": "10.0.0.9"}, {"network": "1.0.4.17/32", "next_hop": "10.0.0.14"}, ] }, "r4": {"static_routes": [{"network": "1.0.3.17/32", "next_hop": "10.0.0.13"}]}, } result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) # Api call verify whether BGP is converged result = verify_bgp_convergence(tgen, topo) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) write_test_footer(tc_name)
def test_modify_route_map_match_set_clauses_p1(request): """ TC13_CHAOS_4: 1.5.13. Verify that Changing route-map configurations(match/set clauses) on the fly it takes immediate effect. """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) build_config_from_json(tgen, topo) if tgen.routers_have_failure(): check_router_status(tgen) for addr_type in ADDR_TYPES: step("Configure route-map to set community attribute for a specific" "prefix on R1 in vrf ISR") input_dict_pf = { "r1": { "prefix_lists": { addr_type: { "pflist_ABC_{}".format(addr_type): [{ "seqid": 10, "network": NETWORK1_1[addr_type], "action": "permit", }] } } } } result = create_prefix_lists(tgen, input_dict_pf) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) input_dict_cl = { "r1": { "bgp_community_lists": [{ "community_type": "expanded", "action": "permit", "name": "COMM", "value": "100:100", }] } } result = create_bgp_community_lists(tgen, input_dict_cl) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: input_dict_rm = { "r1": { "route_maps": { "rmap_XYZ_{}".format(addr_type): [{ "action": "permit", "match": { addr_type: { "prefix_lists": "pflist_ABC_{}".format(addr_type) } }, "set": { "community": { "num": "100:100" } }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Apply this route-map on R1 to vrf ISR while redistributing the" " prefixes into BGP") input_dict_1 = {} DUT = ["r1"] VRFS = ["ISR"] AS_NUM = [100] for dut, vrf, as_num in zip(DUT, VRFS, AS_NUM): temp = {dut: {"bgp": []}} input_dict_1.update(temp) temp[dut]["bgp"].append({ "local_as": as_num, "vrf": vrf, "address_family": { addr_type: { "unicast": { "redistribute": [{ "redist_type": "static", "attribute": { "route-map": "rmap_XYZ_{}".format(addr_type) }, }] } } }, }) result = create_router_bgp(tgen, topo, input_dict_1) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Configure another route-map for filtering the prefixes based on" " community attribute while importing into default vrf") input_dict_rm = { "r1": { "route_maps": { "rmap_IMP_{}".format(addr_type): [{ "action": "permit", "seq_id": 10, "match": { "community_list": { "id": "COMM" } }, "set": { "community": { "num": "none" } }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Apply the route-map while Importing vrf ISR's prefixes into " "default vrf on router R1:") input_dict_isr = {} DUT = ["r1"] VRFS = ["default"] AS_NUM = [100] for dut, vrf, as_num in zip(DUT, VRFS, AS_NUM): temp = {dut: {"bgp": []}} input_dict_isr.update(temp) temp[dut]["bgp"].append({ "local_as": as_num, "vrf": vrf, "address_family": { addr_type: { "unicast": { "import": { "vrf": "ISR" } } } }, }) temp[dut]["bgp"].append({ "local_as": as_num, "vrf": vrf, "address_family": { addr_type: { "unicast": { "import": { "vrf": "route-map rmap_IMP_{}".format(addr_type) } } } }, }) result = create_router_bgp(tgen, topo, input_dict_isr) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Verify on R1 that only prefixes with community value 100:100" "in vrf ISR are imported to vrf default. While importing, the" " community value has been stripped off:") input_routes_r1 = { "r1": { "static_routes": [{ "network": [NETWORK1_1[addr_type]], "vrf": "default" }] } } result = verify_bgp_rib(tgen, addr_type, "r1", input_routes_r1) assert result is True, "Testcase {} : Failed \n Error {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Add set clause in route-map IMP:") input_dict_rm = { "r1": { "route_maps": { "rmap_IMP_{}".format(addr_type): [{ "action": "permit", "seq_id": 10, "match": { "community_list": { "id": "COMM" } }, "set": { "large_community": { "num": "100:100:100" }, "locPrf": 500, "path": { "as_num": "100 100", "as_action": "prepend" }, }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Verify that as we continue adding different attributes " "step-by-step in route-map IMP those attributes gets " "attached to prefixes:") input_routes_r1 = { "r1": { "static_routes": [{ "network": [NETWORK1_1[addr_type]], "vrf": "default" }] } } input_dict_comm = {"largeCommunity": "100:100:100"} result = verify_bgp_community(tgen, addr_type, dut, [NETWORK1_1[addr_type]], input_dict_comm) assert result is True, "Testcase {} : Failed \n Error {}".format( tc_name, result) input_rmap = { "r1": { "route_maps": { "rmap_IMP_{}".format(addr_type): [{ "set": { "locPrf": 500 } }] } } } result = verify_bgp_attributes( tgen, addr_type, "r1", [NETWORK1_1[addr_type]], rmap_name="rmap_IMP_{}".format(addr_type), input_dict=input_rmap, ) assert result is True, "Testcase : Failed \n Error: {}".format( tc_name, result) step("Change community-list to match a different value then " "100:100.") input_dict_cl = { "r1": { "bgp_community_lists": [{ "community_type": "expanded", "action": "permit", "name": "COMM", "value": "100:100", "delete": True, }] } } result = create_bgp_community_lists(tgen, input_dict_cl) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: input_routes_r1 = { "r1": { "static_routes": [{ "network": [NETWORK1_1[addr_type]], "vrf": "default" }] } } result = verify_bgp_rib(tgen, addr_type, "r1", input_routes_r1, expected=False) assert ( result is not True ), "Testcase {} : Failed \n Error : Routes are still " "present {}".format( tc_name, result) write_test_footer(tc_name)
def test_bgp_best_path_with_dynamic_import_p0(request): """ TC6_FUNC_6: 1.5.6. Verify BGP best path selection algorithm works fine when routes are imported from ISR to default vrf and vice versa. """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) build_config_from_json(tgen, topo) if tgen.routers_have_failure(): check_router_status(tgen) for addr_type in ADDR_TYPES: step("Redistribute configured static routes into BGP process" " on R1/R2 and R3") input_dict_1 = {} DUT = ["r1", "r2", "r3", "r4"] VRFS = ["ISR", "ISR", "default", "default"] AS_NUM = [100, 100, 300, 400] for dut, vrf, as_num in zip(DUT, VRFS, AS_NUM): temp = {dut: {"bgp": []}} input_dict_1.update(temp) temp[dut]["bgp"].append({ "local_as": as_num, "vrf": vrf, "address_family": { addr_type: { "unicast": { "redistribute": [{ "redist_type": "static" }] } } }, }) result = create_router_bgp(tgen, topo, input_dict_1) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Import from default vrf into vrf ISR on R1 and R2 as below") input_dict_vrf = {} DUT = ["r1", "r2"] VRFS = ["ISR", "ISR"] AS_NUM = [100, 100] for dut, vrf, as_num in zip(DUT, VRFS, AS_NUM): temp = {dut: {"bgp": []}} input_dict_vrf.update(temp) temp[dut]["bgp"].append({ "local_as": as_num, "vrf": vrf, "address_family": { addr_type: { "unicast": { "import": { "vrf": "default" } } } }, }) result = create_router_bgp(tgen, topo, input_dict_vrf) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) input_dict_default = {} DUT = ["r1", "r2"] VRFS = ["default", "default"] AS_NUM = [100, 100] for dut, vrf, as_num in zip(DUT, VRFS, AS_NUM): temp = {dut: {"bgp": []}} input_dict_default.update(temp) temp[dut]["bgp"].append({ "local_as": as_num, "vrf": vrf, "address_family": { addr_type: { "unicast": { "import": { "vrf": "ISR" } } } }, }) result = create_router_bgp(tgen, topo, input_dict_default) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Verify ECMP/Next-hop/Imported routes Vs Locally originated " "routes/eBGP routes vs iBGP routes --already covered in almost" " all tests") for addr_type in ADDR_TYPES: step("Verify Pre-emption") input_routes_r3 = { "r3": { "static_routes": [{ "network": [NETWORK3_3[addr_type]] }] } } intf_r3_r1 = topo["routers"]["r3"]["links"]["r1-link1"]["interface"] intf_r4_r1 = topo["routers"]["r4"]["links"]["r1-link1"]["interface"] if addr_type == "ipv6" and "link_local" in PREFERRED_NEXT_HOP: nh_r3_r1 = get_frr_ipv6_linklocal(tgen, "r3", intf=intf_r3_r1) nh_r4_r1 = get_frr_ipv6_linklocal(tgen, "r4", intf=intf_r4_r1) else: nh_r3_r1 = topo["routers"]["r3"]["links"]["r1-link1"][ addr_type].split("/")[0] nh_r4_r1 = topo["routers"]["r4"]["links"]["r1-link1"][ addr_type].split("/")[0] result = verify_bgp_rib(tgen, addr_type, "r1", input_routes_r3, next_hop=[nh_r4_r1]) assert result is True, "Testcase {} : Failed \n Error {}".format( tc_name, result) step("Shutdown interface connected to r1 from r4:") shutdown_bringup_interface(tgen, "r4", intf_r4_r1, False) for addr_type in ADDR_TYPES: input_routes_r3 = { "r3": { "static_routes": [{ "network": [NETWORK3_3[addr_type]] }] } } intf_r3_r1 = topo["routers"]["r3"]["links"]["r1-link1"]["interface"] intf_r4_r1 = topo["routers"]["r4"]["links"]["r1-link1"]["interface"] if addr_type == "ipv6" and "link_local" in PREFERRED_NEXT_HOP: nh_r3_r1 = get_frr_ipv6_linklocal(tgen, "r3", intf=intf_r3_r1) nh_r4_r1 = get_frr_ipv6_linklocal(tgen, "r4", intf=intf_r4_r1) else: nh_r3_r1 = topo["routers"]["r3"]["links"]["r1-link1"][ addr_type].split("/")[0] nh_r4_r1 = topo["routers"]["r4"]["links"]["r1-link1"][ addr_type].split("/")[0] step("Verify next-hop is changed") result = verify_bgp_rib(tgen, addr_type, "r1", input_routes_r3, next_hop=[nh_r3_r1]) assert result is True, "Testcase {} : Failed \n Error {}".format( tc_name, result) step("Bringup interface connected to r1 from r4:") shutdown_bringup_interface(tgen, "r4", intf_r4_r1, True) for addr_type in ADDR_TYPES: input_routes_r3 = { "r3": { "static_routes": [{ "network": [NETWORK3_3[addr_type]] }] } } intf_r3_r1 = topo["routers"]["r3"]["links"]["r1-link1"]["interface"] intf_r4_r1 = topo["routers"]["r4"]["links"]["r1-link1"]["interface"] if addr_type == "ipv6" and "link_local" in PREFERRED_NEXT_HOP: nh_r3_r1 = get_frr_ipv6_linklocal(tgen, "r3", intf=intf_r3_r1) nh_r4_r1 = get_frr_ipv6_linklocal(tgen, "r4", intf=intf_r4_r1) else: nh_r3_r1 = topo["routers"]["r3"]["links"]["r1-link1"][ addr_type].split("/")[0] nh_r4_r1 = topo["routers"]["r4"]["links"]["r1-link1"][ addr_type].split("/")[0] step("Verify next-hop is not chnaged aftr shutdown:") result = verify_bgp_rib(tgen, addr_type, "r1", input_routes_r3, next_hop=[nh_r3_r1]) assert result is True, "Testcase {} : Failed \n Error {}".format( tc_name, result) step("Active-Standby scenario(as-path prepend and Local pref)") for addr_type in ADDR_TYPES: step("Create prefix-list") input_dict_pf = { "r1": { "prefix_lists": { addr_type: { "pf_ls_{}".format(addr_type): [{ "seqid": 10, "network": NETWORK3_4[addr_type], "action": "permit", }] } } } } result = create_prefix_lists(tgen, input_dict_pf) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Create route-map to match prefix-list and set localpref 500") input_dict_rm = { "r1": { "route_maps": { "rmap_PATH1_{}".format(addr_type): [{ "action": "permit", "seq_id": 10, "match": { addr_type: { "prefix_lists": "pf_ls_{}".format(addr_type) } }, "set": { "locPrf": 500 }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Create route-map to match prefix-list and set localpref 600") input_dict_rm = { "r1": { "route_maps": { "rmap_PATH2_{}".format(addr_type): [{ "action": "permit", "seq_id": 20, "match": { addr_type: { "prefix_lists": "pf_ls_{}".format(addr_type) } }, "set": { "locPrf": 600 }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) input_dict_rma = { "r1": { "bgp": [{ "local_as": "100", "address_family": { addr_type: { "unicast": { "neighbor": { "r3": { "dest_link": { "r1-link1": { "route_maps": [{ "name": "rmap_PATH1_{}".format( addr_type), "direction": "in", }] } } }, "r4": { "dest_link": { "r1-link1": { "route_maps": [{ "name": "rmap_PATH2_{}".format( addr_type), "direction": "in", }] } } }, } } } }, }] } } result = create_router_bgp(tgen, topo, input_dict_rma) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) dut = "r1" attribute = "locPrf" for addr_type in ADDR_TYPES: step("Verify bestpath is installed as per highest localpref") input_routes_r3 = { "r3": { "static_routes": [{ "network": [NETWORK3_3[addr_type], NETWORK3_4[addr_type]] }] } } result = verify_best_path_as_per_bgp_attribute(tgen, addr_type, dut, input_routes_r3, attribute) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Create route-map to match prefix-list and set localpref 700") input_dict_rm = { "r1": { "route_maps": { "rmap_PATH1_{}".format(addr_type): [{ "action": "permit", "seq_id": 10, "match": { addr_type: { "prefix_lists": "pf_ls_{}".format(addr_type) } }, "set": { "locPrf": 700 }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Verify bestpath is changed as per highest localpref") input_routes_r3 = { "r3": { "static_routes": [{ "network": [NETWORK3_3[addr_type], NETWORK3_4[addr_type]] }] } } result = verify_best_path_as_per_bgp_attribute(tgen, addr_type, dut, input_routes_r3, attribute) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) for addr_type in ADDR_TYPES: step("Create route-map to match prefix-list and set as-path prepend") input_dict_rm = { "r1": { "route_maps": { "rmap_PATH2_{}".format(addr_type): [{ "action": "permit", "seq_id": 20, "match": { addr_type: { "prefix_lists": "pf_ls_{}".format(addr_type) } }, "set": { "localpref": 700, "path": { "as_num": "111", "as_action": "prepend" }, }, }] } } } result = create_route_maps(tgen, input_dict_rm) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) attribute = "path" for addr_type in ADDR_TYPES: step("Verify bestpath is changed as per shortest as-path") input_routes_r3 = { "r3": { "static_routes": [{ "network": [NETWORK3_3[addr_type], NETWORK3_4[addr_type]] }] } } result = verify_best_path_as_per_bgp_attribute(tgen, addr_type, dut, input_routes_r3, attribute) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) write_test_footer(tc_name)
def setup_module(mod): """ Sets up the pytest environment. * `mod`: module name """ global NEXT_HOPS, INTF_LIST_R3, INTF_LIST_R2, TEST_STATIC global ADDR_TYPES # Required linux kernel version for this suite to run. result = required_linux_kernel_version("4.15") if result is not True: pytest.skip("Kernel requirements are not met") testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... tgen = Topogen(CreateTopo, mod.__name__) # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen) # Creating configuration from JSON build_config_from_json(tgen, topo) # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) # tgen.mininet_cli() # Api call verify whether BGP is converged ADDR_TYPES = check_address_types() for addr_type in ADDR_TYPES: BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error:" " {}".format( BGP_CONVERGENCE) link_data = [ val for links, val in topo["routers"]["r2"]["links"].items() if "r3" in links ] for adt in ADDR_TYPES: NEXT_HOPS[adt] = [val[adt].split("/")[0] for val in link_data] if adt == "ipv4": NEXT_HOPS[adt] = sorted(NEXT_HOPS[adt], key=lambda x: int(x.split(".")[2])) elif adt == "ipv6": NEXT_HOPS[adt] = sorted(NEXT_HOPS[adt], key=lambda x: int(x.split(":")[-3], 16)) INTF_LIST_R2 = [val["interface"].split("/")[0] for val in link_data] INTF_LIST_R2 = sorted(INTF_LIST_R2, key=lambda x: int(x.split("eth")[1])) link_data = [ val for links, val in topo["routers"]["r3"]["links"].items() if "r2" in links ] INTF_LIST_R3 = [val["interface"].split("/")[0] for val in link_data] INTF_LIST_R3 = sorted(INTF_LIST_R3, key=lambda x: int(x.split("eth")[1])) # STATIC_ROUTE = True logger.info("Running setup_module() done")
def test_ospf_lan_tc1_p0(request): """ OSPF Hello protocol - Verify DR BDR Elections """ tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) global topo step("Bring up the base config as per the topology") reset_config_on_routers(tgen) step("Verify that DR BDR DRother are elected in the LAN.") input_dict = { "r0": { "ospf": { "neighbors": { "r1": { "state": "Full", "role": "DR" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r0" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Verify that all the routers are in FULL state with DR and BDR " "in the topology") input_dict = { "r1": { "ospf": { "neighbors": { "r0": { "state": "Full", "role": "Backup" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r1" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Configure DR pririty 100 on R0 and clear ospf neighbors " "on all the routers.") input_dict = { "r0": { "links": { "s1": { "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "ospf": { "priority": 100 }, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Clear ospf neighbours in all routers") for rtr in ["r0", "r1", "r2", "r3"]: clear_ospf(tgen, rtr) step("Verify that DR election is triggered and R0 is elected as DR") input_dict = { "r0": { "ospf": { "neighbors": { "r1": { "state": "Full", "role": "Backup" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r0" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Configure DR pririty 150 on R0 and clear ospf neighbors " "on all the routers.") input_dict = { "r0": { "links": { "s1": { "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "ospf": { "priority": 150 }, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Clear ospf neighbours in all routers") for rtr in ["r0", "r1"]: clear_ospf(tgen, rtr) step("Verify that DR election is triggered and R0 is elected as DR") input_dict = { "r0": { "ospf": { "neighbors": { "r1": { "state": "Full", "role": "Backup" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r0" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Configure DR priority 0 on R0 & Clear ospf nbrs on all the routers") input_dict = { "r0": { "links": { "s1": { "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "ospf": { "priority": 0 }, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Clear ospf neighbours in all routers") for rtr in ["r1"]: clear_ospf(tgen, rtr) step("Verify that DR election is triggered and R0 is elected as DRother") input_dict = { "r0": { "ospf": { "neighbors": { "r1": { "state": "Full", "role": "DR" }, "r2": { "state": "2-Way", "role": "DROther" }, "r3": { "state": "2-Way", "role": "DROther" }, } } } } dut = "r0" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Configure DR priority to default on R0 and Clear ospf neighbors" " on all the routers") input_dict = { "r0": { "links": { "s1": { "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "ospf": { "priority": 100 }, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Clear ospf neighbours in all routers") for rtr in ["r0", "r1"]: clear_ospf(tgen, rtr) step("Verify that DR election is triggered and R0 is elected as DR") input_dict = { "r0": { "ospf": { "neighbors": { "r1": { "state": "Full", "role": "Backup" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r0" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Shut interface on R0") dut = "r0" intf = topo["routers"]["r0"]["links"]["s1"]["interface"] shutdown_bringup_interface(tgen, dut, intf, False) result = verify_ospf_neighbor(tgen, topo, dut, lan=True, expected=False) assert ( result is not True ), "Testcase {} : Failed \n " "r0: OSPF neighbors-hip is up \n Error: {}".format( tc_name, result) step("No Shut interface on R0") dut = "r0" intf = topo["routers"]["r0"]["links"]["s1"]["interface"] shutdown_bringup_interface(tgen, dut, intf, True) input_dict = { "r0": { "ospf": { "neighbors": { "r1": { "state": "Full", "role": "DR" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } step("Verify that after no shut ospf neighbours are full on R0.") result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Clear ospf on DR router in the topology.") clear_ospf(tgen, "r0") step("Verify that BDR is getting promoted to DR after clear.") step("Verify that all the nbrs are in FULL state with the elected DR.") result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Change the ip on LAN intf on R0 to other ip from the same subnet.") topo_modify_change_ip = deepcopy(topo) intf_ip = topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] = str( IPv4Address(frr_unicode(intf_ip.split("/")[0])) + 3) + "/{}".format( intf_ip.split("/")[1]) build_config_from_json(tgen, topo_modify_change_ip, save_bkup=False) step("Verify that OSPF is in FULL state with other routers with " "newly configured IP.") result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Change the ospf router id on the R0 and clear ip ospf interface.") change_rid = {"r0": {"ospf": {"router_id": "100.1.1.100"}}} result = create_router_ospf(tgen, topo, change_rid) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) topo["routers"]["r0"]["ospf"]["router_id"] = "100.1.1.100" step("Reload the FRR router") stop_router(tgen, "r0") start_router(tgen, "r0") step("Verify that OSPF is in FULL state with other routers with" " newly configured router id.") input_dict = { "r1": { "ospf": { "neighbors": { "r0": { "state": "Full", "role": "Backup" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r1" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) step("Reconfigure the original router id and clear ip ospf interface.") change_rid = {"r0": {"ospf": {"router_id": "100.1.1.0"}}} result = create_router_ospf(tgen, topo, change_rid) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) topo["routers"]["r0"]["ospf"]["router_id"] = "100.1.1.0" step("Reload the FRR router") # stop/start -> restart FRR router and verify stop_router(tgen, "r0") start_router(tgen, "r0") step("Verify that OSPF is enabled with router id previously configured.") input_dict = { "r1": { "ospf": { "neighbors": { "r0": { "state": "Full", "role": "Backup" }, "r2": { "state": "Full", "role": "DROther" }, "r3": { "state": "Full", "role": "DROther" }, } } } } dut = "r1" result = verify_ospf_neighbor(tgen, topo, dut, input_dict, lan=True) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result) write_test_footer(tc_name)
def test_bgp_no_advertise_community_p0(request): """ Verify routes are not advertised when NO-ADVERTISE Community is applied """ tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() reset_config_on_routers(tgen) # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) NEXT_HOP_IP = { "ipv4": topo["routers"]["r0"]["links"]["r1"]["ipv4"].split("/")[0], "ipv6": topo["routers"]["r0"]["links"]["r1"]["ipv6"].split("/")[0], } # configure static routes dut = "r3" protocol = "bgp" for addr_type in ADDR_TYPES: # Enable static routes input_dict = { "r1": { "static_routes": [ {"network": NETWORK[addr_type], "next_hop": NEXT_HOP_IP[addr_type]} ] } } logger.info("Configure static routes") result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step("configure redistribute static and connected in Router BGP " "in R1") input_dict_2 = { "r1": { "bgp": { "address_family": { addr_type: { "unicast": { "redistribute": [ {"redist_type": "static"}, {"redist_type": "connected"}, ] } } } } } } result = create_router_bgp(tgen, topo, input_dict_2) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "BGP neighbors are up, static and connected route advertised from" " R1 are present on R2 BGP table and RIB using show ip bgp and " " show ip route" ) step( "Static and connected route advertised from R1 are present on R3" " BGP table and RIB using show ip bgp and show ip route" ) dut = "r3" protocol = "bgp" result = verify_bgp_rib(tgen, addr_type, dut, input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) result = verify_rib(tgen, addr_type, dut, input_dict, protocol=protocol) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step("Configure prefix list P1 on R2 to permit route coming from R1") # Create ip prefix list input_dict_2 = { "r2": { "prefix_lists": { addr_type: { "pf_list_1_{}".format(addr_type): [ {"seqid": 10, "network": "any", "action": "permit"} ] } } } } result = create_prefix_lists(tgen, input_dict_2) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) # Create route map input_dict_3 = { "r2": { "route_maps": { "rmap_match_pf_1_{}".format(addr_type): [ { "action": "permit", "seq_id": "5", "match": { addr_type: {"prefix_lists": "pf_list_1_" + addr_type} }, "set": {"community": {"num": "no-advertise"}}, } ] } } } result = create_route_maps(tgen, input_dict_3) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "Apply route-map RM1 on R2, R2 to R3 BGP neighbor with no" " advertise community" ) # Configure neighbor for route map input_dict_4 = { "r2": { "bgp": { "address_family": { addr_type: { "unicast": { "neighbor": { "r1": { "dest_link": { "r2": { "route_maps": [ { "name": "rmap_match_pf_1_" + addr_type, "direction": "in", } ] } } } } } } } } } } result = create_router_bgp(tgen, topo, input_dict_4) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "After advertising no advertise community to BGP neighbor " "static and connected router got removed from R3 verify using " "show ip bgp & show ip route" ) result = verify_bgp_rib(tgen, addr_type, dut, input_dict, expected=False) assert result is not True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) result = verify_rib( tgen, addr_type, dut, input_dict, protocol=protocol, expected=False ) assert result is not True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) step("Remove and Add no advertise community") # Configure neighbor for route map input_dict_4 = { "r2": { "bgp": { "address_family": { addr_type: { "unicast": { "neighbor": { "r1": { "dest_link": { "r2": { "route_maps": [ { "name": "rmap_match_pf_1_" + addr_type, "direction": "in", "delete": True, } ] } } } } } } } } } } result = create_router_bgp(tgen, topo, input_dict_4) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "After removing no advertise community from BGP neighbor " "static and connected router got advertised to R3 and " "removing route-map, verify route using show ip bgp" " and show ip route" ) result = verify_bgp_rib(tgen, addr_type, dut, input_dict) assert result is True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) result = verify_rib(tgen, addr_type, dut, input_dict, protocol=protocol) assert result is True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) step("Repeat above steps when IBGP nbr configured between R1, R2 & R2, R3") topo1 = deepcopy(topo) topo1["routers"]["r1"]["bgp"]["local_as"] = "100" topo1["routers"]["r2"]["bgp"]["local_as"] = "100" topo1["routers"]["r3"]["bgp"]["local_as"] = "100" for rtr in ["r1", "r2", "r3"]: if "bgp" in topo1["routers"][rtr].keys(): delete_bgp = {rtr: {"bgp": {"delete": True}}} result = create_router_bgp(tgen, topo1, delete_bgp) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) config_bgp = { rtr: {"bgp": {"local_as": topo1["routers"][rtr]["bgp"]["local_as"]}} } result = create_router_bgp(tgen, topo1, config_bgp) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) build_config_from_json(tgen, topo1, save_bkup=False) step("verify bgp convergence before starting test case") bgp_convergence = verify_bgp_convergence(tgen, topo1) assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format( tc_name, bgp_convergence ) # configure static routes dut = "r3" protocol = "bgp" for addr_type in ADDR_TYPES: # Enable static routes input_dict = { "r1": { "static_routes": [ {"network": NETWORK[addr_type], "next_hop": NEXT_HOP_IP[addr_type]} ] } } logger.info("Configure static routes") result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step("configure redistribute static and connected in Router " "BGP in R1") input_dict_2 = { "r1": { "bgp": { "address_family": { addr_type: { "unicast": { "redistribute": [ {"redist_type": "static"}, {"redist_type": "connected"}, ] } } } } } } result = create_router_bgp(tgen, topo, input_dict_2) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "BGP neighbors are up, static and connected route advertised from" " R1 are present on R2 BGP table and RIB using show ip bgp and " " show ip route" ) step( "Static and connected route advertised from R1 are present on R3" " BGP table and RIB using show ip bgp and show ip route" ) dut = "r2" protocol = "bgp" result = verify_bgp_rib(tgen, addr_type, dut, input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) result = verify_rib(tgen, addr_type, dut, input_dict, protocol=protocol) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step("Configure prefix list P1 on R2 to permit route coming from R1") # Create ip prefix list input_dict_2 = { "r2": { "prefix_lists": { addr_type: { "pf_list_1_{}".format(addr_type): [ {"seqid": 10, "network": "any", "action": "permit"} ] } } } } result = create_prefix_lists(tgen, input_dict_2) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) # Create route map input_dict_3 = { "r2": { "route_maps": { "rmap_match_pf_1_{}".format(addr_type): [ { "action": "permit", "seq_id": "5", "match": { addr_type: {"prefix_lists": "pf_list_1_" + addr_type} }, "set": {"community": {"num": "no-advertise"}}, } ] } } } result = create_route_maps(tgen, input_dict_3) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "Apply route-map RM1 on R2, R2 to R3 BGP neighbor with no" " advertise community" ) # Configure neighbor for route map input_dict_4 = { "r2": { "bgp": { "address_family": { addr_type: { "unicast": { "neighbor": { "r1": { "dest_link": { "r2": { "route_maps": [ { "name": "rmap_match_pf_1_" + addr_type, "direction": "in", } ] } } } } } } } } } } result = create_router_bgp(tgen, topo, input_dict_4) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "After advertising no advertise community to BGP neighbor " "static and connected router got removed from R3 verify using " "show ip bgp & show ip route" ) result = verify_bgp_rib(tgen, addr_type, dut, input_dict) assert result is True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) result = verify_rib(tgen, addr_type, dut, input_dict, protocol=protocol) assert result is True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) step("Remove and Add no advertise community") # Configure neighbor for route map input_dict_4 = { "r2": { "bgp": { "address_family": { addr_type: { "unicast": { "neighbor": { "r1": { "dest_link": { "r2": { "route_maps": [ { "name": "rmap_match_pf_1_" + addr_type, "direction": "in", "delete": True, } ] } } } } } } } } } } result = create_router_bgp(tgen, topo, input_dict_4) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "After removing no advertise community from BGP neighbor " "static and connected router got advertised to R3 and " "removing route verify using show ip bgp and " " show ip route" ) result = verify_bgp_rib(tgen, addr_type, dut, input_dict) assert result is True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) result = verify_rib(tgen, addr_type, dut, input_dict, protocol=protocol) assert result is True, "Testcase {} : Failed \n " " Routes still present in R3 router. Error: {}".format(tc_name, result) write_test_footer(tc_name)
def test_ospf_authentication_md5_tc29_p1(request): """ OSPF Authentication - Verify ospf authentication with MD5 authentication. """ tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() global topo step("Bring up the base config.") reset_config_on_routers(tgen) step("Configure ospf with on R1 and R2, enable ospf on R1 interface " "connected to R2 with message-digest authentication using ip " "ospf authentication message-digest cmd.") r1_ospf_auth = { "r1": { "links": { "r2": { "ospf": { "authentication": "message-digest", "authentication-key": "ospf", "message-digest-key": "10", } } } } } result = config_ospf_interface(tgen, topo, r1_ospf_auth) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Verify that the neighbour is not FULL between R1 and R2.") # wait for dead time expiry. sleep(6) dut = "r1" ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut, expected=False, attempts=3) assert ospf_covergence is not True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) step("On R2 enable ospf on interface with message-digest authentication" " using ip ospf authentication message-digest password cmd.") r2_ospf_auth = { "r2": { "links": { "r1": { "ospf": { "authentication": "message-digest", "authentication-key": "ospf", "message-digest-key": "10", } } } } } result = config_ospf_interface(tgen, topo, r2_ospf_auth) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Verify that the neighbour is FULL between R1 and R2 " "using show ip ospf neighbor cmd.") dut = "r2" ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut) assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) step("Disable message-digest authentication on R2 using no ip ospf " "authentication message-digest password cmd.") r2_ospf_auth = { "r2": { "links": { "r1": { "ospf": { "authentication": "message-digest", "authentication-key": "ospf", "message-digest-key": "10", "del_action": True, } } } } } result = config_ospf_interface(tgen, topo, r2_ospf_auth) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Verify on R1 ,nbr is deleted for R2 after dead interval expiry") # wait till the dead timer expiry sleep(6) dut = "r2" ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut, expected=False, attempts=5) assert ospf_covergence is not True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) step("Again On R2 enable ospf on interface with message-digest auth") r2_ospf_auth = { "r2": { "links": { "r1": { "ospf": { "authentication": "message-digest", "authentication-key": "ospf", "message-digest-key": "10", } } } } } result = config_ospf_interface(tgen, topo, r2_ospf_auth) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Verify that the neighbour is FULL between R1 and R2 using" " show ip ospf neighbor cmd.") dut = "r2" ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut) assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) step("Shut no shut interface on R1") dut = "r1" intf = topo["routers"]["r1"]["links"]["r2"]["interface"] shutdown_bringup_interface(tgen, dut, intf, False) dut = "r2" step("Verify that the neighbour is not FULL between R1 and R2 using " "show ip ospf neighbor cmd.") ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut, expected=False) assert ospf_covergence is not True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) dut = "r1" shutdown_bringup_interface(tgen, dut, intf, True) step("Verify that the neighbour is FULL between R1 and R2 using " "show ip ospf neighbor cmd.") dut = "r2" ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut) assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) step("Change Ip address on R1 and R2") topo_modify_change_ip = deepcopy(topo) intf_ip = topo_modify_change_ip["routers"]["r1"]["links"]["r2"]["ipv4"] topo_modify_change_ip["routers"]["r1"]["links"]["r2"]["ipv4"] = str( IPv4Address(unicode(intf_ip.split("/")[0])) + 3) + "/{}".format( intf_ip.split("/")[1]) build_config_from_json(tgen, topo_modify_change_ip, save_bkup=False) reset_config_on_routers(tgen, routerName="r1") dut = "r1" intf = topo["routers"]["r1"]["links"]["r2"]["interface"] shutdown_bringup_interface(tgen, dut, intf, False) shutdown_bringup_interface(tgen, dut, intf, True) clear_ospf(tgen, "r1") r1_ospf_auth = { "r1": { "links": { "r2": { "ospf": { "authentication": "message-digest", "authentication-key": "ospf", "message-digest-key": "10", } } } } } result = config_ospf_interface(tgen, topo, r1_ospf_auth) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("Verify that the neighbour is FULL between R1 and R2 with new " "ip address using show ip ospf ") dut = "r1" ospf_covergence = verify_ospf_neighbor(tgen, topo, dut=dut) assert ospf_covergence is True, "setup_module :Failed \n Error:" " {}".format( ospf_covergence) write_test_footer(tc_name)
def test_ibgp_loopback_nbr_p1(request): """ Verify Extended capability nexthop with loopback interface. Verify IPv4 routes are advertised and withdrawn when IPv6 IBGP session established using loopback interface """ tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) global topo topo1 = deepcopy(topo) reset_config_on_routers(tgen) step("Configure IPv6 global address between R1 and R2") step( "Configure loopback on R1 and R2 and establish EBGP session " "between R1 and R2 over loopback global ip" ) step("Configure static route on R1 and R2 for loopback reachability") step("Enable cap ext nh on r1 and r2 and activate in ipv4 addr family") for routerN in ["r1", "r2"]: for addr_type in ["ipv6"]: for bgp_neighbor in topo1["routers"][routerN]["bgp"]["address_family"][ addr_type ]["unicast"]["neighbor"].keys(): # Adding ['source_link'] = 'lo' key:value pair if bgp_neighbor == "r1" or bgp_neighbor == "r2": topo1["routers"][routerN]["bgp"]["address_family"][addr_type][ "unicast" ]["neighbor"][bgp_neighbor]["dest_link"] = { "lo": { "source_link": "lo", "ebgp_multihop": 2, "capability": "extended-nexthop", "activate": "ipv4", } } # Creating configuration from JSON build_config_from_json(tgen, topo1, save_bkup=False) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv6": { "unicast": { "neighbor": { "r2": { "dest_link": {"r1-link0": {"deactivate": "ipv6"}} } } } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) configure_bgp_on_r2 = { "r2": { "bgp": { "address_family": { "ipv6": { "unicast": { "neighbor": { "r1": { "dest_link": {"r2-link0": {"deactivate": "ipv6"}} } } } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r2) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv6": { "unicast": { "neighbor": { "r2": { "dest_link": {"r1-link0": {"deactivate": "ipv4"}} } } } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) configure_bgp_on_r2 = { "r2": { "bgp": { "address_family": { "ipv6": { "unicast": { "neighbor": { "r1": { "dest_link": {"r2-link0": {"deactivate": "ipv4"}} } } } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r2) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) r2_lo_v4 = topo["routers"]["r2"]["links"]["lo"]["ipv4"] r2_lo_v6 = topo["routers"]["r2"]["links"]["lo"]["ipv6"] r1_lo_v4 = topo["routers"]["r1"]["links"]["lo"]["ipv4"] r1_lo_v6 = topo["routers"]["r1"]["links"]["lo"]["ipv6"] r1_r2_intf = topo["routers"]["r1"]["links"]["r2-link0"]["interface"] r2_r1_intf = topo["routers"]["r2"]["links"]["r1-link0"]["interface"] r1_r2_v6_nh = topo["routers"]["r1"]["links"]["r2-link0"]["ipv6"].split("/")[0] r2_r1_v6_nh = topo["routers"]["r2"]["links"]["r1-link0"]["ipv6"].split("/")[0] ipv4_list = [("r1", r1_r2_intf, [r2_lo_v4]), ("r2", r2_r1_intf, [r1_lo_v4])] ipv6_list = [ ("r1", r1_r2_intf, [r2_lo_v6], r2_r1_v6_nh), ("r2", r2_r1_intf, [r1_lo_v6], r1_r2_v6_nh), ] for dut, intf, loop_addr in ipv4_list: result = addKernelRoute(tgen, dut, intf, loop_addr) # assert result is True, "Testcase {}:Failed \n Error: {}". \ # format(tc_name, result) for dut, intf, loop_addr, next_hop in ipv6_list: result = addKernelRoute(tgen, dut, intf, loop_addr, next_hop) # assert result is True, "Testcase {}:Failed \n Error: {}". \ # format(tc_name, result) r2_lo_v4 = topo["routers"]["r2"]["links"]["lo"]["ipv4"] r2_lo_v6 = topo["routers"]["r2"]["links"]["lo"]["ipv6"] r1_lo_v4 = topo["routers"]["r1"]["links"]["lo"]["ipv4"] r1_lo_v6 = topo["routers"]["r1"]["links"]["lo"]["ipv6"] r1_r2_intf = topo["routers"]["r1"]["links"]["r2-link0"]["interface"] r2_r1_intf = topo["routers"]["r2"]["links"]["r1-link0"]["interface"] r1_r2_v6_nh = topo["routers"]["r1"]["links"]["r2-link0"]["ipv6"].split("/")[0] r2_r1_v6_nh = topo["routers"]["r2"]["links"]["r1-link0"]["ipv6"].split("/")[0] r1_r2_v4_nh = topo["routers"]["r1"]["links"]["r2-link0"]["ipv4"].split("/")[0] r2_r1_v4_nh = topo["routers"]["r2"]["links"]["r1-link0"]["ipv4"].split("/")[0] input_dict = { "r1": { "static_routes": [ {"network": r2_lo_v4, "next_hop": r2_r1_v4_nh}, {"network": r2_lo_v6, "next_hop": r2_r1_v6_nh}, ] }, "r2": { "static_routes": [ {"network": r1_lo_v4, "next_hop": r1_r2_v4_nh}, {"network": r1_lo_v6, "next_hop": r1_r2_v6_nh}, ] }, } result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) # Api call verify whether BGP is converged result = verify_bgp_convergence(tgen, topo1) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Enable cap ext nh on r1 and r2 and activate in ipv4 addr family") configure_bgp_on_r1 = { "r1": { "default_ipv4_unicast": False, "bgp": { "address_family": { "ipv6": { "unicast": { "neighbor": { "r2": { "dest_link": { "lo": { "activate": "ipv4", "capability": "extended-nexthop", } } } } } } } }, } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) configure_bgp_on_r2 = { "r2": { "default_ipv4_unicast": False, "bgp": { "address_family": { "ipv6": { "unicast": { "neighbor": { "r1": { "dest_link": { "lo": { "activate": "ipv4", "capability": "extended-nexthop", } } } } } } } }, } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r2) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step("Verify bgp convergence.") bgp_convergence = verify_bgp_convergence(tgen, topo1) assert bgp_convergence is True, "Testcase {} : Failed \n Error: {}".format( tc_name, bgp_convergence ) step("Configure 2 IPv4 static" " routes on R1, Nexthop as different links of R0") for rte in range(0, NO_OF_RTES): # Create Static routes input_dict = { "r1": { "static_routes": [ { "network": NETWORK["ipv4"][rte], "no_of_ip": 1, "next_hop": NEXT_HOP["ipv4"][rte], } ] } } result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) step( "Advertise static routes from IPv4 unicast family and IPv6 " "unicast family respectively from R1 using red static cmd " "Advertise loopback from IPv4 unicast family using network command " "from R1" ) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv4": { "unicast": { "redistribute": [{"redist_type": "static"}], "advertise_networks": [ {"network": NETWORK_CMD_IP, "no_of_network": 1} ], } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step( "IPv4 routes advertised using static and network command are " " received on R2 BGP and routing table , " "verify using show ip bgp, show ip route for IPv4 routes ." ) gllip = (topo1["routers"]["r1"]["links"]["lo"]["ipv6"].split("/")[0]).lower() assert gllip is not None, "Testcase {} : Failed \n Error: {}".format( tc_name, result ) dut = "r2" protocol = "bgp" verify_nh_for_static_rtes = { "r1": { "static_routes": [ { "network": NETWORK["ipv4"][0], "no_of_ip": NO_OF_RTES, "next_hop": gllip, } ] } } bgp_rib = verify_bgp_rib( tgen, "ipv4", dut, verify_nh_for_static_rtes, next_hop=gllip ) assert bgp_rib is True, "Testcase {} : Failed \n Error: {}".format(tc_name, bgp_rib) result = verify_rib( tgen, "ipv4", dut, verify_nh_for_static_rtes, next_hop=gllip, protocol=protocol ) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) verify_nh_for_nw_rtes = { "r1": { "static_routes": [ {"network": NETWORK_CMD_IP, "no_of_ip": 1, "next_hop": gllip} ] } } bgp_rib = verify_bgp_rib(tgen, "ipv4", dut, verify_nh_for_nw_rtes, next_hop=gllip) assert bgp_rib is True, "Testcase {} : Failed \n Error: {}".format(tc_name, bgp_rib) result = verify_rib( tgen, "ipv4", dut, verify_nh_for_nw_rtes, next_hop=gllip, protocol=protocol ) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step( "Remove IPv4 routes advertised using network command" " from R1 and advertise again" ) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv4": { "unicast": { "redistribute": [{"redist_type": "static"}], "advertise_networks": [ { "network": NETWORK_CMD_IP, "no_of_network": 1, "delete": True, } ], } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv4": { "unicast": { "redistribute": [{"redist_type": "static"}], "advertise_networks": [ { "network": NETWORK_CMD_IP, "no_of_network": 1, } ], } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step( "After removing IPv4 routes from network command , routes which are " "advertised using redistribute static are still present in the on " "R2 , verify using show ip bgp and show ip route" ) verify_nh_for_nw_rtes = { "r1": { "static_routes": [ {"network": NETWORK_CMD_IP, "no_of_ip": 1, "next_hop": gllip} ] } } bgp_rib = verify_bgp_rib(tgen, "ipv4", dut, verify_nh_for_nw_rtes, next_hop=gllip) assert bgp_rib is True, "Testcase {} : Failed \n Error: {}".format(tc_name, bgp_rib) result = verify_rib( tgen, "ipv4", dut, verify_nh_for_nw_rtes, next_hop=gllip, protocol=protocol ) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step( "Remove IPv4 routes advertised using redistribute static" " command from R1 and advertise again" ) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv4": { "unicast": { "redistribute": [{"redist_type": "static", "delete": True}] } } } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) configure_bgp_on_r1 = { "r1": { "bgp": { "address_family": { "ipv4": {"unicast": {"redistribute": [{"redist_type": "static"}]}} } } } } result = create_router_bgp(tgen, topo1, configure_bgp_on_r1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step( "After removing IPv4 routes from redistribute static , routes which" " are advertised using network are still present in the on R2 , " "verify using show ip bgp and show ip route" ) verify_nh_for_nw_rtes = { "r1": { "static_routes": [ {"network": NETWORK_CMD_IP, "no_of_ip": 1, "next_hop": gllip} ] } } bgp_rib = verify_bgp_rib(tgen, "ipv4", dut, verify_nh_for_nw_rtes, next_hop=gllip) assert bgp_rib is True, "Testcase {} : Failed \n Error: {}".format(tc_name, bgp_rib) result = verify_rib( tgen, "ipv4", dut, verify_nh_for_nw_rtes, next_hop=gllip, protocol=protocol ) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) write_test_footer(tc_name)
def test_ospf_lan_tc2_p0(request): """ OSPF IFSM -Verify state change events on DR / BDR / DR Other """ tc_name = request.node.name write_test_header(tc_name) tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) global topo step("Bring up the base config as per the topology") reset_config_on_routers(tgen) step( "Verify that OSPF is subscribed to multi cast services " "(All SPF, all DR Routers)." ) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": { "links": { "s1": { "ospf": { "priority": 98, "timerDeadSecs": 4, "area": "0.0.0.3", "mcastMemberOspfDesignatedRouters": True, "mcastMemberOspfAllRouters": True, "ospfEnabled": True, } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step("Delete the ip address") topo1 = { "r0": { "links": { "r3": { "ipv4": topo["routers"]["r0"]["links"]["s1"]["ipv4"], "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "delete": True, } } } } result = create_interfaces_cfg(tgen, topo1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step("Change the ip on the R0 interface") topo_modify_change_ip = deepcopy(topo) intf_ip = topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] = str( IPv4Address(unicode(intf_ip.split("/")[0])) + 3 ) + "/{}".format(intf_ip.split("/")[1]) build_config_from_json(tgen, topo_modify_change_ip, save_bkup=False) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": { "links": { "s1": { "ospf": { "ipAddress": topo_modify_change_ip["routers"]["r0"]["links"][ "s1" ]["ipv4"].split("/")[0], "ipAddressPrefixlen": int( topo_modify_change_ip["routers"]["r0"]["links"]["s1"][ "ipv4" ].split("/")[1] ), } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step("Modify the mask on the R0 interface") ip_addr = topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] mask = topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] step("Delete the ip address") topo1 = { "r0": { "links": { "r3": { "ipv4": ip_addr, "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "delete": True, } } } } result = create_interfaces_cfg(tgen, topo1) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step("Change the ip on the R0 interface") topo_modify_change_ip = deepcopy(topo) intf_ip = topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] topo_modify_change_ip["routers"]["r0"]["links"]["s1"]["ipv4"] = str( IPv4Address(unicode(intf_ip.split("/")[0])) + 3 ) + "/{}".format(int(intf_ip.split("/")[1]) + 1) build_config_from_json(tgen, topo_modify_change_ip, save_bkup=False) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": { "links": { "s1": { "ospf": { "ipAddress": topo_modify_change_ip["routers"]["r0"]["links"][ "s1" ]["ipv4"].split("/")[0], "ipAddressPrefixlen": int( topo_modify_change_ip["routers"]["r0"]["links"]["s1"][ "ipv4" ].split("/")[1] ), } } } } } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) step("Change the area id on the interface") input_dict = { "r0": { "links": { "s1": { "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "ospf": {"area": "0.0.0.3"}, "delete": True, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) input_dict = { "r0": { "links": { "s1": { "interface": topo["routers"]["r0"]["links"]["s1"]["interface"], "ospf": {"area": "0.0.0.2"}, } } } } result = create_interfaces_cfg(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) step("Verify that interface is enabled in ospf.") dut = "r0" input_dict = { "r0": {"links": {"s1": {"ospf": {"area": "0.0.0.2", "ospfEnabled": True}}}} } result = verify_ospf_interface(tgen, topo, dut=dut, input_dict=input_dict) assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) write_test_footer(tc_name)