Use of Scope for routes in IPAM

Add Scope for routes for cni spec v1.1

Signed-off-by: Lionel Jouin <lionel.jouin@est.tech>
This commit is contained in:
Lionel Jouin 2024-08-30 15:51:32 +02:00 committed by Casey Callendrello
parent 01b3db8e01
commit a6d6efa5ca
2 changed files with 19 additions and 4 deletions

View File

@ -123,8 +123,12 @@ func ConfigureIface(ifName string, res *current.Result) error {
route.Table = *r.Table route.Table = *r.Table
} }
if r.Scope != nil {
route.Scope = netlink.Scope(*r.Scope)
}
if err = netlink.RouteAddEcmp(&route); err != nil { if err = netlink.RouteAddEcmp(&route); err != nil {
return fmt.Errorf("failed to add route '%v via %v dev %v (Table: %d)': %v", r.Dst, gw, ifName, route.Table, err) return fmt.Errorf("failed to add route '%v via %v dev %v (Scope: %v, Table: %d)': %v", r.Dst, gw, ifName, route.Scope, route.Table, err)
} }
} }

View File

@ -41,8 +41,9 @@ func ipNetEqual(a, b *net.IPNet) bool {
var _ = Describe("ConfigureIface", func() { var _ = Describe("ConfigureIface", func() {
var originalNS ns.NetNS var originalNS ns.NetNS
var ipv4, ipv6, routev4, routev6 *net.IPNet var ipv4, ipv6, routev4, routev6, routev4Scope *net.IPNet
var ipgw4, ipgw6, routegwv4, routegwv6 net.IP var ipgw4, ipgw6, routegwv4, routegwv6 net.IP
var routeScope int
var result *current.Result var result *current.Result
var routeTable int var routeTable int
@ -78,6 +79,10 @@ var _ = Describe("ConfigureIface", func() {
routegwv4 = net.ParseIP("1.2.3.5") routegwv4 = net.ParseIP("1.2.3.5")
Expect(routegwv4).NotTo(BeNil()) Expect(routegwv4).NotTo(BeNil())
_, routev4Scope, err = net.ParseCIDR("1.2.3.4/32")
Expect(err).NotTo(HaveOccurred())
Expect(routev4Scope).NotTo(BeNil())
ipgw4 = net.ParseIP("1.2.3.1") ipgw4 = net.ParseIP("1.2.3.1")
Expect(ipgw4).NotTo(BeNil()) Expect(ipgw4).NotTo(BeNil())
@ -95,6 +100,7 @@ var _ = Describe("ConfigureIface", func() {
Expect(ipgw6).NotTo(BeNil()) Expect(ipgw6).NotTo(BeNil())
routeTable := 5000 routeTable := 5000
routeScope = 200
result = &current.Result{ result = &current.Result{
Interfaces: []*current.Interface{ Interfaces: []*current.Interface{
@ -125,6 +131,7 @@ var _ = Describe("ConfigureIface", func() {
{Dst: *routev4, GW: routegwv4}, {Dst: *routev4, GW: routegwv4},
{Dst: *routev6, GW: routegwv6}, {Dst: *routev6, GW: routegwv6},
{Dst: *routev4, GW: routegwv4, Table: &routeTable}, {Dst: *routev4, GW: routegwv4, Table: &routeTable},
{Dst: *routev4Scope, Scope: &routeScope},
}, },
} }
}) })
@ -166,7 +173,7 @@ var _ = Describe("ConfigureIface", func() {
routes, err := netlink.RouteList(link, 0) routes, err := netlink.RouteList(link, 0)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
var v4found, v6found bool var v4found, v6found, v4Scopefound bool
for _, route := range routes { for _, route := range routes {
isv4 := route.Dst.IP.To4() != nil isv4 := route.Dst.IP.To4() != nil
if isv4 && ipNetEqual(route.Dst, routev4) && route.Gw.Equal(routegwv4) { if isv4 && ipNetEqual(route.Dst, routev4) && route.Gw.Equal(routegwv4) {
@ -175,13 +182,17 @@ var _ = Describe("ConfigureIface", func() {
if !isv4 && ipNetEqual(route.Dst, routev6) && route.Gw.Equal(routegwv6) { if !isv4 && ipNetEqual(route.Dst, routev6) && route.Gw.Equal(routegwv6) {
v6found = true v6found = true
} }
if isv4 && ipNetEqual(route.Dst, routev4Scope) && int(route.Scope) == routeScope {
v4Scopefound = true
}
if v4found && v6found { if v4found && v6found && v4Scopefound {
break break
} }
} }
Expect(v4found).To(BeTrue()) Expect(v4found).To(BeTrue())
Expect(v6found).To(BeTrue()) Expect(v6found).To(BeTrue())
Expect(v4Scopefound).To(BeTrue())
return nil return nil
}) })