Skip to content

Commit 5883f0f

Browse files
committed
Move calls to netlinksafe
These are functions identified as potentially receiving ErrDumpInterrupted and needing to retry Signed-off-by: Adrian Moisey <adrian@changeover.za.net>
1 parent be544c2 commit 5883f0f

39 files changed

+443
-403
lines changed

pkg/ip/addr_linux.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"time"
2121

2222
"github.com/vishvananda/netlink"
23+
24+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2325
)
2426

2527
const SETTLE_INTERVAL = 50 * time.Millisecond
@@ -30,14 +32,14 @@ const SETTLE_INTERVAL = 50 * time.Millisecond
3032
// addresses are no longer tentative.
3133
// If any addresses are still tentative after timeout seconds, then error.
3234
func SettleAddresses(ifName string, timeout int) error {
33-
link, err := netlink.LinkByName(ifName)
35+
link, err := netlinksafe.LinkByName(ifName)
3436
if err != nil {
3537
return fmt.Errorf("failed to retrieve link: %v", err)
3638
}
3739

3840
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
3941
for {
40-
addrs, err := netlink.AddrList(link, netlink.FAMILY_ALL)
42+
addrs, err := netlinksafe.AddrList(link, netlink.FAMILY_ALL)
4143
if err != nil {
4244
return fmt.Errorf("could not list addresses: %v", err)
4345
}

pkg/ip/link_linux.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/safchain/ethtool"
2525
"github.com/vishvananda/netlink"
2626

27+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2728
"github.com/containernetworking/plugins/pkg/ns"
2829
"github.com/containernetworking/plugins/pkg/utils/sysctl"
2930
)
@@ -52,7 +53,7 @@ func makeVethPair(name, peer string, mtu int, mac string, hostNS ns.NetNS) (netl
5253
return nil, err
5354
}
5455
// Re-fetch the container link to get its creation-time parameters, e.g. index and mac
55-
veth2, err := netlink.LinkByName(name)
56+
veth2, err := netlinksafe.LinkByName(name)
5657
if err != nil {
5758
netlink.LinkDel(veth) // try and clean up the link if possible.
5859
return nil, err
@@ -62,7 +63,7 @@ func makeVethPair(name, peer string, mtu int, mac string, hostNS ns.NetNS) (netl
6263
}
6364

6465
func peerExists(name string) bool {
65-
if _, err := netlink.LinkByName(name); err != nil {
66+
if _, err := netlinksafe.LinkByName(name); err != nil {
6667
return false
6768
}
6869
return true
@@ -114,7 +115,7 @@ func RandomVethName() (string, error) {
114115
}
115116

116117
func RenameLink(curName, newName string) error {
117-
link, err := netlink.LinkByName(curName)
118+
link, err := netlinksafe.LinkByName(curName)
118119
if err == nil {
119120
err = netlink.LinkSetName(link, newName)
120121
}
@@ -145,7 +146,7 @@ func SetupVethWithName(contVethName, hostVethName string, mtu int, contVethMac s
145146

146147
var hostVeth netlink.Link
147148
err = hostNS.Do(func(_ ns.NetNS) error {
148-
hostVeth, err = netlink.LinkByName(hostVethName)
149+
hostVeth, err = netlinksafe.LinkByName(hostVethName)
149150
if err != nil {
150151
return fmt.Errorf("failed to lookup %q in %q: %v", hostVethName, hostNS.Path(), err)
151152
}
@@ -174,7 +175,7 @@ func SetupVeth(contVethName string, mtu int, contVethMac string, hostNS ns.NetNS
174175

175176
// DelLinkByName removes an interface link.
176177
func DelLinkByName(ifName string) error {
177-
iface, err := netlink.LinkByName(ifName)
178+
iface, err := netlinksafe.LinkByName(ifName)
178179
if err != nil {
179180
if _, ok := err.(netlink.LinkNotFoundError); ok {
180181
return ErrLinkNotFound
@@ -191,15 +192,15 @@ func DelLinkByName(ifName string) error {
191192

192193
// DelLinkByNameAddr remove an interface and returns its addresses
193194
func DelLinkByNameAddr(ifName string) ([]*net.IPNet, error) {
194-
iface, err := netlink.LinkByName(ifName)
195+
iface, err := netlinksafe.LinkByName(ifName)
195196
if err != nil {
196197
if _, ok := err.(netlink.LinkNotFoundError); ok {
197198
return nil, ErrLinkNotFound
198199
}
199200
return nil, fmt.Errorf("failed to lookup %q: %v", ifName, err)
200201
}
201202

202-
addrs, err := netlink.AddrList(iface, netlink.FAMILY_ALL)
203+
addrs, err := netlinksafe.AddrList(iface, netlink.FAMILY_ALL)
203204
if err != nil {
204205
return nil, fmt.Errorf("failed to get IP addresses for %q: %v", ifName, err)
205206
}
@@ -222,7 +223,7 @@ func DelLinkByNameAddr(ifName string) ([]*net.IPNet, error) {
222223
// veth, or an error. This peer ifindex will only be valid in the peer's
223224
// network namespace.
224225
func GetVethPeerIfindex(ifName string) (netlink.Link, int, error) {
225-
link, err := netlink.LinkByName(ifName)
226+
link, err := netlinksafe.LinkByName(ifName)
226227
if err != nil {
227228
return nil, -1, fmt.Errorf("could not look up %q: %v", ifName, err)
228229
}

pkg/ip/link_linux_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222

2323
. "github.com/onsi/ginkgo/v2"
2424
. "github.com/onsi/gomega"
25-
"github.com/vishvananda/netlink"
2625

2726
"github.com/containernetworking/plugins/pkg/ip"
27+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2828
"github.com/containernetworking/plugins/pkg/ns"
2929
"github.com/containernetworking/plugins/pkg/testutils"
3030
)
@@ -127,7 +127,7 @@ var _ = Describe("Link", func() {
127127
_ = containerNetNS.Do(func(ns.NetNS) error {
128128
defer GinkgoRecover()
129129

130-
containerVethFromName, err := netlink.LinkByName(containerVethName)
130+
containerVethFromName, err := netlinksafe.LinkByName(containerVethName)
131131
Expect(err).NotTo(HaveOccurred())
132132
Expect(containerVethFromName.Attrs().Index).To(Equal(containerVeth.Index))
133133

@@ -137,7 +137,7 @@ var _ = Describe("Link", func() {
137137
_ = hostNetNS.Do(func(ns.NetNS) error {
138138
defer GinkgoRecover()
139139

140-
hostVethFromName, err := netlink.LinkByName(hostVethName)
140+
hostVethFromName, err := netlinksafe.LinkByName(hostVethName)
141141
Expect(err).NotTo(HaveOccurred())
142142
Expect(hostVethFromName.Attrs().Index).To(Equal(hostVeth.Index))
143143

@@ -207,7 +207,7 @@ var _ = Describe("Link", func() {
207207
_ = containerNetNS.Do(func(ns.NetNS) error {
208208
defer GinkgoRecover()
209209

210-
_, err := netlink.LinkByName(containerVethName)
210+
_, err := netlinksafe.LinkByName(containerVethName)
211211
Expect(err).NotTo(HaveOccurred())
212212

213213
return nil
@@ -216,7 +216,7 @@ var _ = Describe("Link", func() {
216216
_ = hostNetNS.Do(func(ns.NetNS) error {
217217
defer GinkgoRecover()
218218

219-
_, err := netlink.LinkByName(hostVethName)
219+
_, err := netlinksafe.LinkByName(hostVethName)
220220
Expect(err).NotTo(HaveOccurred())
221221

222222
return nil
@@ -232,7 +232,7 @@ var _ = Describe("Link", func() {
232232
Expect(err).NotTo(HaveOccurred())
233233
hostVethName = hostVeth.Name
234234

235-
link, err := netlink.LinkByName(containerVethName)
235+
link, err := netlinksafe.LinkByName(containerVethName)
236236
Expect(err).NotTo(HaveOccurred())
237237
Expect(link.Attrs().HardwareAddr.String()).To(Equal(mac))
238238

@@ -242,7 +242,7 @@ var _ = Describe("Link", func() {
242242
_ = hostNetNS.Do(func(ns.NetNS) error {
243243
defer GinkgoRecover()
244244

245-
link, err := netlink.LinkByName(hostVethName)
245+
link, err := netlinksafe.LinkByName(hostVethName)
246246
Expect(err).NotTo(HaveOccurred())
247247
Expect(link.Attrs().HardwareAddr.String()).NotTo(Equal(mac))
248248

@@ -259,7 +259,7 @@ var _ = Describe("Link", func() {
259259
err := ip.DelLinkByName(containerVethName)
260260
Expect(err).NotTo(HaveOccurred())
261261

262-
_, err = netlink.LinkByName(containerVethName)
262+
_, err = netlinksafe.LinkByName(containerVethName)
263263
Expect(err).To(HaveOccurred())
264264

265265
return nil
@@ -268,7 +268,7 @@ var _ = Describe("Link", func() {
268268
_ = hostNetNS.Do(func(ns.NetNS) error {
269269
defer GinkgoRecover()
270270

271-
_, err := netlink.LinkByName(hostVethName)
271+
_, err := netlinksafe.LinkByName(hostVethName)
272272
Expect(err).To(HaveOccurred())
273273

274274
return nil

pkg/ip/utils_linux.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"github.com/containernetworking/cni/pkg/types"
2727
current "github.com/containernetworking/cni/pkg/types/100"
28+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2829
)
2930

3031
func ValidateExpectedInterfaceIPs(ifName string, resultIPs []*current.IPConfig) error {
@@ -33,12 +34,12 @@ func ValidateExpectedInterfaceIPs(ifName string, resultIPs []*current.IPConfig)
3334
ourAddr := netlink.Addr{IPNet: &ips.Address}
3435
match := false
3536

36-
link, err := netlink.LinkByName(ifName)
37+
link, err := netlinksafe.LinkByName(ifName)
3738
if err != nil {
3839
return fmt.Errorf("Cannot find container link %v", ifName)
3940
}
4041

41-
addrList, err := netlink.AddrList(link, netlink.FAMILY_ALL)
42+
addrList, err := netlinksafe.AddrList(link, netlink.FAMILY_ALL)
4243
if err != nil {
4344
return fmt.Errorf("Cannot obtain List of IP Addresses")
4445
}
@@ -67,7 +68,7 @@ func ValidateExpectedInterfaceIPs(ifName string, resultIPs []*current.IPConfig)
6768
family = netlink.FAMILY_V4
6869
}
6970

70-
gwy, err := netlink.RouteListFiltered(family, findGwy, routeFilter)
71+
gwy, err := netlinksafe.RouteListFiltered(family, findGwy, routeFilter)
7172
if err != nil {
7273
return fmt.Errorf("Error %v trying to find Gateway %v for interface %v", err, ips.Gateway, ifName)
7374
}
@@ -108,7 +109,7 @@ func ValidateExpectedRoute(resultRoutes []*types.Route) error {
108109
return fmt.Errorf("Invalid static route found %v", route)
109110
}
110111

111-
wasFound, err := netlink.RouteListFiltered(family, find, routeFilter)
112+
wasFound, err := netlinksafe.RouteListFiltered(family, find, routeFilter)
112113
if err != nil {
113114
return fmt.Errorf("Expected Route %v not route table lookup error %v", route, err)
114115
}

pkg/ipam/ipam_linux.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
current "github.com/containernetworking/cni/pkg/types/100"
2525
"github.com/containernetworking/plugins/pkg/ip"
26+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2627
"github.com/containernetworking/plugins/pkg/utils/sysctl"
2728
)
2829

@@ -38,7 +39,7 @@ func ConfigureIface(ifName string, res *current.Result) error {
3839
return fmt.Errorf("no interfaces to configure")
3940
}
4041

41-
link, err := netlink.LinkByName(ifName)
42+
link, err := netlinksafe.LinkByName(ifName)
4243
if err != nil {
4344
return fmt.Errorf("failed to lookup %q: %v", ifName, err)
4445
}

pkg/ipam/ipam_linux_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
"github.com/containernetworking/cni/pkg/types"
2626
current "github.com/containernetworking/cni/pkg/types/100"
27+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2728
"github.com/containernetworking/plugins/pkg/ns"
2829
"github.com/containernetworking/plugins/pkg/testutils"
2930
)
@@ -64,7 +65,7 @@ var _ = Describe("ConfigureIface", func() {
6465
LinkAttrs: linkAttrs,
6566
})
6667
Expect(err).NotTo(HaveOccurred())
67-
_, err = netlink.LinkByName(LINK_NAME)
68+
_, err = netlinksafe.LinkByName(LINK_NAME)
6869
Expect(err).NotTo(HaveOccurred())
6970
return nil
7071
})
@@ -148,16 +149,16 @@ var _ = Describe("ConfigureIface", func() {
148149
err := ConfigureIface(LINK_NAME, result)
149150
Expect(err).NotTo(HaveOccurred())
150151

151-
link, err := netlink.LinkByName(LINK_NAME)
152+
link, err := netlinksafe.LinkByName(LINK_NAME)
152153
Expect(err).NotTo(HaveOccurred())
153154
Expect(link.Attrs().Name).To(Equal(LINK_NAME))
154155

155-
v4addrs, err := netlink.AddrList(link, syscall.AF_INET)
156+
v4addrs, err := netlinksafe.AddrList(link, syscall.AF_INET)
156157
Expect(err).NotTo(HaveOccurred())
157158
Expect(v4addrs).To(HaveLen(1))
158159
Expect(ipNetEqual(v4addrs[0].IPNet, ipv4)).To(BeTrue())
159160

160-
v6addrs, err := netlink.AddrList(link, syscall.AF_INET6)
161+
v6addrs, err := netlinksafe.AddrList(link, syscall.AF_INET6)
161162
Expect(err).NotTo(HaveOccurred())
162163
Expect(v6addrs).To(HaveLen(2))
163164

@@ -171,7 +172,7 @@ var _ = Describe("ConfigureIface", func() {
171172
Expect(found).To(BeTrue())
172173

173174
// Ensure the v4 route, v6 route, and subnet route
174-
routes, err := netlink.RouteList(link, 0)
175+
routes, err := netlinksafe.RouteList(link, 0)
175176
Expect(err).NotTo(HaveOccurred())
176177

177178
var v4found, v6found, v4Scopefound bool
@@ -209,12 +210,12 @@ var _ = Describe("ConfigureIface", func() {
209210
err := ConfigureIface(LINK_NAME, result)
210211
Expect(err).NotTo(HaveOccurred())
211212

212-
link, err := netlink.LinkByName(LINK_NAME)
213+
link, err := netlinksafe.LinkByName(LINK_NAME)
213214
Expect(err).NotTo(HaveOccurred())
214215
Expect(link.Attrs().Name).To(Equal(LINK_NAME))
215216

216217
// Ensure the v4 route, v6 route, and subnet route
217-
routes, err := netlink.RouteList(link, 0)
218+
routes, err := netlinksafe.RouteList(link, 0)
218219
Expect(err).NotTo(HaveOccurred())
219220

220221
var v4found, v6found, v4Tablefound bool
@@ -239,7 +240,7 @@ var _ = Describe("ConfigureIface", func() {
239240
Table: routeTable,
240241
}
241242

242-
routes, err = netlink.RouteListFiltered(netlink.FAMILY_ALL,
243+
routes, err = netlinksafe.RouteListFiltered(netlink.FAMILY_ALL,
243244
routeFilter,
244245
netlink.RT_FILTER_TABLE)
245246
Expect(err).NotTo(HaveOccurred())

pkg/utils/conntrack.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020

2121
"github.com/vishvananda/netlink"
2222
"golang.org/x/sys/unix"
23+
24+
"github.com/containernetworking/plugins/pkg/netlinksafe"
2325
)
2426

2527
// Assigned Internet Protocol Numbers
@@ -51,7 +53,7 @@ func DeleteConntrackEntriesForDstIP(dstIP string, protocol uint8) error {
5153
filter.AddIP(netlink.ConntrackOrigDstIP, ip)
5254
filter.AddProtocol(protocol)
5355

54-
_, err := netlink.ConntrackDeleteFilters(netlink.ConntrackTable, family, filter)
56+
_, err := netlinksafe.ConntrackDeleteFilters(netlink.ConntrackTable, family, filter)
5557
if err != nil {
5658
return fmt.Errorf("error deleting connection tracking state for protocol: %d IP: %s, error: %v", protocol, ip, err)
5759
}
@@ -65,7 +67,7 @@ func DeleteConntrackEntriesForDstPort(port uint16, protocol uint8, family netlin
6567
filter.AddProtocol(protocol)
6668
filter.AddPort(netlink.ConntrackOrigDstPort, port)
6769

68-
_, err := netlink.ConntrackDeleteFilters(netlink.ConntrackTable, family, filter)
70+
_, err := netlinksafe.ConntrackDeleteFilters(netlink.ConntrackTable, family, filter)
6971
if err != nil {
7072
return fmt.Errorf("error deleting connection tracking state for protocol: %d Port: %d, error: %v", protocol, port, err)
7173
}

plugins/ipam/dhcp/dhcp2_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
"github.com/containernetworking/cni/pkg/skel"
2929
current "github.com/containernetworking/cni/pkg/types/100"
30+
"github.com/containernetworking/plugins/pkg/netlinksafe"
3031
"github.com/containernetworking/plugins/pkg/ns"
3132
"github.com/containernetworking/plugins/pkg/testutils"
3233
)
@@ -48,12 +49,12 @@ var _ = Describe("DHCP Multiple Lease Operations", func() {
4849
err = targetNS.Do(func(_ ns.NetNS) error {
4950
defer GinkgoRecover()
5051

51-
link, err := netlink.LinkByName(contVethName0)
52+
link, err := netlinksafe.LinkByName(contVethName0)
5253
Expect(err).NotTo(HaveOccurred())
5354
err = netlink.LinkSetUp(link)
5455
Expect(err).NotTo(HaveOccurred())
5556

56-
link1, err := netlink.LinkByName(contVethName1)
57+
link1, err := netlinksafe.LinkByName(contVethName1)
5758
Expect(err).NotTo(HaveOccurred())
5859
err = netlink.LinkSetUp(link1)
5960
Expect(err).NotTo(HaveOccurred())

0 commit comments

Comments
 (0)