Skip to content

Commit 1858d8f

Browse files
authored
Merge pull request #4269 from twz123/wrap-errors
Wrap errors correctly, part 3
2 parents fc8a8fe + 8d12f77 commit 1858d8f

File tree

17 files changed

+65
-47
lines changed

17 files changed

+65
-47
lines changed

.golangci.yml

+5-4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ run:
1010

1111
linters:
1212
enable:
13-
- depguard # Checks if package imports are in a list of acceptable packages
14-
- gofmt # Checks whether code was gofmt-ed
15-
- goheader # Checks is file headers matche a given pattern
16-
- revive # Stricter drop-in replacement for golint
13+
- depguard # Checks if package imports are in a list of acceptable packages
14+
- errorlint # Find code that will cause problems with Go's error wrapping scheme
15+
- gofmt # Checks whether code was gofmt-ed
16+
- goheader # Checks is file headers matche a given pattern
17+
- revive # Stricter drop-in replacement for golint
1718

1819
linters-settings:
1920
depguard:

cmd/root.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package cmd
1818

1919
import (
20+
"errors"
2021
"fmt"
2122
"net/http"
2223
"os"
@@ -70,7 +71,7 @@ func NewRootCmd() *cobra.Command {
7071
go func() {
7172
log := logrus.WithField("debug_server", config.DebugListenOn)
7273
log.Debug("Starting debug server")
73-
if err := http.ListenAndServe(config.DebugListenOn, nil); err != http.ErrServerClosed {
74+
if err := http.ListenAndServe(config.DebugListenOn, nil); !errors.Is(err, http.ErrServerClosed) {
7475
log.WithError(err).Debug("Failed to start debug server")
7576
} else {
7677
log.Debug("Debug server closed")

internal/pkg/archive/archive.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package archive
1919
import (
2020
"archive/tar"
2121
"compress/gzip"
22+
"errors"
2223
"fmt"
2324
"io"
2425
"os"
@@ -50,7 +51,7 @@ func Extract(input io.Reader, dst string) error {
5051

5152
for {
5253
header, err := tarReader.Next()
53-
if err == io.EOF {
54+
if errors.Is(err, io.EOF) {
5455
break
5556
}
5657

internal/pkg/sysinfo/probes/linux/cgroups.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ limitations under the License.
1919
package linux
2020

2121
import (
22+
"errors"
2223
"fmt"
2324
"os"
2425
"sync"
@@ -80,8 +81,9 @@ func (c *CgroupsProbes) probe(reporter probes.Reporter) error {
8081
}
8182

8283
func reportCgroupSystemErr(reporter probes.Reporter, d probes.ProbeDesc, err error) error {
83-
if detectionFailed, ok := err.(cgroupFsDetectionFailed); ok {
84-
return reporter.Reject(d, detectionFailed, "")
84+
var detectionFailedErr cgroupFsDetectionFailed
85+
if errors.As(err, &detectionFailedErr) {
86+
return reporter.Reject(d, detectionFailedErr, "")
8587
}
8688

8789
return reporter.Error(d, err)

internal/pkg/sysinfo/probes/linux/kernel.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,9 @@ func (k *kConfigProbe) DisplayName() string {
206206
func (k *kConfigProbe) Probe(reporter probes.Reporter) error {
207207
option, err := k.probeConfig(k.kConfig)
208208
if err != nil {
209-
if err, notFound := err.(*noKConfigsFound); notFound {
210-
return reporter.Warn(k, err, "")
209+
var notFoundErr *noKConfigsFound
210+
if errors.As(err, &notFoundErr) {
211+
return reporter.Warn(k, notFoundErr, "")
211212
}
212213
return reporter.Error(k, err)
213214
}

internal/pkg/sysinfo/probes/linux/kernel_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ func TestKConfigProber(t *testing.T) {
117117

118118
option, err := probeKConfig(ensureKConfig("I_CERTAINLY_DONT_EXIST"))
119119
assert.Equal(t, option, kConfigUnknown)
120-
if _, ok := err.(*noKConfigsFound); ok {
121-
t.Log("system doesn't expose its kernel config")
120+
var notFoundErr *noKConfigsFound
121+
if errors.As(err, &notFoundErr) {
122+
t.Logf("System doesn't seem to expose its kernel config: %v", err)
122123
} else {
123124
assert.NoError(t, err)
124125
}

internal/pkg/sysinfo/probes/memory.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ limitations under the License.
1616

1717
package probes
1818

19-
import "fmt"
19+
import (
20+
"errors"
21+
"fmt"
22+
)
2023

2124
// AssertTotalMemory asserts a minimum amount of system RAM.
2225
func AssertTotalMemory(parent ParentProbe, min uint64) {
@@ -39,7 +42,8 @@ type assertTotalMem struct {
3942
func (a *assertTotalMem) Probe(reporter Reporter) error {
4043
desc := NewProbeDesc("Total memory", a.path)
4144
if totalMemory, err := a.probeTotalMemory(); err != nil {
42-
if unsupportedErr, unsupported := err.(probeUnsupported); unsupported {
45+
var unsupportedErr probeUnsupported
46+
if errors.As(err, &unsupportedErr) {
4347
return reporter.Warn(desc, unsupportedErr, "")
4448
}
4549
return reporter.Error(desc, err)

pkg/apis/k0s/v1beta1/cplb.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func (c *ControlPlaneLoadBalancingSpec) ValidateVRRPInstances(getDefaultNICFn fu
8686
if vi.Interface == "" {
8787
nic, err := getDefaultNICFn()
8888
if err != nil {
89-
return fmt.Errorf("failed to get default NIC: %v", err)
89+
return fmt.Errorf("failed to get default NIC: %w", err)
9090
}
9191
c.VRRPInstances[i].Interface = nic
9292
}

pkg/component/controller/cplb_unix.go

+20-20
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ func (k *Keepalived) Init(_ context.Context) error {
6565

6666
basepath := filepath.Dir(k.K0sVars.KeepalivedConfigFile)
6767
if err = dir.Init(basepath, constant.KeepalivedDirMode); err != nil {
68-
return fmt.Errorf("failed to create keepalived data dir: %v", err)
68+
return fmt.Errorf("failed to create keepalived data dir: %w", err)
6969
}
7070

7171
if err = os.Chown(basepath, k.uid, -1); err != nil {
72-
return fmt.Errorf("failed to chown keepalived data dir: %v", err)
72+
return fmt.Errorf("failed to chown keepalived data dir: %w", err)
7373
}
7474

7575
return assets.Stage(k.K0sVars.BinDir, "keepalived", constant.BinDirMode)
@@ -82,14 +82,14 @@ func (k *Keepalived) Start(_ context.Context) error {
8282
}
8383

8484
if err := k.configureDummy(); err != nil {
85-
return fmt.Errorf("failed to configure dummy interface: %v", err)
85+
return fmt.Errorf("failed to configure dummy interface: %w", err)
8686
}
8787

8888
if err := k.Config.ValidateVRRPInstances(nil); err != nil {
89-
return fmt.Errorf("failed to validate VRRP instances: %v", err)
89+
return fmt.Errorf("failed to validate VRRP instances: %w", err)
9090
}
9191
if err := k.generateKeepalivedTemplate(); err != nil {
92-
return fmt.Errorf("failed to generate keepalived template: %v", err)
92+
return fmt.Errorf("failed to generate keepalived template: %w", err)
9393

9494
}
9595

@@ -123,7 +123,7 @@ func (k *Keepalived) Stop() error {
123123
k.log.Infof("Stopping keepalived")
124124
if err := k.supervisor.Stop(); err != nil {
125125
// Failed to stop keepalived. Don't delete the VIP, just in case.
126-
return fmt.Errorf("failed to stop keepalived: %v", err)
126+
return fmt.Errorf("failed to stop keepalived: %w", err)
127127
}
128128

129129
k.log.Infof("Deleting dummy interface")
@@ -159,7 +159,7 @@ func (k *Keepalived) configureDummy() error {
159159
// If the dummy interface fails, attempt to define the addresses just
160160
// in case.
161161
if err := k.ensureLinkAddresses(dummyLinkName, vips); err != nil {
162-
return fmt.Errorf("failed to ensure link addresses: %v", err)
162+
return fmt.Errorf("failed to ensure link addresses: %w", err)
163163
}
164164
}
165165
return nil
@@ -183,7 +183,7 @@ func (k *Keepalived) ensureDummyInterface(linkName string) error {
183183

184184
// This happens if the interface exists but it's not a dummy interface
185185
if err = netlink.LinkDel(link); err != nil {
186-
return fmt.Errorf("failed to delete %s: %v", linkName, err)
186+
return fmt.Errorf("failed to delete %s: %w", linkName, err)
187187
}
188188

189189
return k.createDummyInterface(linkName)
@@ -201,12 +201,12 @@ func (k *Keepalived) createDummyInterface(linkName string) error {
201201
func (k *Keepalived) ensureLinkAddresses(linkName string, expectedAddresses []string) error {
202202
link, err := netlink.LinkByName(linkName)
203203
if err != nil {
204-
return fmt.Errorf("failed to get link by name %s: %v", linkName, err)
204+
return fmt.Errorf("failed to get link by name %s: %w", linkName, err)
205205
}
206206

207207
linkAddrs, strAddrs, err := k.getLinkAddresses(link)
208208
if err != nil {
209-
return fmt.Errorf("failed to get addresses for link %s: %v", linkName, err)
209+
return fmt.Errorf("failed to get addresses for link %s: %w", linkName, err)
210210
}
211211

212212
// Remove unexpected addresses
@@ -216,7 +216,7 @@ func (k *Keepalived) ensureLinkAddresses(linkName string, expectedAddresses []st
216216
if !slices.Contains(expectedAddresses, strAddrs[i]) {
217217
k.log.Infof("Deleting address %s from link %s", strAddr, linkName)
218218
if err = netlink.AddrDel(link, &linkAddr); err != nil {
219-
return fmt.Errorf("failed to delete address %s from link %s: %v", linkAddr.IPNet.String(), linkName, err)
219+
return fmt.Errorf("failed to delete address %s from link %s: %w", linkAddr.IPNet.String(), linkName, err)
220220
}
221221
}
222222
}
@@ -225,7 +225,7 @@ func (k *Keepalived) ensureLinkAddresses(linkName string, expectedAddresses []st
225225
for _, addr := range expectedAddresses {
226226
if !slices.Contains(strAddrs, addr) {
227227
if err = k.setLinkIP(addr, linkName, link); err != nil {
228-
return fmt.Errorf("failed to add address %s to link %s: %v", addr, linkName, err)
228+
return fmt.Errorf("failed to add address %s to link %s: %w", addr, linkName, err)
229229
}
230230
}
231231
}
@@ -236,7 +236,7 @@ func (k *Keepalived) ensureLinkAddresses(linkName string, expectedAddresses []st
236236
func (k *Keepalived) setLinkIP(addr string, linkName string, link netlink.Link) error {
237237
ipAddr, _, err := net.ParseCIDR(addr)
238238
if err != nil {
239-
return fmt.Errorf("failed to parse CIDR %s: %v", addr, err)
239+
return fmt.Errorf("failed to parse CIDR %s: %w", addr, err)
240240
}
241241

242242
var mask net.IPMask
@@ -255,15 +255,15 @@ func (k *Keepalived) setLinkIP(addr string, linkName string, link netlink.Link)
255255

256256
k.log.Infof("Adding address %s to link %s", addr, linkName)
257257
if err := netlink.AddrAdd(link, linkAddr); err != nil {
258-
return fmt.Errorf("failed to add address %s to link %s: %v", addr, linkName, err)
258+
return fmt.Errorf("failed to add address %s to link %s: %w", addr, linkName, err)
259259
}
260260
return nil
261261
}
262262

263263
func (*Keepalived) getLinkAddresses(link netlink.Link) ([]netlink.Addr, []string, error) {
264264
linkAddrs, err := netlink.AddrList(link, netlink.FAMILY_ALL)
265265
if err != nil {
266-
return nil, nil, fmt.Errorf("failed to list addresses for link %s: %v", link.Attrs().Name, err)
266+
return nil, nil, fmt.Errorf("failed to list addresses for link %s: %w", link.Attrs().Name, err)
267267
}
268268

269269
strAddrs := make([]string, len(linkAddrs))
@@ -276,28 +276,28 @@ func (*Keepalived) getLinkAddresses(link netlink.Link) ([]netlink.Addr, []string
276276
func (k *Keepalived) generateKeepalivedTemplate() error {
277277
f, err := os.OpenFile(k.K0sVars.KeepalivedConfigFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, fs.FileMode(0500))
278278
if err != nil {
279-
return fmt.Errorf("failed to open keepalived config file: %v", err)
279+
return fmt.Errorf("failed to open keepalived config file: %w", err)
280280
}
281281
defer f.Close()
282282

283283
template, err := template.New("keepalived").Parse(keepalivedConfigTemplate)
284284
if err != nil {
285-
return fmt.Errorf("failed to parse keepalived template: %v", err)
285+
return fmt.Errorf("failed to parse keepalived template: %w", err)
286286
}
287287

288288
kc := keepalivedConfig{
289289
VRRPInstances: k.Config.VRRPInstances,
290290
}
291291
if err = template.Execute(f, kc); err != nil {
292-
return fmt.Errorf("failed to execute keepalived template: %v", err)
292+
return fmt.Errorf("failed to execute keepalived template: %w", err)
293293
}
294294

295295
// TODO: Do we really need to this every single time?
296296
if err = os.Chown(k.K0sVars.KeepalivedConfigFile, k.uid, -1); err != nil {
297-
return fmt.Errorf("failed to chown keepalived config file: %v", err)
297+
return fmt.Errorf("failed to chown keepalived config file: %w", err)
298298
}
299299
if err = os.Chmod(k.K0sVars.KeepalivedConfigFile, fs.FileMode(0400)); err != nil {
300-
return fmt.Errorf("failed to chmod keepalived config file: %v", err)
300+
return fmt.Errorf("failed to chmod keepalived config file: %w", err)
301301
}
302302
return nil
303303
}

pkg/component/controller/workerconfig/reconciler_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ func TestReconciler_runReconcileLoop(t *testing.T) {
583583

584584
underTest.runReconcileLoop(ctx, updates, nil)
585585

586-
switch ctx.Err() {
586+
switch ctx.Err() { //nolint:errorlint // as per context contract
587587
case context.Canceled:
588588
break // this is the good case
589589
case context.DeadlineExceeded:

pkg/component/status/status.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package status
1919
import (
2020
"context"
2121
"encoding/json"
22+
"errors"
2223
"fmt"
2324
"net"
2425
"net/http"
@@ -104,7 +105,7 @@ func removeLeftovers(socket string) {
104105
// Start runs the component
105106
func (s *Status) Start(_ context.Context) error {
106107
go func() {
107-
if err := s.httpserver.Serve(s.listener); err != nil && err != http.ErrServerClosed {
108+
if err := s.httpserver.Serve(s.listener); err != nil && !errors.Is(err, http.ErrServerClosed) {
108109
s.L.Errorf("failed to start status server at %s: %s", s.Socket, err)
109110
}
110111
}()
@@ -115,7 +116,7 @@ func (s *Status) Start(_ context.Context) error {
115116
func (s *Status) Stop() error {
116117
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
117118
defer cancel()
118-
if err := s.httpserver.Shutdown(ctx); err != nil && err != context.Canceled {
119+
if err := s.httpserver.Shutdown(ctx); err != nil && !errors.Is(err, context.Canceled) {
119120
return err
120121
}
121122
// Unix socket doesn't need to be explicitly removed because it's hadled

pkg/component/worker/static_pods.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ func (s *staticPods) Start(ctx context.Context) error {
362362
srv.Addr = addr
363363

364364
// Fire up the goroutine to accept HTTP connections.
365-
notClosed := func(err error) bool { return err != http.ErrServerClosed }
365+
notClosed := func(err error) bool { return !errors.Is(err, http.ErrServerClosed) }
366366
s.stopped.Add(1)
367367
go func() {
368368
defer s.stopped.Done()

pkg/etcd/client.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package etcd
1919
import (
2020
"context"
2121
"crypto/tls"
22+
"errors"
2223
"fmt"
2324
"time"
2425

@@ -145,7 +146,7 @@ func (c *Client) Health(ctx context.Context) error {
145146
_, err := c.client.Get(ctx, "health")
146147

147148
// permission denied is OK since proposal goes through consensus to get it
148-
if err == nil || err == rpctypes.ErrPermissionDenied {
149+
if err == nil || errors.Is(err, rpctypes.ErrPermissionDenied) {
149150
return nil
150151
}
151152

pkg/install/service.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package install
1818

1919
import (
20+
"errors"
2021
"fmt"
2122
"os"
2223
"strings"
@@ -53,7 +54,7 @@ func InstalledService() (service.Service, error) {
5354
}
5455
_, err = s.Status()
5556

56-
if err != nil && err == service.ErrNotInstalled {
57+
if err != nil && errors.Is(err, service.ErrNotInstalled) {
5758
continue
5859
}
5960
if err != nil {
@@ -123,7 +124,7 @@ func EnsureService(args []string, envVars []string, force bool) error {
123124
if force {
124125
logrus.Infof("Uninstalling %s service", svcConfig.Name)
125126
err = s.Uninstall()
126-
if err != nil && err != service.ErrNotInstalled {
127+
if err != nil && !errors.Is(err, service.ErrNotInstalled) {
127128
logrus.Warnf("failed to uninstall service: %v", err)
128129
}
129130
}

pkg/kubernetes/watch/watcher.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package watch
1818

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
2223
"reflect"
2324
"time"
@@ -393,9 +394,10 @@ func retry(ctx context.Context, errorCallback ErrorCallback, runWatch func(conte
393394
return nil
394395
}
395396

396-
if err, ok := err.(conditionError); ok {
397+
var condErr conditionError
398+
if errors.As(err, &condErr) {
397399
// The user-specified condition returned an error.
398-
return err.error
400+
return condErr.error
399401
}
400402

401403
if ctx.Err() != nil {

0 commit comments

Comments
 (0)