diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 542cd056b..18f66ed3b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,7 +10,7 @@ on: - 'script/gcg/**' env: - GO_VERSION: '1.22' + GO_VERSION: '1.23' CGO_ENABLED: 0 jobs: diff --git a/.github/workflows/experimental.yaml b/.github/workflows/experimental.yaml index 7d9e2e2ea..aadce96a8 100644 --- a/.github/workflows/experimental.yaml +++ b/.github/workflows/experimental.yaml @@ -7,7 +7,7 @@ on: - v* env: - GO_VERSION: '1.22' + GO_VERSION: '1.23' CGO_ENABLED: 0 jobs: diff --git a/.github/workflows/test-integration.yaml b/.github/workflows/test-integration.yaml index c00cad272..10fe2ca44 100644 --- a/.github/workflows/test-integration.yaml +++ b/.github/workflows/test-integration.yaml @@ -10,7 +10,7 @@ on: - 'script/gcg/**' env: - GO_VERSION: '1.22' + GO_VERSION: '1.23' CGO_ENABLED: 0 jobs: diff --git a/.github/workflows/test-unit.yaml b/.github/workflows/test-unit.yaml index a22dc4cda..5550ec1cd 100644 --- a/.github/workflows/test-unit.yaml +++ b/.github/workflows/test-unit.yaml @@ -10,7 +10,7 @@ on: - 'script/gcg/**' env: - GO_VERSION: '1.22' + GO_VERSION: '1.23' jobs: diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml index 641d5b7b9..708b88e24 100644 --- a/.github/workflows/validate.yaml +++ b/.github/workflows/validate.yaml @@ -6,8 +6,8 @@ on: - '*' env: - GO_VERSION: '1.22' - GOLANGCI_LINT_VERSION: v1.59.0 + GO_VERSION: '1.23' + GOLANGCI_LINT_VERSION: v1.60.3 MISSSPELL_VERSION: v0.6.0 jobs: diff --git a/.golangci.yml b/.golangci.yml index 5ad2008a5..c3766eeed 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -200,8 +200,7 @@ linters: - maintidx # kind of duplicate of gocyclo - nonamedreturns # Too strict - gosmopolitan # not relevant - - exportloopref # Useless with go1.22 - - musttag + - exportloopref # Not relevant since go1.22 issues: exclude-use-default: false @@ -281,3 +280,6 @@ issues: - path: pkg/cli/loader_file.go linters: - goconst + - path: pkg/provider/acme/local_store.go + linters: + - musttag diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index b3a9faf0a..57b9fc70d 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -19,13 +19,13 @@ global_job_config: prologue: commands: - curl -sSfL https://raw.githubusercontent.com/ldez/semgo/master/godownloader.sh | sudo sh -s -- -b "/usr/local/bin" - - sudo semgo go1.22 + - sudo semgo go1.23 - export "GOPATH=$(go env GOPATH)" - export "SEMAPHORE_GIT_DIR=${GOPATH}/src/github.com/traefik/${SEMAPHORE_PROJECT_NAME}" - export "PATH=${GOPATH}/bin:${PATH}" - mkdir -vp "${SEMAPHORE_GIT_DIR}" "${GOPATH}/bin" - export GOPROXY=https://proxy.golang.org,direct - - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.59.0 + - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.60.3 - curl -sSfL https://gist.githubusercontent.com/traefiker/6d7ac019c11d011e4f131bb2cca8900e/raw/goreleaser.sh | bash -s -- -b "${GOPATH}/bin" - checkout - cache restore traefik-$(checksum go.sum) diff --git a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml index 657e10d99..cd4f4f88a 100644 --- a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml +++ b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressroutes.traefik.io spec: group: traefik.io @@ -369,7 +369,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressroutetcps.traefik.io spec: group: traefik.io @@ -616,7 +616,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressrouteudps.traefik.io spec: group: traefik.io @@ -727,7 +727,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: middlewares.traefik.io spec: group: traefik.io @@ -1825,7 +1825,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: middlewaretcps.traefik.io spec: group: traefik.io @@ -1912,7 +1912,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: serverstransports.traefik.io spec: group: traefik.io @@ -2051,7 +2051,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: serverstransporttcps.traefik.io spec: group: traefik.io @@ -2171,7 +2171,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: tlsoptions.traefik.io spec: group: traefik.io @@ -2285,7 +2285,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: tlsstores.traefik.io spec: group: traefik.io @@ -2382,7 +2382,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: traefikservices.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml b/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml index c67b4de96..6ce60d68e 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressroutes.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_ingressroutetcps.yaml b/docs/content/reference/dynamic-configuration/traefik.io_ingressroutetcps.yaml index 74d6862a0..9db38f869 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_ingressroutetcps.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_ingressroutetcps.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressroutetcps.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_ingressrouteudps.yaml b/docs/content/reference/dynamic-configuration/traefik.io_ingressrouteudps.yaml index 939ec73e8..9b04a8355 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_ingressrouteudps.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_ingressrouteudps.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressrouteudps.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml b/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml index 16ddfccb4..7bc7f0546 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: middlewares.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_middlewaretcps.yaml b/docs/content/reference/dynamic-configuration/traefik.io_middlewaretcps.yaml index 551e8ca33..f09e3d412 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_middlewaretcps.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_middlewaretcps.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: middlewaretcps.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_serverstransports.yaml b/docs/content/reference/dynamic-configuration/traefik.io_serverstransports.yaml index 38f523f07..a447c97f1 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_serverstransports.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_serverstransports.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: serverstransports.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_serverstransporttcps.yaml b/docs/content/reference/dynamic-configuration/traefik.io_serverstransporttcps.yaml index cb8d65d48..319044709 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_serverstransporttcps.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_serverstransporttcps.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: serverstransporttcps.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_tlsoptions.yaml b/docs/content/reference/dynamic-configuration/traefik.io_tlsoptions.yaml index 29513cb24..932f95811 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_tlsoptions.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_tlsoptions.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: tlsoptions.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_tlsstores.yaml b/docs/content/reference/dynamic-configuration/traefik.io_tlsstores.yaml index 86a3f12ff..37afedc02 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_tlsstores.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_tlsstores.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: tlsstores.traefik.io spec: group: traefik.io diff --git a/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml b/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml index d8cdf5d5d..1e1b279d5 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: traefikservices.traefik.io spec: group: traefik.io diff --git a/go.mod b/go.mod index 87686d822..5ff469aec 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/traefik/traefik/v3 -go 1.22.4 +go 1.23.0 require ( github.com/BurntSushi/toml v1.4.0 diff --git a/integration/fixtures/k8s/01-traefik-crd.yml b/integration/fixtures/k8s/01-traefik-crd.yml index 657e10d99..cd4f4f88a 100644 --- a/integration/fixtures/k8s/01-traefik-crd.yml +++ b/integration/fixtures/k8s/01-traefik-crd.yml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressroutes.traefik.io spec: group: traefik.io @@ -369,7 +369,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressroutetcps.traefik.io spec: group: traefik.io @@ -616,7 +616,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: ingressrouteudps.traefik.io spec: group: traefik.io @@ -727,7 +727,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: middlewares.traefik.io spec: group: traefik.io @@ -1825,7 +1825,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: middlewaretcps.traefik.io spec: group: traefik.io @@ -1912,7 +1912,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: serverstransports.traefik.io spec: group: traefik.io @@ -2051,7 +2051,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: serverstransporttcps.traefik.io spec: group: traefik.io @@ -2171,7 +2171,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: tlsoptions.traefik.io spec: group: traefik.io @@ -2285,7 +2285,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: tlsstores.traefik.io spec: group: traefik.io @@ -2382,7 +2382,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.16.1 name: traefikservices.traefik.io spec: group: traefik.io diff --git a/integration/tracing_test.go b/integration/tracing_test.go index 4849034b8..7d1d0ff0b 100644 --- a/integration/tracing_test.go +++ b/integration/tracing_test.go @@ -663,7 +663,7 @@ func (s *TracingSuite) TestNoInternals() { err = json.Unmarshal(content, &out) require.NoError(s.T(), err) - s.NotEmptyf(len(out.Traces), "expected at least one trace") + s.NotEmptyf(out.Traces, "expected at least one trace") for _, t := range out.Traces { baseURL, err := url.Parse("http://" + s.tempoIP + ":3200/api/traces/" + t.TraceID) @@ -705,7 +705,7 @@ func (s *TracingSuite) checkTraceContent(expectedJSON []map[string]string) { err = json.Unmarshal(content, &out) require.NoError(s.T(), err) - s.NotEmptyf(len(out.Traces), "expected at least one trace") + s.NotEmptyf(out.Traces, "expected at least one trace") var contents []string for _, t := range out.Traces { diff --git a/pkg/api/criterion.go b/pkg/api/criterion.go index 7f9ba3e02..ba04c784e 100644 --- a/pkg/api/criterion.go +++ b/pkg/api/criterion.go @@ -93,7 +93,7 @@ func (c *searchCriterion) filterMiddleware(mns []string) bool { return false } -func pagination(request *http.Request, max int) (pageInfo, error) { +func pagination(request *http.Request, maximum int) (pageInfo, error) { perPage, err := getIntParam(request, "per_page", defaultPerPage) if err != nil { return pageInfo{}, err @@ -105,17 +105,17 @@ func pagination(request *http.Request, max int) (pageInfo, error) { } startIndex := (page - 1) * perPage - if startIndex != 0 && startIndex >= max { + if startIndex != 0 && startIndex >= maximum { return pageInfo{}, fmt.Errorf("invalid request: page: %d, per_page: %d", page, perPage) } endIndex := startIndex + perPage - if endIndex >= max { - endIndex = max + if endIndex >= maximum { + endIndex = maximum } nextPage := 1 - if page*perPage < max { + if page*perPage < maximum { nextPage = page + 1 } diff --git a/pkg/collector/collector.go b/pkg/collector/collector.go index 4db377e4f..4a2ebc0ec 100644 --- a/pkg/collector/collector.go +++ b/pkg/collector/collector.go @@ -21,11 +21,11 @@ const collectorURL = "https://collect.traefik.io/yYaUej3P42cziRVzv6T5w2aYy9po2Mr // Collected data. type data struct { - Version string - Codename string - BuildDate string - Configuration string - Hash string + Version string `json:"version"` + Codename string `json:"codename"` + BuildDate string `json:"buildDate"` + Configuration string `json:"configuration"` + Hash string `json:"hash"` } // Collect anonymous data. diff --git a/pkg/middlewares/accesslog/logger_test.go b/pkg/middlewares/accesslog/logger_test.go index c5a6102b7..ae72cd365 100644 --- a/pkg/middlewares/accesslog/logger_test.go +++ b/pkg/middlewares/accesslog/logger_test.go @@ -199,7 +199,7 @@ func TestLoggerHeaderFields(t *testing.T) { if config.FilePath != "" { _, err = os.Stat(config.FilePath) - require.NoError(t, err, fmt.Sprintf("logger should create %s", config.FilePath)) + require.NoErrorf(t, err, "logger should create %s", config.FilePath) } req := &http.Request{ @@ -704,7 +704,7 @@ func assertValidLogData(t *testing.T, expected string, logData []byte) { t.Helper() if len(expected) == 0 { - assert.Zero(t, len(logData)) + assert.Empty(t, logData) t.Log(string(logData)) return } @@ -761,7 +761,7 @@ func doLoggingTLSOpt(t *testing.T, config *types.AccessLog, enableTLS bool) { if config.FilePath != "" { _, err = os.Stat(config.FilePath) - require.NoError(t, err, fmt.Sprintf("logger should create %s", config.FilePath)) + require.NoErrorf(t, err, "logger should create %s", config.FilePath) } req := &http.Request{ diff --git a/pkg/middlewares/auth/forward.go b/pkg/middlewares/auth/forward.go index 26053a50e..ee9e01a6e 100644 --- a/pkg/middlewares/auth/forward.go +++ b/pkg/middlewares/auth/forward.go @@ -125,9 +125,9 @@ func (fa *forwardAuth) ServeHTTP(rw http.ResponseWriter, req *http.Request) { forwardReq, err := http.NewRequestWithContext(req.Context(), http.MethodGet, fa.address, nil) if err != nil { - logMessage := fmt.Sprintf("Error calling %s. Cause %s", fa.address, err) - logger.Debug().Msg(logMessage) - observability.SetStatusErrorf(req.Context(), logMessage) + logger.Debug().Msgf("Error calling %s. Cause %s", fa.address, err) + observability.SetStatusErrorf(req.Context(), "Error calling %s. Cause %s", fa.address, err) + rw.WriteHeader(http.StatusInternalServerError) return } @@ -149,9 +149,8 @@ func (fa *forwardAuth) ServeHTTP(rw http.ResponseWriter, req *http.Request) { forwardResponse, forwardErr := fa.client.Do(forwardReq) if forwardErr != nil { - logMessage := fmt.Sprintf("Error calling %s. Cause: %s", fa.address, forwardErr) - logger.Debug().Msg(logMessage) - observability.SetStatusErrorf(forwardReq.Context(), logMessage) + logger.Debug().Msgf("Error calling %s. Cause: %s", fa.address, forwardErr) + observability.SetStatusErrorf(req.Context(), "Error calling %s. Cause: %s", fa.address, forwardErr) rw.WriteHeader(http.StatusInternalServerError) return @@ -160,9 +159,8 @@ func (fa *forwardAuth) ServeHTTP(rw http.ResponseWriter, req *http.Request) { body, readError := io.ReadAll(forwardResponse.Body) if readError != nil { - logMessage := fmt.Sprintf("Error reading body %s. Cause: %s", fa.address, readError) - logger.Debug().Msg(logMessage) - observability.SetStatusErrorf(forwardReq.Context(), logMessage) + logger.Debug().Msgf("Error reading body %s. Cause: %s", fa.address, readError) + observability.SetStatusErrorf(req.Context(), "Error reading body %s. Cause: %s", fa.address, readError) rw.WriteHeader(http.StatusInternalServerError) return @@ -187,9 +185,8 @@ func (fa *forwardAuth) ServeHTTP(rw http.ResponseWriter, req *http.Request) { if err != nil { if !errors.Is(err, http.ErrNoLocation) { - logMessage := fmt.Sprintf("Error reading response location header %s. Cause: %s", fa.address, err) - logger.Debug().Msg(logMessage) - observability.SetStatusErrorf(forwardReq.Context(), logMessage) + logger.Debug().Msgf("Error reading response location header %s. Cause: %s", fa.address, err) + observability.SetStatusErrorf(req.Context(), "Error reading response location header %s. Cause: %s", fa.address, err) rw.WriteHeader(http.StatusInternalServerError) return diff --git a/pkg/middlewares/compress/compression_handler.go b/pkg/middlewares/compress/compression_handler.go index 78214acc5..98ca21c9c 100644 --- a/pkg/middlewares/compress/compression_handler.go +++ b/pkg/middlewares/compress/compression_handler.go @@ -95,9 +95,8 @@ func (c *CompressionHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) compressionWriter, err := newCompressionWriter(c.cfg.Algorithm, rw) if err != nil { logger := middlewares.GetLogger(r.Context(), c.cfg.MiddlewareName, typeName) - logMessage := fmt.Sprintf("create compression handler: %v", err) - logger.Debug().Msg(logMessage) - observability.SetStatusErrorf(r.Context(), logMessage) + logger.Debug().Msgf("Create compression handler: %v", err) + observability.SetStatusErrorf(r.Context(), "Create compression handler: %v", err) rw.WriteHeader(http.StatusInternalServerError) return } diff --git a/pkg/middlewares/customerrors/custom_errors.go b/pkg/middlewares/customerrors/custom_errors.go index dbd66718a..b985b6326 100644 --- a/pkg/middlewares/customerrors/custom_errors.go +++ b/pkg/middlewares/customerrors/custom_errors.go @@ -70,8 +70,8 @@ func (c *customErrors) ServeHTTP(rw http.ResponseWriter, req *http.Request) { logger := middlewares.GetLogger(req.Context(), c.name, typeName) if c.backendHandler == nil { - logger.Error().Msg("Error pages: no backend handler.") - observability.SetStatusErrorf(req.Context(), "Error pages: no backend handler.") + logger.Error().Msg("No backend handler.") + observability.SetStatusErrorf(req.Context(), "No backend handler.") c.next.ServeHTTP(rw, req) return } @@ -95,8 +95,8 @@ func (c *customErrors) ServeHTTP(rw http.ResponseWriter, req *http.Request) { pageReq, err := newRequest("http://" + req.Host + query) if err != nil { - logger.Error().Err(err).Send() - observability.SetStatusErrorf(req.Context(), err.Error()) + logger.Error().Msgf("Unable to create error page request: %v", err) + observability.SetStatusErrorf(req.Context(), "Unable to create error page request: %v", err) http.Error(rw, http.StatusText(code), code) return } diff --git a/pkg/middlewares/ipallowlist/ip_allowlist.go b/pkg/middlewares/ipallowlist/ip_allowlist.go index d7cee8443..46f17c74c 100644 --- a/pkg/middlewares/ipallowlist/ip_allowlist.go +++ b/pkg/middlewares/ipallowlist/ip_allowlist.go @@ -76,9 +76,8 @@ func (al *ipAllowLister) ServeHTTP(rw http.ResponseWriter, req *http.Request) { clientIP := al.strategy.GetIP(req) err := al.allowLister.IsAuthorized(clientIP) if err != nil { - msg := fmt.Sprintf("Rejecting IP %s: %v", clientIP, err) - logger.Debug().Msg(msg) - observability.SetStatusErrorf(req.Context(), msg) + logger.Debug().Msgf("Rejecting IP %s: %v", clientIP, err) + observability.SetStatusErrorf(req.Context(), "Rejecting IP %s: %v", clientIP, err) reject(ctx, al.rejectStatusCode, rw) return } diff --git a/pkg/middlewares/ipwhitelist/ip_whitelist.go b/pkg/middlewares/ipwhitelist/ip_whitelist.go index 6a74aebfb..d8e3dadb3 100644 --- a/pkg/middlewares/ipwhitelist/ip_whitelist.go +++ b/pkg/middlewares/ipwhitelist/ip_whitelist.go @@ -66,9 +66,8 @@ func (wl *ipWhiteLister) ServeHTTP(rw http.ResponseWriter, req *http.Request) { clientIP := wl.strategy.GetIP(req) err := wl.whiteLister.IsAuthorized(clientIP) if err != nil { - msg := fmt.Sprintf("Rejecting IP %s: %v", clientIP, err) - logger.Debug().Msg(msg) - observability.SetStatusErrorf(req.Context(), msg) + logger.Debug().Msgf("Rejecting IP %s: %v", clientIP, err) + observability.SetStatusErrorf(req.Context(), "Rejecting IP %s: %v", clientIP, err) reject(ctx, rw) return } diff --git a/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go b/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go index dde36280d..20b4f087c 100644 --- a/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go +++ b/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go @@ -319,7 +319,7 @@ func TestPassTLSClientCert_PEM(t *testing.T) { res := httptest.NewRecorder() req := testhelpers.MustNewRequest(http.MethodGet, "http://example.com/foo", nil) - if test.certContents != nil && len(test.certContents) > 0 { + if len(test.certContents) > 0 { req.TLS = buildTLSWith(test.certContents) } @@ -541,7 +541,7 @@ func TestPassTLSClientCert_certInfo(t *testing.T) { res := httptest.NewRecorder() req := testhelpers.MustNewRequest(http.MethodGet, "http://example.com/foo", nil) - if test.certContents != nil && len(test.certContents) > 0 { + if len(test.certContents) > 0 { req.TLS = buildTLSWith(test.certContents) } diff --git a/pkg/middlewares/replacepath/replace_path.go b/pkg/middlewares/replacepath/replace_path.go index 662c5f5d3..9c8e404d4 100644 --- a/pkg/middlewares/replacepath/replace_path.go +++ b/pkg/middlewares/replacepath/replace_path.go @@ -51,8 +51,8 @@ func (r *replacePath) ServeHTTP(rw http.ResponseWriter, req *http.Request) { var err error req.URL.Path, err = url.PathUnescape(req.URL.RawPath) if err != nil { - middlewares.GetLogger(context.Background(), r.name, typeName).Error().Err(err).Send() - observability.SetStatusErrorf(req.Context(), err.Error()) + middlewares.GetLogger(context.Background(), r.name, typeName).Error().Msgf("Unable to unescape url raw path %q: %v", req.URL.RawPath, err) + observability.SetStatusErrorf(req.Context(), "Unable to unescape url raw path %q: %v", req.URL.RawPath, err) http.Error(rw, err.Error(), http.StatusInternalServerError) return } diff --git a/pkg/middlewares/replacepathregex/replace_path_regex.go b/pkg/middlewares/replacepathregex/replace_path_regex.go index 1e0d0708b..f04e9d9a0 100644 --- a/pkg/middlewares/replacepathregex/replace_path_regex.go +++ b/pkg/middlewares/replacepathregex/replace_path_regex.go @@ -62,8 +62,8 @@ func (rp *replacePathRegex) ServeHTTP(rw http.ResponseWriter, req *http.Request) var err error req.URL.Path, err = url.PathUnescape(req.URL.RawPath) if err != nil { - middlewares.GetLogger(context.Background(), rp.name, typeName).Error().Err(err).Send() - observability.SetStatusErrorf(req.Context(), err.Error()) + middlewares.GetLogger(context.Background(), rp.name, typeName).Error().Msgf("Unable to unescape url raw path %q: %v", req.URL.RawPath, err) + observability.SetStatusErrorf(req.Context(), "Unable to unescape url raw path %q: %v", req.URL.RawPath, err) http.Error(rw, err.Error(), http.StatusInternalServerError) return } diff --git a/pkg/provider/docker/shared.go b/pkg/provider/docker/shared.go index 74bcc62a1..86c0f2080 100644 --- a/pkg/provider/docker/shared.go +++ b/pkg/provider/docker/shared.go @@ -193,8 +193,7 @@ func getPort(container dockerData, serverPort string) string { nat.Sort(ports, less) if len(ports) > 0 { - min := ports[0] - return min.Port() + return ports[0].Port() } return "" diff --git a/pkg/provider/ecs/config.go b/pkg/provider/ecs/config.go index e53c7480e..028a3a1d7 100644 --- a/pkg/provider/ecs/config.go +++ b/pkg/provider/ecs/config.go @@ -316,8 +316,7 @@ func getPort(instance ecsInstance, serverPort string) string { nat.Sort(ports, less) if len(ports) > 0 { - min := ports[0] - return min.Port() + return ports[0].Port() } return "" diff --git a/pkg/tcp/wrr_load_balancer.go b/pkg/tcp/wrr_load_balancer.go index e4eb9650e..93d43a4fb 100644 --- a/pkg/tcp/wrr_load_balancer.go +++ b/pkg/tcp/wrr_load_balancer.go @@ -7,6 +7,8 @@ import ( "github.com/rs/zerolog/log" ) +var errNoServersInPool = errors.New("no servers in the pool") + type server struct { Handler weight int @@ -34,8 +36,10 @@ func (b *WRRLoadBalancer) ServeTCP(conn WriteCloser) { b.lock.Unlock() if err != nil { - log.Error().Err(err).Msg("Error during load balancing") - conn.Close() + if !errors.Is(err, errNoServersInPool) { + log.Error().Err(err).Msg("Error during load balancing") + } + _ = conn.Close() return } @@ -61,13 +65,13 @@ func (b *WRRLoadBalancer) AddWeightServer(serverHandler Handler, weight *int) { } func (b *WRRLoadBalancer) maxWeight() int { - max := -1 + maximum := -1 for _, s := range b.servers { - if s.weight > max { - max = s.weight + if s.weight > maximum { + maximum = s.weight } } - return max + return maximum } func (b *WRRLoadBalancer) weightGcd() int { @@ -91,7 +95,7 @@ func gcd(a, b int) int { func (b *WRRLoadBalancer) next() (Handler, error) { if len(b.servers) == 0 { - return nil, errors.New("no servers in the pool") + return nil, errNoServersInPool } // The algo below may look messy, but is actually very simple @@ -99,8 +103,8 @@ func (b *WRRLoadBalancer) next() (Handler, error) { // and allows us not to build an iterator every time we readjust weights // Maximum weight across all enabled servers - max := b.maxWeight() - if max == 0 { + maximum := b.maxWeight() + if maximum == 0 { return nil, errors.New("all servers have 0 weight") } @@ -112,7 +116,7 @@ func (b *WRRLoadBalancer) next() (Handler, error) { if b.index == 0 { b.currentWeight -= gcd if b.currentWeight <= 0 { - b.currentWeight = max + b.currentWeight = maximum } } srv := b.servers[b.index] diff --git a/pkg/udp/wrr_load_balancer.go b/pkg/udp/wrr_load_balancer.go index 8ea6357c8..19c1b0218 100644 --- a/pkg/udp/wrr_load_balancer.go +++ b/pkg/udp/wrr_load_balancer.go @@ -61,13 +61,13 @@ func (b *WRRLoadBalancer) AddWeightedServer(serverHandler Handler, weight *int) } func (b *WRRLoadBalancer) maxWeight() int { - max := -1 + maximum := -1 for _, s := range b.servers { - if s.weight > max { - max = s.weight + if s.weight > maximum { + maximum = s.weight } } - return max + return maximum } func (b *WRRLoadBalancer) weightGcd() int { @@ -99,8 +99,8 @@ func (b *WRRLoadBalancer) next() (Handler, error) { // what interleaves servers and allows us not to build an iterator every time we readjust weights. // Maximum weight across all enabled servers - max := b.maxWeight() - if max == 0 { + maximum := b.maxWeight() + if maximum == 0 { return nil, errors.New("all servers have 0 weight") } @@ -112,7 +112,7 @@ func (b *WRRLoadBalancer) next() (Handler, error) { if b.index == 0 { b.currentWeight -= gcd if b.currentWeight <= 0 { - b.currentWeight = max + b.currentWeight = maximum } } srv := b.servers[b.index] diff --git a/script/code-gen-docker.sh b/script/code-gen-docker.sh index fe425a6be..86b99d602 100755 --- a/script/code-gen-docker.sh +++ b/script/code-gen-docker.sh @@ -9,7 +9,7 @@ IMAGE_NAME="kubernetes-codegen:latest" CURRENT_DIR="$(pwd)" echo "Building codegen Docker image..." -docker build --build-arg KUBE_VERSION=v0.29.1 \ +docker build --build-arg KUBE_VERSION=v0.29.8 \ --build-arg USER="${USER}" \ --build-arg UID="$(id -u)" \ --build-arg GID="$(id -g)" \ diff --git a/script/codegen.Dockerfile b/script/codegen.Dockerfile index 315d349c1..0d36ef63f 100644 --- a/script/codegen.Dockerfile +++ b/script/codegen.Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22 +FROM golang:1.23 ARG USER=$USER ARG UID=$UID @@ -13,7 +13,7 @@ RUN go install k8s.io/code-generator/cmd/client-gen@$KUBE_VERSION RUN go install k8s.io/code-generator/cmd/lister-gen@$KUBE_VERSION RUN go install k8s.io/code-generator/cmd/informer-gen@$KUBE_VERSION RUN go install k8s.io/code-generator/cmd/deepcopy-gen@$KUBE_VERSION -RUN go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.14.0 +RUN go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.16.1 RUN mkdir -p $GOPATH/src/k8s.io/code-generator RUN cp -R $GOPATH/pkg/mod/k8s.io/code-generator@$KUBE_VERSION/* $GOPATH/src/k8s.io/code-generator/ diff --git a/webui/package.json b/webui/package.json index c1a8afe21..c18cfb047 100644 --- a/webui/package.json +++ b/webui/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@quasar/extras": "^1.16.12", - "axios": "^1.7.2", + "axios": "^1.7.4", "bowser": "^2.11.0", "chart.js": "^4.4.1", "core-js": "^3.35.1", diff --git a/webui/yarn.lock b/webui/yarn.lock index 0b5eff401..88b6bac4f 100644 --- a/webui/yarn.lock +++ b/webui/yarn.lock @@ -2151,10 +2151,10 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axios@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== +axios@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" + integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0"