github.com/cilium/cilium@v1.16.2/pkg/ipam/pool_privileged_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package ipam 5 6 import ( 7 "net" 8 "testing" 9 10 . "github.com/onsi/gomega" 11 "github.com/vishvananda/netlink" 12 "golang.org/x/sys/unix" 13 14 "github.com/cilium/cilium/pkg/datapath/linux/route" 15 "github.com/cilium/cilium/pkg/testutils" 16 "github.com/cilium/cilium/pkg/testutils/netns" 17 ) 18 19 func Test_cleanupUnreachableRoutes(t *testing.T) { 20 testutils.PrivilegedTest(t) 21 22 RegisterTestingT(t) 23 24 // temporary network namespace to ensure routes don't interfere with test system 25 ns := netns.NewNetNS(t) 26 27 parseCIDR := func(s string) *net.IPNet { 28 t.Helper() 29 _, cidr, err := net.ParseCIDR(s) 30 Expect(err).ToNot(HaveOccurred()) 31 return cidr 32 } 33 34 getUnreachableRoutes := func(family int) []netlink.Route { 35 t.Helper() 36 routes, err := netlink.RouteListFiltered(family, &netlink.Route{ 37 Type: unix.RTN_UNREACHABLE, 38 }, netlink.RT_FILTER_TYPE) 39 Expect(err).ToNot(HaveOccurred()) 40 return routes 41 } 42 43 ns.Do(func() error { 44 for _, podIPs := range []string{ 45 "10.10.0.1/32", "10.10.0.2/32", "10.20.0.1/32", 46 "fe80::1/128", "fe80:beef::2/128", "fe80:c0fe::3/128", 47 } { 48 err := netlink.RouteReplace(&netlink.Route{ 49 Dst: parseCIDR(podIPs), 50 Table: route.MainTable, 51 Type: unix.RTN_UNREACHABLE, 52 }) 53 Expect(err).ToNot(HaveOccurred()) 54 } 55 err := cleanupUnreachableRoutes("10.10.0.0/24") 56 Expect(err).ToNot(HaveOccurred()) 57 58 // Ensure only first two IPv4 routes are cleaned up 59 leftover := getUnreachableRoutes(netlink.FAMILY_V4) 60 Expect(err).ToNot(HaveOccurred()) 61 Expect(leftover).To(HaveLen(1)) 62 Expect(leftover[0].Dst).To(Equal(parseCIDR("10.20.0.1/32"))) 63 64 // Remove remaining route 65 err = cleanupUnreachableRoutes("10.20.0.0/24") 66 Expect(err).ToNot(HaveOccurred()) 67 leftover = getUnreachableRoutes(netlink.FAMILY_V4) 68 Expect(leftover).To(BeEmpty()) 69 70 // Remove IPv6 routes 71 err = cleanupUnreachableRoutes("fe80::/16") 72 Expect(err).ToNot(HaveOccurred()) 73 leftover = getUnreachableRoutes(netlink.FAMILY_V6) 74 Expect(leftover).To(BeEmpty()) 75 76 return nil 77 }) 78 }