xref: /freebsd/tests/sys/net/routing/test_routing_l3.py (revision 7064c94a02af2f8665636a8594557b9e93ad71bf)
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