Add errorlint and fix all existing issues (#1855)

This commit is contained in:
Markus Thömmes 2020-10-29 09:14:35 +01:00 committed by GitHub
parent b520ee28a9
commit 565516e224
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 104 additions and 75 deletions

View File

@ -9,6 +9,7 @@ run:
linters: linters:
enable: enable:
- asciicheck - asciicheck
- errorlint
- golint - golint
- gosec - gosec
- prealloc - prealloc

View File

@ -97,7 +97,7 @@ func TestEnqueueInformerFactoryWithFailure(t *testing.T) {
Resource: "caches", Resource: "caches",
} }
inf, _, got := eif.Get(context.Background(), gvr) inf, _, got := eif.Get(context.Background(), gvr)
if got != want { if !errors.Is(got, want) {
t.Fatalf("Get() = %v, wanted %v", got, want) t.Fatalf("Get() = %v, wanted %v", got, want)
} }

View File

@ -110,7 +110,7 @@ func TestInvalidResource(t *testing.T) {
_, _, got := tif.Get(context.Background(), SchemeGroupVersion.WithResource("resources")) _, _, got := tif.Get(context.Background(), SchemeGroupVersion.WithResource("resources"))
if got != errTest { if !errors.Is(got, errTest) {
t.Errorf("Error = %v, want: %v", got, errTest) t.Errorf("Error = %v, want: %v", got, errTest)
} }
} }
@ -124,7 +124,7 @@ func TestAsStructuredWatcherNestedError(t *testing.T) {
wf := duck.AsStructuredWatcher(context.Background(), nwf, &duckv1alpha1.AddressableType{}) wf := duck.AsStructuredWatcher(context.Background(), nwf, &duckv1alpha1.AddressableType{})
_, got := wf(metav1.ListOptions{}) _, got := wf(metav1.ListOptions{})
if got != want { if !errors.Is(got, want) {
t.Errorf("WatchFunc() = %v, wanted %v", got, want) t.Errorf("WatchFunc() = %v, wanted %v", got, want)
} }
} }

View File

@ -17,6 +17,7 @@ limitations under the License.
package duck package duck
import ( import (
"errors"
"testing" "testing"
"encoding/json" "encoding/json"
@ -83,7 +84,7 @@ func TestFromUnstructuredFooable(t *testing.T) {
t.Log("Marshalled:", string(raw)) t.Log("Marshalled:", string(raw))
got := Foo{} got := Foo{}
if err := FromUnstructured(tc.in, &got); err != tc.wantError { if err := FromUnstructured(tc.in, &got); !errors.Is(err, tc.wantError) {
t.Fatal("FromUnstructured() =", err) t.Fatal("FromUnstructured() =", err)
} }
@ -145,7 +146,7 @@ func TestToUnstructured(t *testing.T) {
for _, tc := range tests { for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
got, err := ToUnstructured(tc.in) got, err := ToUnstructured(tc.in)
if err != tc.wantError { if !errors.Is(err, tc.wantError) {
t.Fatal("ToUnstructured() =", err) t.Fatal("ToUnstructured() =", err)
} }

View File

@ -79,17 +79,17 @@ func roundTrip(instance interface{}, input, output Populatable) error {
// Serialize the input to JSON and deserialize that into the provided instance // Serialize the input to JSON and deserialize that into the provided instance
// of the type that we are checking. // of the type that we are checking.
if before, err := json.Marshal(input); err != nil { if before, err := json.Marshal(input); err != nil {
return fmt.Errorf("error serializing duck type %T error: %s", input, err) return fmt.Errorf("error serializing duck type %T error: %w", input, err)
} else if err := json.Unmarshal(before, instance); err != nil { } else if err := json.Unmarshal(before, instance); err != nil {
return fmt.Errorf("error deserializing duck type %T into %T error: %s", input, instance, err) return fmt.Errorf("error deserializing duck type %T into %T error: %w", input, instance, err)
} }
// Serialize the instance we are checking to JSON and deserialize that into the // Serialize the instance we are checking to JSON and deserialize that into the
// output resource. // output resource.
if after, err := json.Marshal(instance); err != nil { if after, err := json.Marshal(instance); err != nil {
return fmt.Errorf("error serializing %T error: %s", instance, err) return fmt.Errorf("error serializing %T error: %w", instance, err)
} else if err := json.Unmarshal(after, output); err != nil { } else if err := json.Unmarshal(after, output); err != nil {
return fmt.Errorf("error deserializing %T into duck type %T error: %s", instance, output, err) return fmt.Errorf("error deserializing %T into duck type %T error: %w", instance, output, err)
} }
return nil return nil

View File

@ -199,7 +199,9 @@ func TestStoreFailedFirstConversionCrashes(t *testing.T) {
cmd := exec.Command(os.Args[0], fmt.Sprintf("-test.run=%s", t.Name())) cmd := exec.Command(os.Args[0], fmt.Sprintf("-test.run=%s", t.Name()))
cmd.Env = append(os.Environ(), "CRASH=1") cmd.Env = append(os.Environ(), "CRASH=1")
err := cmd.Run() err := cmd.Run()
if e, ok := err.(*exec.ExitError); ok && !e.Success() {
var errExit *exec.ExitError
if errors.As(err, &errExit) && !errExit.Success() {
return return
} }
t.Fatal("process should have exited with status 1 - err", err) t.Fatal("process should have exited with status 1 - err", err)

View File

@ -582,6 +582,7 @@ func IsPermanentError(err error) bool {
// Is implements the Is() interface of error. It returns whether the target // Is implements the Is() interface of error. It returns whether the target
// error can be treated as equivalent to a permanentError. // error can be treated as equivalent to a permanentError.
func (permanentError) Is(target error) bool { func (permanentError) Is(target error) bool {
//nolint: errorlint // This check is actually fine.
_, ok := target.(permanentError) _, ok := target.(permanentError)
return ok return ok
} }

View File

@ -104,7 +104,7 @@ func buildGraph(importpaths ...string) (graph, error) {
func CheckNoDependency(ip string, banned []string) error { func CheckNoDependency(ip string, banned []string) error {
g, err := buildGraph(ip) g, err := buildGraph(ip)
if err != nil { if err != nil {
return fmt.Errorf("buildGraph(queue) = %v", err) return fmt.Errorf("buildGraph(queue) = %w", err)
} }
for _, dip := range banned { for _, dip := range banned {
if g.contains(dip) { if g.contains(dip) {
@ -136,7 +136,7 @@ func AssertNoDependency(t *testing.T, banned map[string][]string) {
func CheckOnlyDependencies(ip string, allowed map[string]struct{}) error { func CheckOnlyDependencies(ip string, allowed map[string]struct{}) error {
g, err := buildGraph(ip) g, err := buildGraph(ip)
if err != nil { if err != nil {
return fmt.Errorf("buildGraph(queue) = %v", err) return fmt.Errorf("buildGraph(queue) = %w", err)
} }
for _, name := range g.order() { for _, name := range g.order() {
if _, ok := allowed[name]; !ok { if _, ok := allowed[name]; !ok {

View File

@ -18,6 +18,7 @@ package sharedmain
import ( import (
"context" "context"
"errors"
"flag" "flag"
"log" "log"
"net/http" "net/http"
@ -241,7 +242,7 @@ func MainWithConfig(ctx context.Context, component string, cfg *rest.Config, cto
profilingServer.Shutdown(context.Background()) profilingServer.Shutdown(context.Background())
// Don't forward ErrServerClosed as that indicates we're already shutting down. // Don't forward ErrServerClosed as that indicates we're already shutting down.
if err := eg.Wait(); err != nil && err != http.ErrServerClosed { if err := eg.Wait(); err != nil && !errors.Is(err, http.ErrServerClosed) {
logger.Errorw("Error while running server", zap.Error(err)) logger.Errorw("Error while running server", zap.Error(err))
} }
} }

View File

@ -92,7 +92,7 @@ func (cs *configMapKVStore) Get(ctx context.Context, key string, value interface
} }
err := json.Unmarshal([]byte(v), value) err := json.Unmarshal([]byte(v), value)
if err != nil { if err != nil {
return fmt.Errorf("failed to Unmarshal %q: %v", v, err) return fmt.Errorf("failed to Unmarshal %q: %w", v, err)
} }
return nil return nil
} }
@ -101,7 +101,7 @@ func (cs *configMapKVStore) Get(ctx context.Context, key string, value interface
func (cs *configMapKVStore) Set(ctx context.Context, key string, value interface{}) error { func (cs *configMapKVStore) Set(ctx context.Context, key string, value interface{}) error {
bytes, err := json.Marshal(value) bytes, err := json.Marshal(value)
if err != nil { if err != nil {
return fmt.Errorf("failed to Marshal: %v", err) return fmt.Errorf("failed to Marshal: %w", err)
} }
cs.data[key] = string(bytes) cs.data[key] = string(bytes)
return nil return nil

View File

@ -212,7 +212,7 @@ func UpdateLevelFromConfigMap(logger *zap.SugaredLogger, atomicLevel zap.AtomicL
// reset to global level // reset to global level
loggingCfg, err := zapConfigFromJSON(config.LoggingConfig) loggingCfg, err := zapConfigFromJSON(config.LoggingConfig)
switch { switch {
case err == errEmptyLoggerConfig: case errors.Is(err, errEmptyLoggerConfig):
level = zap.NewAtomicLevel().Level() level = zap.NewAtomicLevel().Level()
case err != nil: case err != nil:
logger.With(zap.Error(err)).Errorf("Failed to parse logger configuration. "+ logger.With(zap.Error(err)).Errorf("Failed to parse logger configuration. "+

View File

@ -85,7 +85,7 @@ func getOpenCensusSecret(component string, lister SecretFetcher) (*corev1.Secret
secret, err = lister("opencensus") secret, err = lister("opencensus")
} }
if err != nil { if err != nil {
return nil, fmt.Errorf("unable to fetch opencensus secret for %q, cannot use requireSecure=true: %+v", component, err) return nil, fmt.Errorf("unable to fetch opencensus secret for %q, cannot use requireSecure=true: %w", component, err)
} }
return secret, nil return secret, nil

View File

@ -18,6 +18,7 @@ package metrics
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@ -739,7 +740,7 @@ func (oc *openCensusFake) Export(stream ocmetrics.MetricsService_ExportServer) e
metricSeen := false metricSeen := false
for { for {
in, err := stream.Recv() in, err := stream.Recv()
if err == io.EOF { if errors.Is(err, io.EOF) {
return nil return nil
} }
if err != nil { if err != nil {

View File

@ -363,7 +363,7 @@ func getStackdriverSecret(ctx context.Context, secretFetcher SecretFetcher) (*co
} }
if secErr != nil { if secErr != nil {
return nil, fmt.Errorf("error getting Secret [%v] in namespace [%v]: %v", secretName, secretNamespace, secErr) return nil, fmt.Errorf("error getting Secret [%v] in namespace [%v]: %w", secretName, secretNamespace, secErr)
} }
return sec, nil return sec, nil

View File

@ -18,6 +18,7 @@ package prober
import ( import (
"context" "context"
"errors"
"net" "net"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -222,7 +223,7 @@ func TestDoAsyncTimeout(t *testing.T) {
if done { if done {
t.Errorf("done was true") t.Errorf("done was true")
} }
if err != wait.ErrWaitTimeout { if !errors.Is(err, wait.ErrWaitTimeout) {
t.Error("Unexpected error =", err) t.Error("Unexpected error =", err)
} }
wch <- arg wch <- arg

View File

@ -18,6 +18,7 @@ package network
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"net" "net"
"net/http" "net/http"
@ -76,7 +77,8 @@ func dialBackOffHelper(ctx context.Context, network, address string, bo wait.Bac
for { for {
c, err := dialer.DialContext(ctx, network, address) c, err := dialer.DialContext(ctx, network, address)
if err != nil { if err != nil {
if err, ok := err.(net.Error); ok && err.Timeout() { var errNet net.Error
if errors.As(err, &errNet) && errNet.Timeout() {
if bo.Steps < 1 { if bo.Steps < 1 {
break break
} }

View File

@ -163,7 +163,7 @@ func TestParallelismWithErrors(t *testing.T) {
time.Sleep(10 * time.Millisecond) time.Sleep(10 * time.Millisecond)
// Make all unexpected errors wait. // Make all unexpected errors wait.
if err != errExpected { if !errors.Is(err, errExpected) {
<-barrier <-barrier
} }
return err return err
@ -193,7 +193,7 @@ func TestParallelismWithErrors(t *testing.T) {
// remaining work. // remaining work.
wg.Wait() wg.Wait()
if err := p.Wait(); err != errExpected { if err := p.Wait(); !errors.Is(err, errExpected) {
t.Errorf("Wait() = %v, wanted %v", err, errExpected) t.Errorf("Wait() = %v, wanted %v", err, errExpected)
} }
@ -241,7 +241,7 @@ func TestErrorCancelsContext(t *testing.T) {
case <-time.After(100 * time.Millisecond): case <-time.After(100 * time.Millisecond):
t.Error("ctx is not canceled due to the first error") t.Error("ctx is not canceled due to the first error")
} }
if err := pool.Wait(); err != want { if err := pool.Wait(); !errors.Is(err, want) {
t.Fatalf("pool.Wait() = %v, want: %v", err, want) t.Fatalf("pool.Wait() = %v, want: %v", err, want)
} }
} }

View File

@ -75,7 +75,8 @@ var _ error = (*ReconcilerEvent)(nil)
// Is returns if the target error is a ReconcilerEvent type checking that // Is returns if the target error is a ReconcilerEvent type checking that
// EventType and Reason match. // EventType and Reason match.
func (e *ReconcilerEvent) Is(target error) bool { func (e *ReconcilerEvent) Is(target error) bool {
if t, ok := target.(*ReconcilerEvent); ok { var t *ReconcilerEvent
if errors.As(target, &t) {
if t != nil && t.EventType == e.EventType && t.Reason == e.Reason { if t != nil && t.EventType == e.EventType && t.Reason == e.Reason {
return true return true
} }

View File

@ -69,7 +69,7 @@ func TestRetryUpdateConflicts(t *testing.T) {
return test.returns[i] return test.returns[i]
}) })
if got != test.want { if !errors.Is(got, test.want) {
t.Errorf("RetryUpdateConflicts() = %v, want %v", got, test.want) t.Errorf("RetryUpdateConflicts() = %v, want %v", got, test.want)
} }
if attempts != test.wantAttempts { if attempts != test.wantAttempts {
@ -125,7 +125,7 @@ func TestRetryTestErrors(t *testing.T) {
return test.returns[i] return test.returns[i]
}) })
if got != test.want { if !errors.Is(got, test.want) {
t.Errorf("RetryTestErrors() = %v, want %v", got, test.want) t.Errorf("RetryTestErrors() = %v, want %v", got, test.want)
} }
if attempts != test.wantAttempts { if attempts != test.wantAttempts {

View File

@ -18,6 +18,7 @@ package cmd
import ( import (
"bytes" "bytes"
"errors"
"os/exec" "os/exec"
"strings" "strings"
"sync" "sync"
@ -143,8 +144,10 @@ func runCommandsInParallel(cmdLines ...string) (string, error) {
// getErrorCode extracts the exit code of an *ExitError type // getErrorCode extracts the exit code of an *ExitError type
func getErrorCode(err error) int { func getErrorCode(err error) int {
errorCode := defaultErrCode errorCode := defaultErrCode
if exitError, ok := err.(*exec.ExitError); ok {
errorCode = exitError.ExitCode() var errExit *exec.ExitError
if errors.As(err, &errExit) {
errorCode = errExit.ExitCode()
} }
return errorCode return errorCode
} }

View File

@ -17,6 +17,7 @@ limitations under the License.
package cmd package cmd
import ( import (
"errors"
"reflect" "reflect"
"testing" "testing"
) )
@ -65,7 +66,8 @@ func TestRunCommand(t *testing.T) {
t.Fatalf("Expect %q but actual is %q", c.expectedOutput, out) t.Fatalf("Expect %q but actual is %q", c.expectedOutput, out)
} }
if err != nil { if err != nil {
if ce, ok := err.(*CommandLineError); ok { var ce *CommandLineError
if errors.As(err, &ce) {
if ce.ErrorCode != c.expectedErrorCode { if ce.ErrorCode != c.expectedErrorCode {
t.Fatalf("Expect to get error code %d but got %d", c.expectedErrorCode, ce.ErrorCode) t.Fatalf("Expect to get error code %d but got %d", c.expectedErrorCode, ce.ErrorCode)
} }
@ -130,7 +132,8 @@ func TestRunCommands(t *testing.T) {
t.Fatalf("Expect %q but actual is %q", c.expectedOutput, out) t.Fatalf("Expect %q but actual is %q", c.expectedOutput, out)
} }
if err != nil { if err != nil {
if ce, ok := err.(*CommandLineError); ok { var ce *CommandLineError
if errors.As(err, &ce) {
if ce.ErrorCode != c.expectedErrorCode { if ce.ErrorCode != c.expectedErrorCode {
t.Fatalf("Expect to get error code %d but got %d", c.expectedErrorCode, ce.ErrorCode) t.Fatalf("Expect to get error code %d but got %d", c.expectedErrorCode, ce.ErrorCode)
} }

View File

@ -136,11 +136,11 @@ func (g *GCSClient) getObjectsAttrs(ctx context.Context, bucketName, storagePath
for { for {
attrs, err := it.Next() attrs, err := it.Next()
if err == iterator.Done { if errors.Is(err, iterator.Done) {
break break
} }
if err != nil { if err != nil {
return nil, fmt.Errorf("error iterating: %v", err) return nil, fmt.Errorf("error iterating: %w", err)
} }
allAttrs = append(allAttrs, attrs) allAttrs = append(allAttrs, attrs)
} }

View File

@ -19,6 +19,7 @@ package mock
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"os" "os"
@ -379,7 +380,7 @@ func TestNewStorageBucket(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
err := mockClient.NewStorageBucket(ctx, tt.bkt, tt.projectName) err := mockClient.NewStorageBucket(ctx, tt.bkt, tt.projectName)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -441,7 +442,7 @@ func TestDeleteStorageBucket(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
err := mockClient.DeleteStorageBucket(ctx, tt.bkt, tt.force) err := mockClient.DeleteStorageBucket(ctx, tt.bkt, tt.force)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -568,7 +569,7 @@ func TestListChildrenFiles(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
children, err := mockClient.ListChildrenFiles(ctx, tt.bkt, tt.dir) children, err := mockClient.ListChildrenFiles(ctx, tt.bkt, tt.dir)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -634,7 +635,7 @@ func TestListDirectChildren(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
children, err := mockClient.ListDirectChildren(ctx, tt.bkt, tt.dir) children, err := mockClient.ListDirectChildren(ctx, tt.bkt, tt.dir)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -690,7 +691,7 @@ func TestAttrObject(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
objAttr, err := mockClient.AttrObject(ctx, tt.bkt, tt.objpath) objAttr, err := mockClient.AttrObject(ctx, tt.bkt, tt.objpath)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -781,7 +782,7 @@ func TestCopyObject(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
err := mockClient.CopyObject(ctx, tt.srcBkt, tt.srcObjPath, tt.dstBkt, tt.dstObjPath) err := mockClient.CopyObject(ctx, tt.srcBkt, tt.srcObjPath, tt.dstBkt, tt.dstObjPath)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -843,7 +844,7 @@ func TestReadObject(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
objContent, err := mockClient.ReadObject(ctx, tt.bkt, tt.objpath) objContent, err := mockClient.ReadObject(ctx, tt.bkt, tt.objpath)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -899,7 +900,7 @@ func TestWriteObject(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
n, err := mockClient.WriteObject(ctx, tt.bkt, tt.objpath, tt.content) n, err := mockClient.WriteObject(ctx, tt.bkt, tt.objpath, tt.content)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -955,7 +956,7 @@ func TestDeleteObject(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
err := mockClient.DeleteObject(ctx, tt.bkt, tt.objpath) err := mockClient.DeleteObject(ctx, tt.bkt, tt.objpath)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -1013,7 +1014,7 @@ func TestDownload(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
err := mockClient.Download(ctx, tt.bkt, tt.objPath, file) err := mockClient.Download(ctx, tt.bkt, tt.objPath, file)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
@ -1076,7 +1077,7 @@ func TestUpload(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
t.Run(tt.testname, func(t *testing.T) { t.Run(tt.testname, func(t *testing.T) {
err := mockClient.Upload(ctx, tt.bkt, tt.objPath, file) err := mockClient.Upload(ctx, tt.bkt, tt.objPath, file)
if (tt.err == nil || err == nil) && err != tt.err { if (tt.err == nil || err == nil) && !errors.Is(err, tt.err) {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)
} else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() { } else if (tt.err != nil && err != nil) && tt.err.Error() != err.Error() {
t.Fatalf("expected error %v, got error %v", tt.err, err) t.Fatalf("expected error %v, got error %v", tt.err, err)

View File

@ -20,6 +20,7 @@ package ghutil
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
@ -119,10 +120,11 @@ func (gc *GithubClient) retry(message string, maxRetries int, call func() (*gith
if resp, err = call(); nil == err { if resp, err = call(); nil == err {
return resp, nil return resp, nil
} }
switch err := err.(type) {
case *github.RateLimitError: var errRateLimit *github.RateLimitError
gc.waitForRateReset(&err.Rate) if errors.As(err, &errRateLimit) {
default: gc.waitForRateReset(&errRateLimit.Rate)
} else {
return resp, err return resp, err
} }
log.Printf("error %s: %v. Will retry.\n", message, err) log.Printf("error %s: %v. Will retry.\n", message, err)

View File

@ -45,7 +45,7 @@ type sdkClient struct {
func NewSDKClient(opts ...option.ClientOption) (SDKOperations, error) { func NewSDKClient(opts ...option.ClientOption) (SDKOperations, error) {
containerService, err := container.NewService(context.Background(), opts...) containerService, err := container.NewService(context.Background(), opts...)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create container service: '%v'", err) return nil, fmt.Errorf("failed to create container service: %w", err)
} }
return &sdkClient{containerService}, nil return &sdkClient{containerService}, nil
} }
@ -110,7 +110,7 @@ func (gsc *sdkClient) ListClustersInProject(project string) ([]*container.Cluste
projectFullPath := fmt.Sprintf("projects/%s/locations/-", project) projectFullPath := fmt.Sprintf("projects/%s/locations/-", project)
resp, err := gsc.Projects.Locations.Clusters.List(projectFullPath).Do() resp, err := gsc.Projects.Locations.Clusters.List(projectFullPath).Do()
if err != nil { if err != nil {
return clusters, fmt.Errorf("failed to list clusters under project %s: %v", project, err) return clusters, fmt.Errorf("failed to list clusters under project %s: %w", project, err)
} }
return resp.Clusters, nil return resp.Clusters, nil
} }

View File

@ -47,7 +47,7 @@ func (e Env) PromoteFromEnv(envVars ...string) error {
for _, env := range envVars { for _, env := range envVars {
v := os.Getenv(env) v := os.Getenv(env)
if v == "" { if v == "" {
err = fmt.Errorf("environment variable %q is not set; %v", env, err) err = fmt.Errorf("environment variable %q is not set; %w", env, err)
} else { } else {
e[env] = v e[env] = v
} }

View File

@ -122,7 +122,7 @@ func TestTLoggerInternals(legacy *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run("errorWithRuntimeCheck "+tt.testName, func(t *TLogger) { t.Run("errorWithRuntimeCheck "+tt.testName, func(t *TLogger) {
e, s, i := t.errorWithRuntimeCheck(tt.inputs...) e, s, i := t.errorWithRuntimeCheck(tt.inputs...)
if e != tt.expectedError { if !errors.Is(e, tt.expectedError) {
t.Error("error did not match", "got", e, "want", tt.expectedError) t.Error("error did not match", "got", e, "want", tt.expectedError)
} }
if s != tt.expectedString { if s != tt.expectedString {

View File

@ -51,6 +51,7 @@ func getBenchmark() (*mpb.BenchmarkInfo, error) {
if koerr != nil { if koerr != nil {
data, err = ioutil.ReadFile(filepath.Join(configMako, env+".config")) data, err = ioutil.ReadFile(filepath.Join(configMako, env+".config"))
if err != nil { if err != nil {
//nolint: errorlint // It's fine not to wrap here.
return nil, fmt.Errorf("cannot load both from kodata and from config mako config map: %s, %s", koerr.Error(), err.Error()) return nil, fmt.Errorf("cannot load both from kodata and from config mako config map: %s, %s", koerr.Error(), err.Error())
} }
} }

View File

@ -19,6 +19,7 @@ package main
import ( import (
"context" "context"
"encoding/csv" "encoding/csv"
"errors"
"flag" "flag"
"fmt" "fmt"
"net/http" "net/http"
@ -158,7 +159,7 @@ func main() {
m.HandleFunc("/close", func(writer http.ResponseWriter, request *http.Request) { m.HandleFunc("/close", func(writer http.ResponseWriter, request *http.Request) {
s.Shutdown(context.Background()) s.Shutdown(context.Background())
}) })
if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed { if err := s.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Fatal(err) log.Fatal(err)
} }
fmt.Println("Successfully served the results") fmt.Println("Successfully served the results")

View File

@ -19,13 +19,20 @@ limitations under the License.
package spoof package spoof
import ( import (
"errors"
"net" "net"
"strings" "strings"
) )
func isTCPTimeout(e error) bool { func isTCPTimeout(err error) bool {
err, ok := e.(net.Error) if err == nil {
return err != nil && ok && err.Timeout() return false
}
var errNet net.Error
if !errors.As(err, &errNet) {
return false
}
return errNet.Timeout()
} }
func isDNSError(err error) bool { func isDNSError(err error) bool {

View File

@ -237,7 +237,8 @@ func (sc *SpoofingClient) logZipkinTrace(spoofResp *Response) {
json, err := zipkin.JSONTrace(traceID /* We don't know the expected number of spans */, -1, 5*time.Second) json, err := zipkin.JSONTrace(traceID /* We don't know the expected number of spans */, -1, 5*time.Second)
if err != nil { if err != nil {
if _, ok := err.(*zipkin.TimeoutError); !ok { var errTimeout *zipkin.TimeoutError
if !errors.As(err, &errTimeout) {
sc.Logf("Error getting zipkin trace: %v", err) sc.Logf("Error getting zipkin trace: %v", err)
} }
} }

View File

@ -45,7 +45,7 @@ func IsProw() bool {
func GetRepoName() (string, error) { func GetRepoName() (string, error) {
out, err := StandardExec("git", "rev-parse", "--show-toplevel") out, err := StandardExec("git", "rev-parse", "--show-toplevel")
if err != nil { if err != nil {
return "", fmt.Errorf("failed git rev-parse --show-toplevel: '%v'", err) return "", fmt.Errorf("failed git rev-parse --show-toplevel: %w", err)
} }
return strings.TrimSpace(path.Base(string(out))), nil return strings.TrimSpace(path.Base(string(out))), nil
} }

View File

@ -19,7 +19,6 @@ package common
import ( import (
"errors" "errors"
"fmt" "fmt"
"reflect"
"testing" "testing"
) )
@ -68,7 +67,7 @@ func TestGetRepoName(t *testing.T) {
"a/b/c/", nil, "c", nil, "a/b/c/", nil, "c", nil,
}, { }, {
// Git error // Git error
"", fmt.Errorf("git error"), "", fmt.Errorf("failed git rev-parse --show-toplevel: 'git error'"), "", fmt.Errorf("git error"), "", fmt.Errorf("failed git rev-parse --show-toplevel: git error"),
}, },
} }
@ -85,7 +84,7 @@ func TestGetRepoName(t *testing.T) {
} }
out, err := GetRepoName() out, err := GetRepoName()
if data.expOut != out || !reflect.DeepEqual(err, data.expErr) { if data.expOut != out || (err != nil && err.Error() != data.expErr.Error()) {
t.Errorf("testing getting repo name with:\n\tmocked git output: '%s'\n\tmocked git err: '%v'\nwant: out - '%s', err - '%v'\ngot: out - '%s', err - '%v'", t.Errorf("testing getting repo name with:\n\tmocked git output: '%s'\n\tmocked git err: '%v'\nwant: out - '%s', err - '%v'\ngot: out - '%s', err - '%v'",
data.out, data.err, data.expOut, data.expErr, out, err) data.out, data.err, data.expOut, data.expErr, out, err)
} }

View File

@ -234,7 +234,7 @@ func (gc *GKECluster) checkEnvironment() error {
if (gc.Request.Project == "" || gc.Request.Project == project) && (gc.Request.ClusterName == "" || gc.Request.ClusterName == clusterName) { if (gc.Request.Project == "" || gc.Request.Project == project) && (gc.Request.ClusterName == "" || gc.Request.ClusterName == clusterName) {
client, err := gc.newGKEClient(project) client, err := gc.newGKEClient(project)
if err != nil { if err != nil {
return fmt.Errorf("failed creating the GKE client: '%v'", err) return fmt.Errorf("failed creating the GKE client: %w", err)
} }
cluster, err := client.GetCluster(project, region, zone, clusterName) cluster, err := client.GetCluster(project, region, zone, clusterName)
if err != nil { if err != nil {

View File

@ -44,7 +44,7 @@ func getResourceName(rt ResourceType) (string, error) {
var resName string var resName string
repoName, err := common.GetRepoName() repoName, err := common.GetRepoName()
if err != nil { if err != nil {
return "", fmt.Errorf("failed getting reponame for forming resource name: '%v'", err) return "", fmt.Errorf("failed getting reponame for forming resource name: %w", err)
} }
resName = fmt.Sprintf("k%s-%s", repoName, string(rt)) resName = fmt.Sprintf("k%s-%s", repoName, string(rt))
if common.IsProw() { if common.IsProw() {

View File

@ -92,7 +92,7 @@ func Create(o *options.RequestWrapper) (*clm.GKECluster, error) {
clusterOps := gkeClient.Setup(o.Request) clusterOps := gkeClient.Setup(o.Request)
gkeOps := clusterOps.(*clm.GKECluster) gkeOps := clusterOps.(*clm.GKECluster)
if err := gkeOps.Acquire(); err != nil || gkeOps.Cluster == nil { if err := gkeOps.Acquire(); err != nil || gkeOps.Cluster == nil {
return nil, fmt.Errorf("failed acquiring GKE cluster: '%v'", err) return nil, fmt.Errorf("failed acquiring GKE cluster: %w", err)
} }
// At this point we should have a cluster ready to run test. Need to save // At this point we should have a cluster ready to run test. Need to save
@ -104,10 +104,10 @@ func Create(o *options.RequestWrapper) (*clm.GKECluster, error) {
// TODO(chaodaiG): this probably should also be part of clustermanager lib // TODO(chaodaiG): this probably should also be part of clustermanager lib
if out, err := common.StandardExec("gcloud", "beta", "container", "clusters", "get-credentials", if out, err := common.StandardExec("gcloud", "beta", "container", "clusters", "get-credentials",
gkeOps.Cluster.Name, "--region", gkeOps.Cluster.Location, "--project", gkeOps.Project); err != nil { gkeOps.Cluster.Name, "--region", gkeOps.Cluster.Location, "--project", gkeOps.Project); err != nil {
return nil, fmt.Errorf("failed connecting to cluster: %q, '%v'", out, err) return nil, fmt.Errorf("failed connecting to cluster: %q, %w", out, err)
} }
if out, err := common.StandardExec("gcloud", "config", "set", "project", gkeOps.Project); err != nil { if out, err := common.StandardExec("gcloud", "config", "set", "project", gkeOps.Project); err != nil {
return nil, fmt.Errorf("failed setting gcloud: %q, '%v'", out, err) return nil, fmt.Errorf("failed setting gcloud: %q, %w", out, err)
} }
return gkeOps, nil return gkeOps, nil

View File

@ -33,12 +33,12 @@ func Delete(o *options.RequestWrapper) error {
clusterOps := gkeClient.Setup(o.Request) clusterOps := gkeClient.Setup(o.Request)
gkeOps := clusterOps.(*clm.GKECluster) gkeOps := clusterOps.(*clm.GKECluster)
if err := gkeOps.Acquire(); err != nil || gkeOps.Cluster == nil { if err := gkeOps.Acquire(); err != nil || gkeOps.Cluster == nil {
return fmt.Errorf("failed identifying cluster for cleanup: '%v'", err) return fmt.Errorf("failed identifying cluster for cleanup: %w", err)
} }
log.Printf("Identified project %q and cluster %q for removal", gkeOps.Project, gkeOps.Cluster.Name) log.Printf("Identified project %q and cluster %q for removal", gkeOps.Project, gkeOps.Cluster.Name)
var err error var err error
if err = gkeOps.Delete(); err != nil { if err = gkeOps.Delete(); err != nil {
return fmt.Errorf("failed deleting cluster: '%v'", err) return fmt.Errorf("failed deleting cluster: %w", err)
} }
// Unset context with best effort. The first command only unsets current // Unset context with best effort. The first command only unsets current
// context, but doesn't delete the entry from kubeconfig, and should return it's // context, but doesn't delete the entry from kubeconfig, and should return it's

View File

@ -57,7 +57,7 @@ func TestOpenCensusTraceApplyConfigFailingConfigOption(t *testing.T) {
} }
return nil return nil
}) })
if err := oct.ApplyConfig(&config.Config{}); err != coErr { if err := oct.ApplyConfig(&config.Config{}); !errors.Is(err, coErr) {
t.Errorf("Expected error not seen. Got %q. Want %q", err, coErr) t.Errorf("Expected error not seen. Got %q. Want %q", err, coErr)
} }
if err := oct.Finish(); err != nil { if err := oct.Finish(); err != nil {
@ -81,7 +81,7 @@ func TestOpenCensusTraceFinishFailingConfigOption(t *testing.T) {
if err := oct.ApplyConfig(&config.Config{}); err != nil { if err := oct.ApplyConfig(&config.Config{}); err != nil {
t.Errorf("Unexpected error Applying Config: %q", err) t.Errorf("Unexpected error Applying Config: %q", err)
} }
if err := oct.Finish(); err != coErr { if err := oct.Finish(); !errors.Is(err, coErr) {
t.Errorf("Expected error not seen. Got %q. Want %q", err, coErr) t.Errorf("Expected error not seen. Got %q. Want %q", err, coErr)
} }
if err := oct.Finish(); err != nil { if err := oct.Finish(); err != nil {

View File

@ -209,7 +209,7 @@ func (wh *Webhook) Run(stop <-chan struct{}) error {
eg, ctx := errgroup.WithContext(ctx) eg, ctx := errgroup.WithContext(ctx)
eg.Go(func() error { eg.Go(func() error {
if err := server.ListenAndServeTLS("", ""); err != nil && err != http.ErrServerClosed { if err := server.ListenAndServeTLS("", ""); err != nil && !errors.Is(err, http.ErrServerClosed) {
logger.Errorw("ListenAndServeTLS for admission webhook returned error", zap.Error(err)) logger.Errorw("ListenAndServeTLS for admission webhook returned error", zap.Error(err))
return err return err
} }

View File

@ -138,7 +138,7 @@ func TestSendErrorOnNoConnection(t *testing.T) {
conn := &ManagedConnection{} conn := &ManagedConnection{}
got := conn.Send("test") got := conn.Send("test")
if got != want { if !errors.Is(got, want) {
t.Fatalf("Wanted error to be %v, but it was %v.", want, got) t.Fatalf("Wanted error to be %v, but it was %v.", want, got)
} }
} }
@ -149,7 +149,7 @@ func TestStatusOnNoConnection(t *testing.T) {
conn := &ManagedConnection{} conn := &ManagedConnection{}
got := conn.Status() got := conn.Status()
if got != want { if !errors.Is(got, want) {
t.Fatalf("Wanted error to be %v, but it was %v.", want, got) t.Fatalf("Wanted error to be %v, but it was %v.", want, got)
} }
} }
@ -290,7 +290,7 @@ func TestConnectLoopIsStopped(t *testing.T) {
select { select {
case err := <-errorChan: case err := <-errorChan:
if err != errShuttingDown { if !errors.Is(err, errShuttingDown) {
t.Errorf("Wrong 'connect' error, got %v, want %v", err, errShuttingDown) t.Errorf("Wrong 'connect' error, got %v, want %v", err, errShuttingDown)
} }
case <-time.After(propagationTimeout): case <-time.After(propagationTimeout):
@ -316,7 +316,7 @@ func TestKeepaliveLoopIsStopped(t *testing.T) {
select { select {
case err := <-errorChan: case err := <-errorChan:
if err != errShuttingDown { if !errors.Is(err, errShuttingDown) {
t.Errorf("Wrong 'keepalive' error, got %v, want %v", err, errShuttingDown) t.Errorf("Wrong 'keepalive' error, got %v, want %v", err, errShuttingDown)
} }
case <-time.After(propagationTimeout): case <-time.After(propagationTimeout):