1*7064c94aSAlexander V. Chernikovimport ipaddress 2*7064c94aSAlexander V. Chernikov 3*7064c94aSAlexander V. Chernikovimport pytest 4*7064c94aSAlexander V. Chernikovfrom atf_python.sys.net.tools import ToolsHelper 5*7064c94aSAlexander V. Chernikovfrom atf_python.sys.net.vnet import VnetTestTemplate 6*7064c94aSAlexander V. Chernikov 7*7064c94aSAlexander V. Chernikov 8*7064c94aSAlexander V. Chernikovclass TestIfOps(VnetTestTemplate): 9*7064c94aSAlexander V. Chernikov TOPOLOGY = { 10*7064c94aSAlexander V. Chernikov "vnet1": {"ifaces": ["if1", "if2"]}, 11*7064c94aSAlexander V. Chernikov "if1": {"prefixes4": [], "prefixes6": []}, 12*7064c94aSAlexander V. Chernikov "if2": {"prefixes4": [], "prefixes6": []}, 13*7064c94aSAlexander V. Chernikov } 14*7064c94aSAlexander V. Chernikov 15*7064c94aSAlexander V. Chernikov @pytest.mark.parametrize("family", ["inet", "inet6"]) 16*7064c94aSAlexander V. Chernikov @pytest.mark.require_user("root") 17*7064c94aSAlexander V. Chernikov def test_change_prefix_route(self, family): 18*7064c94aSAlexander V. Chernikov """Tests that prefix route changes to the new one upon addr deletion""" 19*7064c94aSAlexander V. Chernikov vnet = self.vnet_map["vnet1"] 20*7064c94aSAlexander V. Chernikov first_iface = vnet.iface_alias_map["if1"] 21*7064c94aSAlexander V. Chernikov second_iface = vnet.iface_alias_map["if2"] 22*7064c94aSAlexander V. Chernikov if family == "inet": 23*7064c94aSAlexander V. Chernikov first_addr = ipaddress.ip_interface("192.0.2.1/24") 24*7064c94aSAlexander V. Chernikov second_addr = ipaddress.ip_interface("192.0.2.2/24") 25*7064c94aSAlexander V. Chernikov else: 26*7064c94aSAlexander V. Chernikov first_addr = ipaddress.ip_interface("2001:db8::1/64") 27*7064c94aSAlexander V. Chernikov second_addr = ipaddress.ip_interface("2001:db8::2/64") 28*7064c94aSAlexander V. Chernikov 29*7064c94aSAlexander V. Chernikov first_iface.setup_addr(str(first_addr)) 30*7064c94aSAlexander V. Chernikov second_iface.setup_addr(str(second_addr)) 31*7064c94aSAlexander V. Chernikov 32*7064c94aSAlexander V. Chernikov # At this time prefix should be pointing to the first interface 33*7064c94aSAlexander V. Chernikov routes = ToolsHelper.get_routes(family) 34*7064c94aSAlexander V. Chernikov px = [r for r in routes if r["destination"] == str(first_addr.network)][0] 35*7064c94aSAlexander V. Chernikov assert px["interface-name"] == first_iface.name 36*7064c94aSAlexander V. Chernikov 37*7064c94aSAlexander V. Chernikov # Now delete address from the first interface and verify switchover 38*7064c94aSAlexander V. Chernikov first_iface.delete_addr(first_addr.ip) 39*7064c94aSAlexander V. Chernikov 40*7064c94aSAlexander V. Chernikov routes = ToolsHelper.get_routes(family) 41*7064c94aSAlexander V. Chernikov px = [r for r in routes if r["destination"] == str(first_addr.network)][0] 42*7064c94aSAlexander V. Chernikov assert px["interface-name"] == second_iface.name 43*7064c94aSAlexander V. Chernikov 44*7064c94aSAlexander V. Chernikov @pytest.mark.parametrize( 45*7064c94aSAlexander V. Chernikov "family", 46*7064c94aSAlexander V. Chernikov [ 47*7064c94aSAlexander V. Chernikov "inet", 48*7064c94aSAlexander V. Chernikov pytest.param("inet6", marks=pytest.mark.xfail(reason="currently fails")), 49*7064c94aSAlexander V. Chernikov ], 50*7064c94aSAlexander V. Chernikov ) 51*7064c94aSAlexander V. Chernikov @pytest.mark.require_user("root") 52*7064c94aSAlexander V. Chernikov def test_change_prefix_route_same_iface(self, family): 53*7064c94aSAlexander V. Chernikov """Tests that prefix route changes to the new ifa upon addr deletion""" 54*7064c94aSAlexander V. Chernikov vnet = self.vnet_map["vnet1"] 55*7064c94aSAlexander V. Chernikov first_iface = vnet.iface_alias_map["if1"] 56*7064c94aSAlexander V. Chernikov 57*7064c94aSAlexander V. Chernikov if family == "inet": 58*7064c94aSAlexander V. Chernikov first_addr = ipaddress.ip_interface("192.0.2.1/24") 59*7064c94aSAlexander V. Chernikov second_addr = ipaddress.ip_interface("192.0.2.2/24") 60*7064c94aSAlexander V. Chernikov else: 61*7064c94aSAlexander V. Chernikov first_addr = ipaddress.ip_interface("2001:db8::1/64") 62*7064c94aSAlexander V. Chernikov second_addr = ipaddress.ip_interface("2001:db8::2/64") 63*7064c94aSAlexander V. Chernikov 64*7064c94aSAlexander V. Chernikov first_iface.setup_addr(str(first_addr)) 65*7064c94aSAlexander V. Chernikov first_iface.setup_addr(str(second_addr)) 66*7064c94aSAlexander V. Chernikov 67*7064c94aSAlexander V. Chernikov # At this time prefix should be pointing to the first interface 68*7064c94aSAlexander V. Chernikov routes = ToolsHelper.get_routes(family) 69*7064c94aSAlexander V. Chernikov px = [r for r in routes if r["destination"] == str(first_addr.network)][0] 70*7064c94aSAlexander V. Chernikov assert px["interface-name"] == first_iface.name 71*7064c94aSAlexander V. Chernikov 72*7064c94aSAlexander V. Chernikov # Now delete address from the first interface and verify switchover 73*7064c94aSAlexander V. Chernikov first_iface.delete_addr(str(first_addr.ip)) 74*7064c94aSAlexander V. Chernikov 75*7064c94aSAlexander V. Chernikov routes = ToolsHelper.get_routes(family) 76*7064c94aSAlexander V. Chernikov px = [r for r in routes if r["destination"] == str(first_addr.network)][0] 77*7064c94aSAlexander V. Chernikov nhop_kidx = px["nhop"] 78*7064c94aSAlexander V. Chernikov assert px["interface-name"] == first_iface.name 79*7064c94aSAlexander V. Chernikov nhops = ToolsHelper.get_nhops(family) 80*7064c94aSAlexander V. Chernikov nh = [nh for nh in nhops if nh["index"] == nhop_kidx][0] 81*7064c94aSAlexander V. Chernikov assert nh["ifa"] == str(second_addr.ip) 82