diff --git a/hack/check-everything.sh b/hack/check-everything.sh index c6cecf411f..dd8b472fd8 100755 --- a/hack/check-everything.sh +++ b/hack/check-everything.sh @@ -70,11 +70,18 @@ function is_installed { return 1 } +function golangci_lint_has_version { + # Trim "v" from version prefix since golangci-lint --version + # sometimes does not include it, depending on how it's built + golangci-lint --version | grep --quiet --fixed-strings "${1#"v"}" +} + function fetch_go_tools { - header_text "Checking for gometalinter.v2" - if ! is_installed golangci-lint; then + header_text "Checking for golangci-lint" + local golangci_lint_version="v1.21.0" + if ! is_installed golangci-lint || ! golangci_lint_has_version "${golangci_lint_version}"; then header_text "Installing golangci-lint" - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(go env GOPATH)/bin v1.21.0 + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(go env GOPATH)/bin "${golangci_lint_version}" fi } diff --git a/hack/ci-check-everything.sh b/hack/ci-check-everything.sh index c2fdd8e15c..39b85e91d8 100755 --- a/hack/ci-check-everything.sh +++ b/hack/ci-check-everything.sh @@ -16,15 +16,10 @@ set -e -export GO111MODULE=on export TRACE=1 # Not included or existing by default in Prow export PATH=$(go env GOPATH)/bin:$PATH mkdir -p $(go env GOPATH)/bin -echo "Installing golangci-lint" -curl --location --silent --retry 5 --fail https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.21.0 -echo "Finished installing golangci-lint" - $(dirname ${BASH_SOURCE})/check-everything.sh diff --git a/pkg/client/apiutil/dynamicrestmapper.go b/pkg/client/apiutil/dynamicrestmapper.go index 4588fb06cb..ac07db090a 100644 --- a/pkg/client/apiutil/dynamicrestmapper.go +++ b/pkg/client/apiutil/dynamicrestmapper.go @@ -17,11 +17,11 @@ limitations under the License. package apiutil import ( + "errors" "sync" "time" "golang.org/x/time/rate" - "golang.org/x/xerrors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/discovery" @@ -45,7 +45,7 @@ func (e ErrRateLimited) Error() string { // time.Duration value and false are returned if err is not a ErrRateLimited. func DelayIfRateLimited(err error) (time.Duration, bool) { var rlerr ErrRateLimited - if xerrors.As(err, &rlerr) { + if errors.As(err, &rlerr) { return rlerr.Delay, true } return 0, false @@ -182,7 +182,7 @@ func (drm *dynamicRESTMapper) checkAndReload(needsReloadErr error, checkNeedsRel // NB(directxman12): `Is` and `As` have a confusing relationship -- // `Is` is like `== or does this implement .Is`, whereas `As` says // `can I type-assert into` - needsReload := xerrors.As(err, &needsReloadErr) + needsReload := errors.As(err, &needsReloadErr) if !needsReload { return err } @@ -193,7 +193,7 @@ func (drm *dynamicRESTMapper) checkAndReload(needsReloadErr error, checkNeedsRel // ... and double-check that we didn't reload in the meantime err = checkNeedsReload() - needsReload = xerrors.As(err, &needsReloadErr) + needsReload = errors.As(err, &needsReloadErr) if !needsReload { return err } diff --git a/pkg/client/apiutil/dynamicrestmapper_test.go b/pkg/client/apiutil/dynamicrestmapper_test.go index 86b270a375..4ca1735bd7 100644 --- a/pkg/client/apiutil/dynamicrestmapper_test.go +++ b/pkg/client/apiutil/dynamicrestmapper_test.go @@ -1,12 +1,12 @@ package apiutil_test import ( + "errors" "time" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "golang.org/x/time/rate" - "golang.org/x/xerrors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" @@ -82,7 +82,7 @@ var _ = Describe("Dynamic REST Mapper", func() { By("calling another time that would need a requery and failing") Eventually(func() bool { - return xerrors.As(callWithTarget(), &apiutil.ErrRateLimited{}) + return errors.As(callWithTarget(), &apiutil.ErrRateLimited{}) }, "10s").Should(BeTrue()) }) diff --git a/pkg/client/fake/client.go b/pkg/client/fake/client.go index a11fde4e74..b3934a818e 100644 --- a/pkg/client/fake/client.go +++ b/pkg/client/fake/client.go @@ -62,7 +62,7 @@ func NewFakeClientWithScheme(clientScheme *runtime.Scheme, initObjs ...runtime.O for _, obj := range initObjs { err := tracker.Add(obj) if err != nil { - panic(fmt.Errorf("failed to add object %v to fake client: %v", obj, err)) + panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err)) } } return &fakeClient{ diff --git a/pkg/envtest/server.go b/pkg/envtest/server.go index 7eb6fe3519..7a6b6581cf 100644 --- a/pkg/envtest/server.go +++ b/pkg/envtest/server.go @@ -228,7 +228,7 @@ func (te *Environment) Start() (*rest.Config, error) { } if err := te.defaultTimeouts(); err != nil { - return nil, fmt.Errorf("failed to default controlplane timeouts: %v", err) + return nil, fmt.Errorf("failed to default controlplane timeouts: %w", err) } te.ControlPlane.Etcd.StartTimeout = te.ControlPlaneStartTimeout te.ControlPlane.Etcd.StopTimeout = te.ControlPlaneStopTimeout @@ -270,7 +270,7 @@ func (te *Environment) startControlPlane() error { log.Error(err, "unable to start the controlplane", "tries", numTries) } if numTries == maxRetries { - return fmt.Errorf("failed to start the controlplane. retried %d times: %v", numTries, err) + return fmt.Errorf("failed to start the controlplane. retried %d times: %w", numTries, err) } return nil } diff --git a/pkg/internal/recorder/recorder.go b/pkg/internal/recorder/recorder.go index af230ad503..824b0dd993 100644 --- a/pkg/internal/recorder/recorder.go +++ b/pkg/internal/recorder/recorder.go @@ -42,7 +42,7 @@ type provider struct { func NewProvider(config *rest.Config, scheme *runtime.Scheme, logger logr.Logger, broadcaster record.EventBroadcaster) (recorder.Provider, error) { clientSet, err := kubernetes.NewForConfig(config) if err != nil { - return nil, fmt.Errorf("failed to init clientSet: %v", err) + return nil, fmt.Errorf("failed to init clientSet: %w", err) } p := &provider{scheme: scheme, logger: logger, eventBroadcaster: broadcaster} diff --git a/pkg/leaderelection/leader_election.go b/pkg/leaderelection/leader_election.go index b3003ea5e3..67ce1a5541 100644 --- a/pkg/leaderelection/leader_election.go +++ b/pkg/leaderelection/leader_election.go @@ -62,7 +62,7 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op var err error options.LeaderElectionNamespace, err = getInClusterNamespace() if err != nil { - return nil, fmt.Errorf("unable to find leader election namespace: %v", err) + return nil, fmt.Errorf("unable to find leader election namespace: %w", err) } } @@ -98,13 +98,13 @@ func getInClusterNamespace() (string, error) { if os.IsNotExist(err) { return "", fmt.Errorf("not running in-cluster, please specify LeaderElectionNamespace") } else if err != nil { - return "", fmt.Errorf("error checking namespace file: %v", err) + return "", fmt.Errorf("error checking namespace file: %w", err) } // Load the namespace file and return its content namespace, err := ioutil.ReadFile(inClusterNamespacePath) if err != nil { - return "", fmt.Errorf("error reading namespace file: %v", err) + return "", fmt.Errorf("error reading namespace file: %w", err) } return string(namespace), nil } diff --git a/pkg/metrics/listener.go b/pkg/metrics/listener.go index 693bff8413..7878026802 100644 --- a/pkg/metrics/listener.go +++ b/pkg/metrics/listener.go @@ -40,7 +40,7 @@ func NewListener(addr string) (net.Listener, error) { log.Info("metrics server is starting to listen", "addr", addr) ln, err := net.Listen("tcp", addr) if err != nil { - er := fmt.Errorf("error listening on %s: %v", addr, err) + er := fmt.Errorf("error listening on %s: %w", addr, err) log.Error(er, "metrics server failed to listen. You may want to disable the metrics server or use another port if it is due to conflicts") return nil, er } diff --git a/pkg/webhook/admission/multi.go b/pkg/webhook/admission/multi.go index 2ffdb57b00..3b1625c69b 100644 --- a/pkg/webhook/admission/multi.go +++ b/pkg/webhook/admission/multi.go @@ -47,7 +47,7 @@ func (hs multiMutating) Handle(ctx context.Context, req Request) Response { var err error marshaledPatch, err := json.Marshal(patches) if err != nil { - return Errored(http.StatusBadRequest, fmt.Errorf("error when marshaling the patch: %v", err)) + return Errored(http.StatusBadRequest, fmt.Errorf("error when marshaling the patch: %w", err)) } return Response{ AdmissionResponse: admissionv1beta1.AdmissionResponse{ diff --git a/pkg/webhook/conversion/conversion.go b/pkg/webhook/conversion/conversion.go index 718de48b68..af9e673ccb 100644 --- a/pkg/webhook/conversion/conversion.go +++ b/pkg/webhook/conversion/conversion.go @@ -161,12 +161,12 @@ func (wh *Webhook) convertViaHub(src, dst conversion.Convertible) error { err = src.ConvertTo(hub) if err != nil { - return fmt.Errorf("%T failed to convert to hub version %T : %v", src, hub, err) + return fmt.Errorf("%T failed to convert to hub version %T : %w", src, hub, err) } err = dst.ConvertFrom(hub) if err != nil { - return fmt.Errorf("%T failed to convert from hub version %T : %v", dst, hub, err) + return fmt.Errorf("%T failed to convert from hub version %T : %w", dst, hub, err) } return nil @@ -187,7 +187,7 @@ func (wh *Webhook) getHub(obj runtime.Object) (conversion.Hub, error) { for _, gvk := range gvks { instance, err := wh.scheme.New(gvk) if err != nil { - return nil, fmt.Errorf("failed to allocate an instance for gvk %v %v", gvk, err) + return nil, fmt.Errorf("failed to allocate an instance for gvk %v: %w", gvk, err) } if val, isHub := instance.(conversion.Hub); isHub { if hubFoundAlready { @@ -237,7 +237,7 @@ func IsConvertible(scheme *runtime.Scheme, obj runtime.Object) (bool, error) { for _, gvk := range gvks { instance, err := scheme.New(gvk) if err != nil { - return false, fmt.Errorf("failed to allocate an instance for gvk %v %v", gvk, err) + return false, fmt.Errorf("failed to allocate an instance for gvk %v: %w", gvk, err) } if isHub(instance) {