From a0654afa9700f77086a2ac46c9a284cf96e6a708 Mon Sep 17 00:00:00 2001 From: "Gina A." <70909035+gndz07@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:12:15 +0100 Subject: [PATCH 01/20] Fix basePath validation for dashboard template --- pkg/api/dashboard/dashboard.go | 2 +- pkg/config/static/static_config.go | 9 ++- pkg/config/static/static_config_test.go | 86 +++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/pkg/api/dashboard/dashboard.go b/pkg/api/dashboard/dashboard.go index 8c344bbd5d..d5c5c10129 100644 --- a/pkg/api/dashboard/dashboard.go +++ b/pkg/api/dashboard/dashboard.go @@ -2,11 +2,11 @@ package dashboard import ( "fmt" + "html/template" "io/fs" "net/http" "net/url" "strings" - "text/template" "github.com/gorilla/mux" "github.com/rs/zerolog/log" diff --git a/pkg/config/static/static_config.go b/pkg/config/static/static_config.go index e921e8a5ef..b691d9c670 100644 --- a/pkg/config/static/static_config.go +++ b/pkg/config/static/static_config.go @@ -3,7 +3,7 @@ package static import ( "errors" "fmt" - "path" + "regexp" "strings" "time" @@ -57,6 +57,9 @@ const ( DefaultUDPTimeout = 3 * time.Second ) +// Allowed characters in URL following RFC 3986 (https://www.rfc-editor.org/rfc/rfc3986#section-2) +var validBasePath = regexp.MustCompile(`^/[a-zA-Z0-9/_.-]*$`) + // Configuration is the static configuration. type Configuration struct { Global *Global `description:"Global configuration options" json:"global,omitempty" toml:"global,omitempty" yaml:"global,omitempty" export:"true"` @@ -464,8 +467,8 @@ func (c *Configuration) ValidateConfiguration() error { } } - if c.API != nil && !path.IsAbs(c.API.BasePath) { - return errors.New("API basePath must be a valid absolute path") + if c.API != nil && !validBasePath.MatchString(c.API.BasePath) { + return errors.New("API basePath must be a valid absolute URL path") } if c.OCSP != nil { diff --git a/pkg/config/static/static_config_test.go b/pkg/config/static/static_config_test.go index b7ba5b729b..3fbef168ef 100644 --- a/pkg/config/static/static_config_test.go +++ b/pkg/config/static/static_config_test.go @@ -282,3 +282,89 @@ func TestConfiguration_SetEffectiveConfiguration(t *testing.T) { }) } } + +func TestValidateConfiguration_BasePath(t *testing.T) { + tests := []struct { + desc string + basePath string + expectErr bool + }{ + { + desc: "valid simple path", + basePath: "/api", + expectErr: false, + }, + { + desc: "valid path with segments", + basePath: "/my/base/path", + expectErr: false, + }, + { + desc: "valid path with allowed special chars", + basePath: "/valid/path-123", + expectErr: false, + }, + { + desc: "relative path", + basePath: "api/path", + expectErr: true, + }, + { + desc: "XSS payload", + basePath: `/api/">`, + expectErr: true, + }, + { + desc: "path with spaces", + basePath: "/path with spaces", + expectErr: true, + }, + { + desc: "path with angle brackets", + basePath: "/path/", + expectErr: true, + }, + { + desc: "path with query string", + basePath: "/api?foo=bar", + expectErr: true, + }, + { + desc: "path with fragment", + basePath: "/api#section", + expectErr: true, + }, + { + desc: "valid root path", + basePath: "/", + expectErr: false, + }, + { + desc: "path with quote", + basePath: "/api/'onclick=alert(1)", + expectErr: true, + }, + { + desc: "path with encoded character", + basePath: "/api%2Ftoto", + expectErr: true, + }, + } + + for _, test := range tests { + t.Run(test.desc, func(t *testing.T) { + t.Parallel() + + cfg := &Configuration{ + API: &API{BasePath: test.basePath}, + } + + err := cfg.ValidateConfiguration() + if test.expectErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} From 3ec1ee585f840225eb797dab44e3adb39a23b5b1 Mon Sep 17 00:00:00 2001 From: fuyu <54523771+mfmfuyu@users.noreply.github.com> Date: Thu, 26 Feb 2026 23:14:04 +0900 Subject: [PATCH 02/20] Fix incorrect TOML example in entrypoints docs --- .../reference/install-configuration/entrypoints.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/content/reference/install-configuration/entrypoints.md b/docs/content/reference/install-configuration/entrypoints.md index 4f099ad1ab..a00c8de45f 100644 --- a/docs/content/reference/install-configuration/entrypoints.md +++ b/docs/content/reference/install-configuration/entrypoints.md @@ -37,8 +37,8 @@ entryPoints: [entryPoints.web] address = ":80" [entryPoints.web.http] - [entryPoints.web.http.redirections] - entryPoint = "websecure" + [entryPoints.web.http.redirections.entryPoint] + to = "websecure" scheme = "https" permanent = true [entryPoints.web.observability] @@ -49,10 +49,8 @@ entryPoints: [entryPoints.websecure] address = ":443" [entryPoints.websecure.http] + middlewares = ["auth@kubernetescrd", "strip@kubernetescrd"] [entryPoints.websecure.http.tls] - [entryPoints.websecure.http.middlewares] - - auth@kubernetescrd - - strip@kubernetescrd ``` ```yaml tab="Helm Chart Values" @@ -68,9 +66,9 @@ ports: - auth@kubernetescrd - strip@kubernetescrd additionalArguments: - - --entryPoints.web.http.redirections.to=websecure - - --entryPoints.web.http.redirections.scheme=https - - --entryPoints.web.http.redirections.permanent=true + - --entryPoints.web.http.redirections.entryPoint.to=websecure + - --entryPoints.web.http.redirections.entryPoint.scheme=https + - --entryPoints.web.http.redirections.entryPoint.permanent=true - --entryPoints.web.observability.accessLogs=false - --entryPoints.web.observability.metrics=false - --entryPoints.web.observability.tracing=false From 88deb9b211f943f3292ef29e1af60c9c6c7f9f98 Mon Sep 17 00:00:00 2001 From: Nicolas Mengin Date: Fri, 27 Feb 2026 15:30:05 +0000 Subject: [PATCH 03/20] Fix API basepath option documentation --- docs/content/reference/install-configuration/api-dashboard.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/reference/install-configuration/api-dashboard.md b/docs/content/reference/install-configuration/api-dashboard.md index 42b954d017..b345fb504a 100644 --- a/docs/content/reference/install-configuration/api-dashboard.md +++ b/docs/content/reference/install-configuration/api-dashboard.md @@ -170,11 +170,11 @@ enabling the dashboard [here](https://github.com/traefik/traefik-helm-chart/blob | Field | Description | Default | Required | |:-----------|:---------------------------------|:--------|:---------| | `api` | Enable api/dashboard. When set to `true`, its sub option `api.dashboard` is also set to true.| false | No | -| api.basepath | Defines the base path where the API and Dashboard will be exposed. | / | No | +| api.basepath | Defines the base path where the API and Dashboard will be exposed.
Please note that this option is incompatible with the [insecure mode](#opt-api-insecure). | / | No | | `api.dashboard` | Enable dashboard. | false | No | | `api.debug` | Enable additional endpoints for debugging and profiling. | false | No | | `api.disabledashboardad` | Disable the advertisement from the dashboard. | false | No | -| `api.insecure` | Enable the API and the dashboard on the entryPoint named traefik.| false | No | +| `api.insecure` | Enable the API and the dashboard on the entryPoint named traefik.
Please note that this mode is incompatible with the custom API [base path option](#opt-api-basepath).| false | No | ## Endpoints From 734cc21fb458539bca3e2f5210f642ccfaef2d45 Mon Sep 17 00:00:00 2001 From: Mathieu Parent Date: Tue, 3 Mar 2026 09:26:04 +0100 Subject: [PATCH 04/20] Remove unused context import from test file --- pkg/server/server_entrypoint_listenconfig_other_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/server/server_entrypoint_listenconfig_other_test.go b/pkg/server/server_entrypoint_listenconfig_other_test.go index 45fa5ec473..4070e9f8f7 100644 --- a/pkg/server/server_entrypoint_listenconfig_other_test.go +++ b/pkg/server/server_entrypoint_listenconfig_other_test.go @@ -3,7 +3,6 @@ package server import ( - "context" "testing" "github.com/stretchr/testify/require" From c605e5e139f0c37937d1320b761301b9a9b6fa44 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 3 Mar 2026 10:00:17 +0100 Subject: [PATCH 05/20] Replace uses of hashicorp/go-multierror with stdlib errors.Join --- go.mod | 2 +- pkg/plugins/plugins.go | 36 +++++++++---------- pkg/provider/kubernetes/gateway/kubernetes.go | 3 +- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 0a326c56ac..b1324695db 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,6 @@ require ( github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 github.com/hashicorp/consul/api v1.26.1 github.com/hashicorp/go-hclog v1.6.3 - github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-retryablehttp v0.7.8 github.com/hashicorp/go-version v1.8.0 github.com/hashicorp/nomad/api v0.0.0-20231213195942-64e3dca9274b // No tag on the repo. @@ -248,6 +247,7 @@ require ( github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go index 8157a04c73..ffa64a2640 100644 --- a/pkg/plugins/plugins.go +++ b/pkg/plugins/plugins.go @@ -6,7 +6,6 @@ import ( "fmt" "strings" - "github.com/hashicorp/go-multierror" "github.com/rs/zerolog/log" "golang.org/x/mod/module" ) @@ -84,29 +83,30 @@ func SetupLocalPlugins(plugins map[string]LocalDescriptor) error { uniq := make(map[string]struct{}) - var errs *multierror.Error + var errs []error for pAlias, descriptor := range plugins { if descriptor.ModuleName == "" { - errs = multierror.Append(errs, fmt.Errorf("%s: plugin name is missing", pAlias)) + errs = append(errs, fmt.Errorf("%s: plugin name is missing", pAlias)) } if strings.HasPrefix(descriptor.ModuleName, "/") || strings.HasSuffix(descriptor.ModuleName, "/") { - errs = multierror.Append(errs, fmt.Errorf("%s: plugin name should not start or end with a /", pAlias)) + errs = append(errs, fmt.Errorf("%s: plugin name should not start or end with a /", pAlias)) continue } if _, ok := uniq[descriptor.ModuleName]; ok { - errs = multierror.Append(errs, fmt.Errorf("only one version of a plugin is allowed, there is a duplicate of %s", descriptor.ModuleName)) + errs = append(errs, fmt.Errorf("only one version of a plugin is allowed, there is a duplicate of %s", descriptor.ModuleName)) continue } uniq[descriptor.ModuleName] = struct{}{} - err := checkLocalPluginManifest(descriptor) - errs = multierror.Append(errs, err) + if err := checkLocalPluginManifest(descriptor); err != nil { + errs = append(errs, err) + } } - return errs.ErrorOrNil() + return errors.Join(errs...) } func checkLocalPluginManifest(descriptor LocalDescriptor) error { @@ -115,44 +115,44 @@ func checkLocalPluginManifest(descriptor LocalDescriptor) error { return err } - var errs *multierror.Error + var errs []error switch m.Type { case typeMiddleware: if m.Runtime != runtimeYaegi && m.Runtime != runtimeWasm && m.Runtime != "" { - errs = multierror.Append(errs, fmt.Errorf("%s: unsupported runtime '%q'", descriptor.ModuleName, m.Runtime)) + errs = append(errs, fmt.Errorf("%s: unsupported runtime '%q'", descriptor.ModuleName, m.Runtime)) } case typeProvider: if m.Runtime != runtimeYaegi && m.Runtime != "" { - errs = multierror.Append(errs, fmt.Errorf("%s: unsupported runtime '%q'", descriptor.ModuleName, m.Runtime)) + errs = append(errs, fmt.Errorf("%s: unsupported runtime '%q'", descriptor.ModuleName, m.Runtime)) } default: - errs = multierror.Append(errs, fmt.Errorf("%s: unsupported type %q", descriptor.ModuleName, m.Type)) + errs = append(errs, fmt.Errorf("%s: unsupported type %q", descriptor.ModuleName, m.Type)) } if m.IsYaegiPlugin() { if m.Import == "" { - errs = multierror.Append(errs, fmt.Errorf("%s: missing import", descriptor.ModuleName)) + errs = append(errs, fmt.Errorf("%s: missing import", descriptor.ModuleName)) } if !strings.HasPrefix(m.Import, descriptor.ModuleName) { - errs = multierror.Append(errs, fmt.Errorf("the import %q must be related to the module name %q", m.Import, descriptor.ModuleName)) + errs = append(errs, fmt.Errorf("the import %q must be related to the module name %q", m.Import, descriptor.ModuleName)) } } if m.DisplayName == "" { - errs = multierror.Append(errs, fmt.Errorf("%s: missing DisplayName", descriptor.ModuleName)) + errs = append(errs, fmt.Errorf("%s: missing DisplayName", descriptor.ModuleName)) } if m.Summary == "" { - errs = multierror.Append(errs, fmt.Errorf("%s: missing Summary", descriptor.ModuleName)) + errs = append(errs, fmt.Errorf("%s: missing Summary", descriptor.ModuleName)) } if m.TestData == nil { - errs = multierror.Append(errs, fmt.Errorf("%s: missing TestData", descriptor.ModuleName)) + errs = append(errs, fmt.Errorf("%s: missing TestData", descriptor.ModuleName)) } - return errs.ErrorOrNil() + return errors.Join(errs...) } diff --git a/pkg/provider/kubernetes/gateway/kubernetes.go b/pkg/provider/kubernetes/gateway/kubernetes.go index 59ef2e66bf..d09e2e751b 100644 --- a/pkg/provider/kubernetes/gateway/kubernetes.go +++ b/pkg/provider/kubernetes/gateway/kubernetes.go @@ -13,7 +13,6 @@ import ( "time" "github.com/cenkalti/backoff/v4" - "github.com/hashicorp/go-multierror" "github.com/mitchellh/hashstructure" "github.com/rs/zerolog/log" ptypes "github.com/traefik/paerser/types" @@ -409,7 +408,7 @@ func (p *Provider) loadConfigurationFromGateways(ctx context.Context) *dynamic.C } var conditionsErr error for message := range messages { - conditionsErr = multierror.Append(conditionsErr, errors.New(message)) + conditionsErr = errors.Join(conditionsErr, errors.New(message)) } logger.Error(). Err(conditionsErr). From 8b3111c42a20ec12d9bd99c33378ad7b06e92fbc Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 3 Mar 2026 15:00:07 +0100 Subject: [PATCH 06/20] Bump github.com/testcontainers/testcontainers-go to v0.40.0 --- go.mod | 21 +++++----- go.sum | 49 +++++++++------------- integration/integration_test.go | 18 +++++---- integration/k8s_test.go | 58 ++++++++++++++------------- integration/resources/compose/k8s.yml | 33 --------------- 5 files changed, 67 insertions(+), 112 deletions(-) delete mode 100644 integration/resources/compose/k8s.yml diff --git a/go.mod b/go.mod index b1324695db..67200d5bc6 100644 --- a/go.mod +++ b/go.mod @@ -19,8 +19,8 @@ require ( github.com/containous/alice v0.0.0-20181107144136-d83ebdd94cbd // No tag on the repo. github.com/coreos/go-systemd/v22 v22.5.0 github.com/docker/cli v28.3.3+incompatible - github.com/docker/docker v28.3.3+incompatible - github.com/docker/go-connections v0.5.0 + github.com/docker/docker v28.5.1+incompatible + github.com/docker/go-connections v0.6.0 github.com/fatih/structs v1.1.0 github.com/fsnotify/fsnotify v1.9.0 github.com/go-acme/lego/v4 v4.32.0 @@ -64,8 +64,8 @@ require ( github.com/stretchr/testify v1.11.1 github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 // No tag on the repo. github.com/tailscale/tscert v0.0.0-20230806124524-28a91b69a046 // No tag on the repo. - github.com/testcontainers/testcontainers-go v0.32.0 - github.com/testcontainers/testcontainers-go/modules/k3s v0.32.0 + github.com/testcontainers/testcontainers-go v0.40.0 + github.com/testcontainers/testcontainers-go/modules/k3s v0.40.0 github.com/tetratelabs/wazero v1.8.0 github.com/tidwall/gjson v1.17.0 github.com/traefik/grpc-web v0.16.0 @@ -123,7 +123,7 @@ require ( cloud.google.com/go/auth v0.18.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - dario.cat/mergo v1.0.1 // indirect + dario.cat/mergo v1.0.2 // indirect github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 // indirect @@ -147,7 +147,6 @@ require ( github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Microsoft/hcsshim v0.13.0 // indirect github.com/VividCortex/gohistogram v1.0.0 // indirect github.com/akamai/AkamaiOPEN-edgegrid-golang/v11 v11.1.0 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect @@ -179,13 +178,12 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect - github.com/containerd/containerd v1.7.29 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v1.0.0-rc.1 // indirect github.com/coreos/go-semver v0.3.1 // indirect - github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deepmap/oapi-codegen v1.9.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect @@ -194,6 +192,7 @@ require ( github.com/distribution/reference v0.6.0 // indirect github.com/dnsimple/dnsimple-go/v4 v4.0.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/exoscale/egoscale/v3 v3.1.33 // indirect @@ -273,7 +272,7 @@ require ( github.com/liquidweb/liquidweb-cli v0.6.9 // indirect github.com/liquidweb/liquidweb-go v1.6.4 // indirect github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/magiconair/properties v1.8.10 // indirect github.com/mailgun/minheap v0.0.0-20170619185613-3dbe6c6bf55f // indirect github.com/mailgun/multibuf v0.1.2 // indirect github.com/mailgun/timetools v0.0.0-20141028012446-7e6055773c51 // indirect @@ -288,7 +287,6 @@ require ( github.com/moby/go-archive v0.1.0 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/spdystream v0.5.0 // indirect - github.com/moby/sys/atomicwriter v0.1.0 // indirect github.com/moby/sys/sequential v0.6.0 // indirect github.com/moby/sys/user v0.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect @@ -340,8 +338,7 @@ require ( github.com/scaleway/scaleway-sdk-go v1.0.0-beta.36 // indirect github.com/selectel/domains-go v1.1.0 // indirect github.com/selectel/go-selvpcclient/v4 v4.1.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.4 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/shirou/gopsutil/v4 v4.25.6 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/softlayer/softlayer-go v1.2.1 // indirect github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect diff --git a/go.sum b/go.sum index 9ab876095a..6299fe47ce 100644 --- a/go.sum +++ b/go.sum @@ -41,8 +41,8 @@ contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= -dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= -dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= @@ -116,8 +116,6 @@ github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBa github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= -github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.30.1/go.mod h1:hGgx05L/DiW8XYBXeJdKIN6V2QUy2H6JqME5VT1NLRw= @@ -299,8 +297,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= -github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= @@ -327,8 +323,8 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= -github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -358,10 +354,10 @@ github.com/dnsimple/dnsimple-go/v4 v4.0.0 h1:nUCICZSyZDiiqimAAL+E8XL+0sKGks5VRki github.com/dnsimple/dnsimple-go/v4 v4.0.0/go.mod h1:AXT2yfAFOntJx6iMeo1J/zKBw0ggXFYBt4e97dqqPnc= github.com/docker/cli v28.3.3+incompatible h1:fp9ZHAr1WWPGdIWBM1b3zLtgCF+83gRdVMTJsUeiyAo= github.com/docker/cli v28.3.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= -github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/docker v28.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= +github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -369,6 +365,8 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= @@ -595,7 +593,6 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -855,13 +852,12 @@ github.com/liquidweb/liquidweb-cli v0.6.9 h1:acbIvdRauiwbxIsOCEMXGwF75aSJDbDiyAW github.com/liquidweb/liquidweb-cli v0.6.9/go.mod h1:cE1uvQ+x24NGUL75D0QagOFCG8Wdvmwu8aL9TLmA/eQ= github.com/liquidweb/liquidweb-go v1.6.4 h1:6S0m3hHSpiLqGD7AFSb7lH/W/qr1wx+tKil9fgIbjMc= github.com/liquidweb/liquidweb-go v1.6.4/go.mod h1:B934JPIIcdA+uTq2Nz5PgOtG6CuCaEvQKe/Ge/5GgZ4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailgun/multibuf v0.1.2 h1:QE9kE27lK6LFZB4aYNVtUPlWVHVCT0zpgUr2uoq/+jk= github.com/mailgun/multibuf v0.1.2/go.mod h1:E+sUhIy69qgT6EM57kCPdUTlHnjTuxQBO/yf6af9Hes= github.com/mailgun/timetools v0.0.0-20141028012446-7e6055773c51 h1:Kg/NPZLLC3aAFr1YToMs98dbCdhootQ1hZIvZU28hAQ= @@ -1080,7 +1076,6 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs= @@ -1171,11 +1166,8 @@ github.com/selectel/domains-go v1.1.0 h1:futG50J43ALLKQAnZk9H9yOtLGnSUh7c5hSvuC5 github.com/selectel/domains-go v1.1.0/go.mod h1:SugRKfq4sTpnOHquslCpzda72wV8u0cMBHx0C0l+bzA= github.com/selectel/go-selvpcclient/v4 v4.1.0 h1:22lBp+rzg9g2MP4iiGhpVAcCt0kMv7I7uV1W3taLSvQ= github.com/selectel/go-selvpcclient/v4 v4.1.0/go.mod h1:eFhL1KUW159KOJVeGO7k/Uxl0TYd/sBkWXjuF5WxmYk= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= +github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1250,7 +1242,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 h1:LUsDduamlucuNnWcaTbXQ6aLILFcLXADpOzeEH3U+OI= @@ -1264,10 +1255,10 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.24/go.mod h github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.38/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.48 h1:bCs+z6dxRaHWm/C1D/XkSOcCZ0+W2+/6HmIXjpAj+fY= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.48/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/testcontainers/testcontainers-go v0.32.0 h1:ug1aK08L3gCHdhknlTTwWjPHPS+/alvLJU/DRxTD/ME= -github.com/testcontainers/testcontainers-go v0.32.0/go.mod h1:CRHrzHLQhlXUsa5gXjTOfqIEJcrK5+xMDmBr/WMI88E= -github.com/testcontainers/testcontainers-go/modules/k3s v0.32.0 h1:Z3DTMveNUqeGJZ+CXZhpvI7OF1BS71Ywi3SwoXLZ4Lc= -github.com/testcontainers/testcontainers-go/modules/k3s v0.32.0/go.mod h1:SYp1WtvNc3n/cg5atO6LvaOd2aqkQYMSDCcWPOUdaZg= +github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= +github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= +github.com/testcontainers/testcontainers-go/modules/k3s v0.40.0 h1:3w6SjtIp/+FdpjWJCyPqaGWknG2iU6MacEWA7hl0IqQ= +github.com/testcontainers/testcontainers-go/modules/k3s v0.40.0/go.mod h1:1xJwmfO2g+XKox9LiJXKGCm1vWp7LozX+78UjXVRbF0= github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmcF4g= github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= @@ -1280,10 +1271,8 @@ github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -1737,14 +1726,12 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= diff --git a/integration/integration_test.go b/integration/integration_test.go index 76ae5076d9..39ee8c77dc 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -232,15 +232,17 @@ func (s *BaseSuite) createComposeProject(name string) { func (s *BaseSuite) createContainer(ctx context.Context, containerConfig composeService, id string, mounts []mount.Mount) (testcontainers.Container, error) { req := testcontainers.ContainerRequest{ - Image: containerConfig.Image, - Env: containerConfig.Environment, - Cmd: containerConfig.Command, - Labels: containerConfig.Labels, - Name: id, - Hostname: containerConfig.Hostname, - Privileged: containerConfig.Privileged, - Networks: []string{s.network.Name}, + Image: containerConfig.Image, + Env: containerConfig.Environment, + Cmd: containerConfig.Command, + Labels: containerConfig.Labels, + Name: id, + Networks: []string{s.network.Name}, + ConfigModifier: func(config *container.Config) { + config.Hostname = containerConfig.Hostname + }, HostConfigModifier: func(config *container.HostConfig) { + config.Privileged = containerConfig.Privileged if containerConfig.CapAdd != nil { config.CapAdd = containerConfig.CapAdd } diff --git a/integration/k8s_test.go b/integration/k8s_test.go index 3e81d8b0ba..2c70d6adbb 100644 --- a/integration/k8s_test.go +++ b/integration/k8s_test.go @@ -7,12 +7,10 @@ import ( "flag" "fmt" "io" - "net" "net/http" "os" "path/filepath" "regexp" - "strings" "testing" "time" @@ -20,6 +18,8 @@ import ( "github.com/rs/zerolog/log" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/modules/k3s" "github.com/traefik/traefik/v3/integration/try" "github.com/traefik/traefik/v3/pkg/api" ) @@ -27,7 +27,11 @@ import ( var updateExpected = flag.Bool("update_expected", false, "Update expected files in testdata") // K8sSuite tests suite. -type K8sSuite struct{ BaseSuite } +type K8sSuite struct { + BaseSuite + + k3sContainer *k3s.K3sContainer +} func TestK8sSuite(t *testing.T) { suite.Run(t, new(K8sSuite)) @@ -36,47 +40,45 @@ func TestK8sSuite(t *testing.T) { func (s *K8sSuite) SetupSuite() { s.BaseSuite.SetupSuite() - s.createComposeProject("k8s") - s.composeUp() - - abs, err := filepath.Abs("./fixtures/k8s/config.skip/kubeconfig.yaml") + manifests, err := filepath.Glob("./fixtures/k8s/*.yml") require.NoError(s.T(), err) - err = try.Do(60*time.Second, func() error { - _, err := os.Stat(abs) - return err - }) + opts := make([]testcontainers.ContainerCustomizer, 0, len(manifests)) + for _, m := range manifests { + opts = append(opts, k3s.WithManifest(m)) + } + + s.k3sContainer, err = k3s.Run(s.T().Context(), k3sImage, opts...) require.NoError(s.T(), err) - data, err := os.ReadFile(abs) + kubeConfigYaml, err := s.k3sContainer.GetKubeConfig(s.T().Context()) require.NoError(s.T(), err) - content := strings.ReplaceAll(string(data), "https://server:6443", fmt.Sprintf("https://%s", net.JoinHostPort(s.getComposeServiceIP("server"), "6443"))) - - err = os.WriteFile(abs, []byte(content), 0o644) + kubeconfigPath := filepath.Join(s.T().TempDir(), "kubeconfig.yaml") + err = os.WriteFile(kubeconfigPath, kubeConfigYaml, 0o644) require.NoError(s.T(), err) - err = os.Setenv("KUBECONFIG", abs) + err = os.Setenv("KUBECONFIG", kubeconfigPath) require.NoError(s.T(), err) } func (s *K8sSuite) TearDownSuite() { - s.BaseSuite.TearDownSuite() + if s.k3sContainer != nil { + if s.T().Failed() || *showLog { + k3sLogs, err := s.k3sContainer.Logs(s.T().Context()) + if err == nil { + if res, err := io.ReadAll(k3sLogs); err == nil { + s.T().Log(string(res)) + } + } + } - generatedFiles := []string{ - "./fixtures/k8s/config.skip/kubeconfig.yaml", - "./fixtures/k8s/config.skip/k3s.log", - "./fixtures/k8s/coredns.yaml", - "./fixtures/k8s/rolebindings.yaml", - "./fixtures/k8s/traefik.yaml", - "./fixtures/k8s/ccm.yaml", - } - - for _, filename := range generatedFiles { - if err := os.Remove(filename); err != nil { + if err := s.k3sContainer.Terminate(s.T().Context()); err != nil { log.Warn().Err(err).Send() } } + + s.BaseSuite.TearDownSuite() } func (s *K8sSuite) TestIngressConfiguration() { diff --git a/integration/resources/compose/k8s.yml b/integration/resources/compose/k8s.yml deleted file mode 100644 index 81c098d98c..0000000000 --- a/integration/resources/compose/k8s.yml +++ /dev/null @@ -1,33 +0,0 @@ -services: - server: - image: rancher/k3s:v1.34.2-k3s1 - privileged: true - command: - - server - - --disable-agent - - --disable=coredns - - --disable=servicelb - - --disable=traefik - - --disable=local-storage - - --disable=metrics-server - - --log=/output/k3s.log - - --bind-address=server - - --tls-san=server - - --tls-san=172.31.42.3 - - --tls-san=172.31.42.4 - environment: - K3S_CLUSTER_SECRET: somethingtotallyrandom - K3S_TOKEN: somethingtotallyrandom - K3S_KUBECONFIG_OUTPUT: /output/kubeconfig.yaml - K3S_KUBECONFIG_MODE: 666 - volumes: - - ./fixtures/k8s/config.skip:/output - - ./fixtures/k8s:/var/lib/rancher/k3s/server/manifests - - node: - image: rancher/k3s:v1.34.2-k3s1 - privileged: true - environment: - K3S_TOKEN: somethingtotallyrandom - K3S_URL: https://server:6443 - K3S_CLUSTER_SECRET: somethingtotallyrandom From a71d4d640f6fc8f55c249861458582ba288b0ae8 Mon Sep 17 00:00:00 2001 From: Romain Date: Tue, 3 Mar 2026 15:42:05 +0100 Subject: [PATCH 07/20] Bump go.opentelemetry.io/otel dependencies --- go.mod | 38 ++++++++++++++-------------- go.sum | 80 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/go.mod b/go.mod index 67200d5bc6..c3d57d4c19 100644 --- a/go.mod +++ b/go.mod @@ -80,20 +80,20 @@ require ( go.opentelemetry.io/collector/pdata v1.41.0 go.opentelemetry.io/contrib/bridges/otellogrus v0.13.0 go.opentelemetry.io/contrib/propagators/autoprop v0.63.0 - go.opentelemetry.io/otel v1.39.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 - go.opentelemetry.io/otel/log v0.14.0 - go.opentelemetry.io/otel/metric v1.39.0 - go.opentelemetry.io/otel/sdk v1.39.0 - go.opentelemetry.io/otel/sdk/log v0.14.0 - go.opentelemetry.io/otel/sdk/metric v1.39.0 - go.opentelemetry.io/otel/trace v1.39.0 + go.opentelemetry.io/otel v1.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.17.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.17.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 + go.opentelemetry.io/otel/log v0.17.0 + go.opentelemetry.io/otel/metric v1.41.0 + go.opentelemetry.io/otel/sdk v1.41.0 + go.opentelemetry.io/otel/sdk/log v0.17.0 + go.opentelemetry.io/otel/sdk/metric v1.41.0 + go.opentelemetry.io/otel/trace v1.41.0 golang.org/x/crypto v0.48.0 golang.org/x/mod v0.32.0 golang.org/x/net v0.50.0 @@ -102,7 +102,7 @@ require ( golang.org/x/text v0.34.0 golang.org/x/time v0.14.0 golang.org/x/tools v0.41.0 - google.golang.org/grpc v1.78.0 + google.golang.org/grpc v1.79.1 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.34.3 @@ -241,7 +241,7 @@ require ( github.com/gophercloud/gophercloud v1.14.1 // indirect github.com/gophercloud/utils v0.0.0-20231010081019-80377eca5d56 // indirect github.com/gravitational/trace v1.1.16-0.20220114165159-14a9a7dd6aaf // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/cronexpr v1.1.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -380,7 +380,7 @@ require ( go.opentelemetry.io/contrib/propagators/b3 v1.38.0 // indirect go.opentelemetry.io/contrib/propagators/jaeger v1.38.0 // indirect go.opentelemetry.io/contrib/propagators/ot v1.38.0 // indirect - go.opentelemetry.io/proto/otlp v1.7.1 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect @@ -393,8 +393,8 @@ require ( golang.org/x/term v0.40.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.267.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 6299fe47ce..76225ba917 100644 --- a/go.sum +++ b/go.sum @@ -650,8 +650,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= @@ -1392,41 +1392,41 @@ go.opentelemetry.io/contrib/propagators/jaeger v1.38.0 h1:nXGeLvT1QtCAhkASkP/ksj go.opentelemetry.io/contrib/propagators/jaeger v1.38.0/go.mod h1:oMvOXk78ZR3KEuPMBgp/ThAMDy9ku/eyUVztr+3G6Wo= go.opentelemetry.io/contrib/propagators/ot v1.38.0 h1:k4gSyyohaDXI8F9BDXYC3uO2vr5sRNeQFMsN9Zn0EoI= go.opentelemetry.io/contrib/propagators/ot v1.38.0/go.mod h1:2hDsuiHRO39SRUMhYGqmj64z/IuMRoxE4bBSFR82Lo8= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= -go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= -go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= +go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c= +go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.17.0 h1:6SRrIZrFLFVkktXaO0OUTweDdxNveqxczTsk3XUVQX8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.17.0/go.mod h1:Nx2rIwEusIh/KFV8UrjjB87BfVn+daJ/lWCA0CkxAtY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.17.0 h1:GcSx2UgcMuQEu0vHq823xR5LCN3WqEx5yKhqDkv1pwY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.17.0/go.mod h1:ctNT8t8Vzx9sb1oWAozighT3guWorr8xdCboBvkT5yg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.41.0 h1:VO3BL6OZXRQ1yQc8W6EVfJzINeJ35BkiHx4MYfoQf44= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.41.0/go.mod h1:qRDnJ2nv3CQXMK2HUd9K9VtvedsPAce3S+/4LZHjX/s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.41.0 h1:MMrOAN8H1FrvDyq9UJ4lu5/+ss49Qgfgb7Zpm0m8ABo= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.41.0/go.mod h1:Na+2NNASJtF+uT4NxDe0G+NQb+bUgdPDfwxY/6JmS/c= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 h1:mq/Qcf28TWz719lE3/hMB4KkyDuLJIvgJnFGcd0kEUI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0/go.mod h1:yk5LXEYhsL2htyDNJbEq7fWzNEigeEdV5xBF/Y+kAv0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= +go.opentelemetry.io/otel/log v0.17.0 h1:blZWM4y7n+KSa9OywwGWyBMPpeVoCl/NCw+jMps8afM= +go.opentelemetry.io/otel/log v0.17.0/go.mod h1:VXhjKYep6/laSgf/tjdh2SMAt18Z9XotBFBO0jxSE24= go.opentelemetry.io/otel/log/logtest v0.14.0 h1:BGTqNeluJDK2uIHAY8lRqxjVAYfqgcaTbVk1n3MWe5A= go.opentelemetry.io/otel/log/logtest v0.14.0/go.mod h1:IuguGt8XVP4XA4d2oEEDMVDBBCesMg8/tSGWDjuKfoA= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= -go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= -go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= -go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel/metric v1.41.0 h1:rFnDcs4gRzBcsO9tS8LCpgR0dxg4aaxWlJxCno7JlTQ= +go.opentelemetry.io/otel/metric v1.41.0/go.mod h1:xPvCwd9pU0VN8tPZYzDZV/BMj9CM9vs00GuBjeKhJps= +go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= +go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= +go.opentelemetry.io/otel/sdk/log v0.17.0 h1:stWOgJB8bWieSlX4VO+gD7BrRZ/Dh1H/u7115amleGE= +go.opentelemetry.io/otel/sdk/log v0.17.0/go.mod h1:LQKPUyHraLka2sRvNQ5+W456+sElomqR7VWpOnOefZg= +go.opentelemetry.io/otel/sdk/log/logtest v0.17.0 h1:Z4S9W5piCH88itCkWDtX5ppRgO0UTkLXVK/6tPOMM2w= +go.opentelemetry.io/otel/sdk/log/logtest v0.17.0/go.mod h1:d9iIX/BwLfu1BTPxO0wi4ucyCenCckfuf9LC0aJDjqM= +go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= +go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= +go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0= +go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= -go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= @@ -1915,10 +1915,10 @@ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxH google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= -google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M= -google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 h1:Jr5R2J6F6qWyzINc+4AM8t5pfUz6beZpHp678GNrMbE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1936,8 +1936,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= -google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= +google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 7a95bac64fea1209d355d41c8354cb57713e6bc2 Mon Sep 17 00:00:00 2001 From: Varun Chawla <34209028+veeceey@users.noreply.github.com> Date: Tue, 3 Mar 2026 07:12:05 -0800 Subject: [PATCH 08/20] Fix HasSecureHeadersDefined returning false when stsSeconds is 0 --- pkg/config/dynamic/middleware_test.go | 63 +++++++++++++++++++-- pkg/config/dynamic/middlewares.go | 4 +- pkg/config/dynamic/zz_generated.deepcopy.go | 5 ++ pkg/config/label/label_test.go | 4 +- pkg/middlewares/headers/headers_test.go | 9 +++ pkg/middlewares/headers/secure.go | 3 +- pkg/middlewares/headers/secure_test.go | 5 +- pkg/provider/kv/kv_test.go | 2 +- pkg/redactor/redactor_config_test.go | 2 +- 9 files changed, 83 insertions(+), 14 deletions(-) diff --git a/pkg/config/dynamic/middleware_test.go b/pkg/config/dynamic/middleware_test.go index 87a0b34df4..2fb575d255 100644 --- a/pkg/config/dynamic/middleware_test.go +++ b/pkg/config/dynamic/middleware_test.go @@ -5,6 +5,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "k8s.io/utils/ptr" ) func Test_GetStrategy_ipv6Subnet(t *testing.T) { @@ -19,16 +20,16 @@ func Test_GetStrategy_ipv6Subnet(t *testing.T) { { desc: "Zero subnet", expectError: true, - ipv6Subnet: intPtr(0), + ipv6Subnet: ptr.To(0), }, { desc: "Subnet greater that 128", expectError: true, - ipv6Subnet: intPtr(129), + ipv6Subnet: ptr.To(129), }, { desc: "Valid subnet", - ipv6Subnet: intPtr(128), + ipv6Subnet: ptr.To(128), }, } @@ -52,6 +53,58 @@ func Test_GetStrategy_ipv6Subnet(t *testing.T) { } } -func intPtr(value int) *int { - return &value +func TestHasSecureHeadersDefined(t *testing.T) { + testCases := []struct { + desc string + headers *Headers + expected bool + }{ + { + desc: "Nil headers", + headers: nil, + expected: false, + }, + { + desc: "Empty headers", + headers: &Headers{}, + expected: false, + }, + { + desc: "STSSeconds set to non-zero", + headers: &Headers{ + STSSeconds: ptr.To(int64(42)), + }, + expected: true, + }, + { + desc: "STSSeconds set to zero", + headers: &Headers{ + STSSeconds: ptr.To(int64(0)), + }, + expected: true, + }, + { + desc: "STSSeconds nil (not set)", + headers: &Headers{ + FrameDeny: true, + }, + expected: true, + }, + { + desc: "Only ForceSTSHeader", + headers: &Headers{ + ForceSTSHeader: true, + }, + expected: true, + }, + } + + for _, test := range testCases { + t.Run(test.desc, func(t *testing.T) { + t.Parallel() + + result := test.headers.HasSecureHeadersDefined() + assert.Equal(t, test.expected, result) + }) + } } diff --git a/pkg/config/dynamic/middlewares.go b/pkg/config/dynamic/middlewares.go index 8032f61551..a04f99713a 100644 --- a/pkg/config/dynamic/middlewares.go +++ b/pkg/config/dynamic/middlewares.go @@ -331,7 +331,7 @@ type Headers struct { // STSSeconds defines the max-age of the Strict-Transport-Security header. // If set to 0, the header is not set. // +kubebuilder:validation:Minimum=0 - STSSeconds int64 `json:"stsSeconds,omitempty" toml:"stsSeconds,omitempty" yaml:"stsSeconds,omitempty" export:"true"` + STSSeconds *int64 `json:"stsSeconds,omitempty" toml:"stsSeconds,omitempty" yaml:"stsSeconds,omitempty" export:"true"` // STSIncludeSubdomains defines whether the includeSubDomains directive is appended to the Strict-Transport-Security header. STSIncludeSubdomains bool `json:"stsIncludeSubdomains,omitempty" toml:"stsIncludeSubdomains,omitempty" yaml:"stsIncludeSubdomains,omitempty" export:"true"` // STSPreload defines whether the preload flag is appended to the Strict-Transport-Security header. @@ -407,7 +407,7 @@ func (h *Headers) HasSecureHeadersDefined() bool { (h.SSLForceHost != nil && *h.SSLForceHost) || (h.SSLHost != nil && *h.SSLHost != "") || len(h.SSLProxyHeaders) != 0 || - h.STSSeconds != 0 || + h.STSSeconds != nil || h.STSIncludeSubdomains || h.STSPreload || h.ForceSTSHeader || diff --git a/pkg/config/dynamic/zz_generated.deepcopy.go b/pkg/config/dynamic/zz_generated.deepcopy.go index 7e774bc922..88a956e18e 100644 --- a/pkg/config/dynamic/zz_generated.deepcopy.go +++ b/pkg/config/dynamic/zz_generated.deepcopy.go @@ -660,6 +660,11 @@ func (in *Headers) DeepCopyInto(out *Headers) { (*out)[key] = val } } + if in.STSSeconds != nil { + in, out := &in.STSSeconds, &out.STSSeconds + *out = new(int64) + **out = **in + } if in.FeaturePolicy != nil { in, out := &in.FeaturePolicy, &out.FeaturePolicy *out = new(string) diff --git a/pkg/config/label/label_test.go b/pkg/config/label/label_test.go index 390b2ebb6f..903aa1a097 100644 --- a/pkg/config/label/label_test.go +++ b/pkg/config/label/label_test.go @@ -640,7 +640,7 @@ func TestDecodeConfiguration(t *testing.T) { "name1": "foobar", }, SSLForceHost: pointer(true), - STSSeconds: 42, + STSSeconds: pointer(int64(42)), STSIncludeSubdomains: true, STSPreload: true, ForceSTSHeader: true, @@ -1195,7 +1195,7 @@ func TestEncodeConfiguration(t *testing.T) { "name1": "foobar", }, SSLForceHost: pointer(true), - STSSeconds: 42, + STSSeconds: pointer(int64(42)), STSIncludeSubdomains: true, STSPreload: true, ForceSTSHeader: true, diff --git a/pkg/middlewares/headers/headers_test.go b/pkg/middlewares/headers/headers_test.go index df71e68964..b968b90797 100644 --- a/pkg/middlewares/headers/headers_test.go +++ b/pkg/middlewares/headers/headers_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/traefik/traefik/v3/pkg/config/dynamic" + "k8s.io/utils/ptr" ) func TestNew_withoutOptions(t *testing.T) { @@ -24,6 +25,14 @@ func TestNew_withoutOptions(t *testing.T) { assert.Nil(t, mid) } +func TestNew_withSTSSecondsZero(t *testing.T) { + next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) + + mid, err := New(t.Context(), next, dynamic.Headers{STSSeconds: ptr.To(int64(0))}, "testing") + require.NoError(t, err) + assert.NotNil(t, mid) +} + func TestNew_allowedHosts(t *testing.T) { testCases := []struct { desc string diff --git a/pkg/middlewares/headers/secure.go b/pkg/middlewares/headers/secure.go index 9769627d1c..b2858b4cbe 100644 --- a/pkg/middlewares/headers/secure.go +++ b/pkg/middlewares/headers/secure.go @@ -6,6 +6,7 @@ import ( "github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/middlewares" "github.com/unrolled/secure" + "k8s.io/utils/ptr" ) type secureHeader struct { @@ -33,7 +34,7 @@ func newSecure(next http.Handler, cfg dynamic.Headers, contextKey string) *secur AllowedHosts: cfg.AllowedHosts, HostsProxyHeaders: cfg.HostsProxyHeaders, SSLProxyHeaders: cfg.SSLProxyHeaders, - STSSeconds: cfg.STSSeconds, + STSSeconds: ptr.Deref(cfg.STSSeconds, 0), PermissionsPolicy: cfg.PermissionsPolicy, SecureContextKey: contextKey, } diff --git a/pkg/middlewares/headers/secure_test.go b/pkg/middlewares/headers/secure_test.go index d16c8c273a..5b81efe312 100644 --- a/pkg/middlewares/headers/secure_test.go +++ b/pkg/middlewares/headers/secure_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/traefik/traefik/v3/pkg/config/dynamic" + "k8s.io/utils/ptr" ) // Middleware tests based on https://github.com/unrolled/secure @@ -27,7 +28,7 @@ func Test_newSecure_modifyResponse(t *testing.T) { { desc: "STSSeconds", cfg: dynamic.Headers{ - STSSeconds: 1, + STSSeconds: ptr.To(int64(1)), ForceSTSHeader: true, }, expected: http.Header{"Strict-Transport-Security": []string{"max-age=1"}}, @@ -35,7 +36,7 @@ func Test_newSecure_modifyResponse(t *testing.T) { { desc: "STSSeconds and STSPreload", cfg: dynamic.Headers{ - STSSeconds: 1, + STSSeconds: ptr.To(int64(1)), ForceSTSHeader: true, STSPreload: true, }, diff --git a/pkg/provider/kv/kv_test.go b/pkg/provider/kv/kv_test.go index 0a4ed49dd1..1dd995ab84 100644 --- a/pkg/provider/kv/kv_test.go +++ b/pkg/provider/kv/kv_test.go @@ -621,7 +621,7 @@ func Test_buildConfiguration(t *testing.T) { "name0": "foobar", }, SSLForceHost: pointer(true), - STSSeconds: 42, + STSSeconds: pointer(int64(42)), STSIncludeSubdomains: true, STSPreload: true, ForceSTSHeader: true, diff --git a/pkg/redactor/redactor_config_test.go b/pkg/redactor/redactor_config_test.go index a461f474c9..3fc4f344a7 100644 --- a/pkg/redactor/redactor_config_test.go +++ b/pkg/redactor/redactor_config_test.go @@ -209,7 +209,7 @@ func init() { AllowedHosts: []string{"foo"}, HostsProxyHeaders: []string{"foo"}, SSLProxyHeaders: map[string]string{"foo": "bar"}, - STSSeconds: 42, + STSSeconds: pointer(int64(42)), STSIncludeSubdomains: true, STSPreload: true, ForceSTSHeader: true, From 2b71f6f518c1f2a3ad0f36d3cf9c867db7e584a3 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Wed, 4 Mar 2026 10:26:05 +0100 Subject: [PATCH 09/20] Bump golang.org/x/net to v0.51.0 --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 73df81318f..5ed90eda2c 100644 --- a/go.mod +++ b/go.mod @@ -73,11 +73,11 @@ require ( github.com/vulcand/predicate v1.2.0 go.elastic.co/apm/module/apmot/v2 v2.4.8 go.elastic.co/apm/v2 v2.4.8 - golang.org/x/mod v0.29.0 - golang.org/x/net v0.47.0 - golang.org/x/text v0.31.0 + golang.org/x/mod v0.32.0 + golang.org/x/net v0.51.0 + golang.org/x/text v0.34.0 golang.org/x/time v0.12.0 - golang.org/x/tools v0.38.0 + golang.org/x/tools v0.41.0 google.golang.org/grpc v1.73.0 gopkg.in/DataDog/dd-trace-go.v1 v1.74.6 gopkg.in/yaml.v3 v3.0.1 @@ -380,12 +380,12 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.45.0 // indirect + golang.org/x/crypto v0.48.0 // indirect golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/term v0.40.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/api v0.242.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect diff --git a/go.sum b/go.sum index 4d88537650..3c4b199217 100644 --- a/go.sum +++ b/go.sum @@ -1647,8 +1647,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1696,8 +1696,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1766,8 +1766,8 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1799,8 +1799,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1911,8 +1911,8 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1930,8 +1930,8 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= +golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1950,8 +1950,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2033,8 +2033,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From ef1d71f7862d55bc1262b886828ce22090d86311 Mon Sep 17 00:00:00 2001 From: Romain Date: Thu, 5 Mar 2026 10:02:07 +0100 Subject: [PATCH 10/20] Fix Gateway API router's rules Co-authored-by: Kevin Pollet --- integration/testdata/rawdata-gateway.json | 30 +- pkg/provider/kubernetes/gateway/grpcroute.go | 8 +- .../kubernetes/gateway/grpcroute_test.go | 32 +- pkg/provider/kubernetes/gateway/httproute.go | 24 +- .../kubernetes/gateway/httproute_test.go | 28 +- .../kubernetes/gateway/kubernetes_test.go | 622 +++++++++--------- pkg/provider/kubernetes/gateway/tcproute.go | 2 +- pkg/provider/kubernetes/gateway/tlsroute.go | 6 +- .../kubernetes/gateway/tlsroute_test.go | 16 +- 9 files changed, 384 insertions(+), 384 deletions(-) diff --git a/integration/testdata/rawdata-gateway.json b/integration/testdata/rawdata-gateway.json index 0b1f9fc209..2ac7e1ba47 100644 --- a/integration/testdata/rawdata-gateway.json +++ b/integration/testdata/rawdata-gateway.json @@ -5,7 +5,7 @@ "traefik" ], "service": "api@internal", - "rule": "PathPrefix(`/api`)", + "rule": "PathPrefix(\"/api\")", "ruleSyntax": "default", "priority": 9223372036854775806, "observability": { @@ -28,7 +28,7 @@ "dashboard_stripprefix@internal" ], "service": "dashboard@internal", - "rule": "PathPrefix(`/`)", + "rule": "PathPrefix(\"/\")", "ruleSyntax": "default", "priority": 9223372036854775805, "observability": { @@ -42,12 +42,12 @@ "traefik" ] }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06@kubernetesgateway": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3@kubernetesgateway": { "entryPoints": [ "web" ], - "service": "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - "rule": "Host(`foo.com`) \u0026\u0026 Path(`/bar`)", + "service": "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + "rule": "Host(\"foo.com\") \u0026\u0026 Path(\"/bar\")", "ruleSyntax": "default", "priority": 100008, "observability": { @@ -61,12 +61,12 @@ "web" ] }, - "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-1c0cf64bde37d9d0df06@kubernetesgateway": { + "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-af329269dd38031b03e3@kubernetesgateway": { "entryPoints": [ "websecure" ], - "service": "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-1c0cf64bde37d9d0df06-wrr", - "rule": "Host(`foo.com`) \u0026\u0026 Path(`/bar`)", + "service": "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-af329269dd38031b03e3-wrr", + "rule": "Host(\"foo.com\") \u0026\u0026 Path(\"/bar\")", "ruleSyntax": "default", "priority": 100008, "tls": {}, @@ -142,7 +142,7 @@ "http://10.42.0.6:80": "UP" } }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr@kubernetesgateway": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr@kubernetesgateway": { "weighted": { "services": [ { @@ -153,10 +153,10 @@ }, "status": "enabled", "usedBy": [ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06@kubernetesgateway" + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3@kubernetesgateway" ] }, - "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-1c0cf64bde37d9d0df06-wrr@kubernetesgateway": { + "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-af329269dd38031b03e3-wrr@kubernetesgateway": { "weighted": { "services": [ { @@ -167,7 +167,7 @@ }, "status": "enabled", "usedBy": [ - "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-1c0cf64bde37d9d0df06@kubernetesgateway" + "httproute-default-http-app-1-gw-default-my-https-gateway-ep-websecure-0-af329269dd38031b03e3@kubernetesgateway" ] }, "noop@internal": { @@ -180,7 +180,7 @@ "footcp" ], "service": "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-footcp-0-e3b0c44298fc1c149afb-wrr", - "rule": "HostSNI(`*`)", + "rule": "HostSNI(\"*\")", "ruleSyntax": "default", "priority": -1, "status": "enabled", @@ -193,7 +193,7 @@ "footlsterminate" ], "service": "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-footlsterminate-0-e3b0c44298fc1c149afb-wrr", - "rule": "HostSNI(`*`)", + "rule": "HostSNI(\"*\")", "ruleSyntax": "default", "priority": -1, "tls": { @@ -209,7 +209,7 @@ "footlspassthrough" ], "service": "tlsroute-default-tls-app-1-gw-default-my-tls-gateway-ep-footlspassthrough-0-e3b0c44298fc1c149afb-wrr", - "rule": "HostSNI(`foo.bar`)", + "rule": "HostSNI(\"foo.bar\")", "ruleSyntax": "default", "priority": 7, "tls": { diff --git a/pkg/provider/kubernetes/gateway/grpcroute.go b/pkg/provider/kubernetes/gateway/grpcroute.go index 39b84181ac..835de1bf7b 100644 --- a/pkg/provider/kubernetes/gateway/grpcroute.go +++ b/pkg/provider/kubernetes/gateway/grpcroute.go @@ -391,7 +391,7 @@ func buildGRPCMatchRule(hostnames []gatev1.Hostname, match gatev1.GRPCRouteMatch func buildGRPCMethodRule(method *gatev1.GRPCMethodMatch) string { if method == nil { - return "PathPrefix(`/`)" + return `PathPrefix("/")` } sExpr := "[^/]+" @@ -404,7 +404,7 @@ func buildGRPCMethodRule(method *gatev1.GRPCMethodMatch) string { mExpr = m } - return fmt.Sprintf("PathRegexp(`/%s/%s`)", sExpr, mExpr) + return fmt.Sprintf("PathRegexp(%q)", fmt.Sprintf("/%s/%s", sExpr, mExpr)) } func buildGRPCHeaderRules(headers []gatev1.GRPCHeaderMatch) []string { @@ -412,9 +412,9 @@ func buildGRPCHeaderRules(headers []gatev1.GRPCHeaderMatch) []string { for _, header := range headers { switch ptr.Deref(header.Type, gatev1.GRPCHeaderMatchExact) { case gatev1.GRPCHeaderMatchExact: - rules = append(rules, fmt.Sprintf("Header(`%s`,`%s`)", header.Name, header.Value)) + rules = append(rules, fmt.Sprintf("Header(%q,%q)", header.Name, header.Value)) case gatev1.GRPCHeaderMatchRegularExpression: - rules = append(rules, fmt.Sprintf("HeaderRegexp(`%s`,`%s`)", header.Name, header.Value)) + rules = append(rules, fmt.Sprintf("HeaderRegexp(%q,%q)", header.Name, header.Value)) } } diff --git a/pkg/provider/kubernetes/gateway/grpcroute_test.go b/pkg/provider/kubernetes/gateway/grpcroute_test.go index 51ceb1324e..fc70dd5873 100644 --- a/pkg/provider/kubernetes/gateway/grpcroute_test.go +++ b/pkg/provider/kubernetes/gateway/grpcroute_test.go @@ -19,13 +19,13 @@ func Test_buildGRPCMatchRule(t *testing.T) { }{ { desc: "Empty rule and matches", - expectedRule: "PathPrefix(`/`)", + expectedRule: `PathPrefix("/")`, expectedPriority: 15, }, { desc: "One Host rule without match", hostnames: []gatev1.Hostname{"foo.com"}, - expectedRule: "Host(`foo.com`) && PathPrefix(`/`)", + expectedRule: `Host("foo.com") && PathPrefix("/")`, expectedPriority: 22, }, { @@ -37,7 +37,7 @@ func Test_buildGRPCMatchRule(t *testing.T) { Method: ptr.To("bar"), }, }, - expectedRule: "PathRegexp(`/foo/bar`)", + expectedRule: `PathRegexp("/foo/bar")`, expectedPriority: 22, }, { @@ -56,7 +56,7 @@ func Test_buildGRPCMatchRule(t *testing.T) { }, }, }, - expectedRule: "PathRegexp(`/foo/bar`) && Header(`foo`,`bar`)", + expectedRule: `PathRegexp("/foo/bar") && Header("foo","bar")`, expectedPriority: 45, }, { @@ -76,7 +76,7 @@ func Test_buildGRPCMatchRule(t *testing.T) { }, }, }, - expectedRule: "Host(`foo.com`) && PathRegexp(`/foo/bar`) && Header(`foo`,`bar`)", + expectedRule: `Host("foo.com") && PathRegexp("/foo/bar") && Header("foo","bar")`, expectedPriority: 52, }, } @@ -100,7 +100,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { }{ { desc: "Empty", - expectedRule: "PathPrefix(`/`)", + expectedRule: `PathPrefix("/")`, }, { desc: "Exact service matching", @@ -108,7 +108,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { Type: ptr.To(gatev1.GRPCMethodMatchExact), Service: ptr.To("foo"), }, - expectedRule: "PathRegexp(`/foo/[^/]+`)", + expectedRule: `PathRegexp("/foo/[^/]+")`, }, { desc: "Exact method matching", @@ -116,7 +116,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { Type: ptr.To(gatev1.GRPCMethodMatchExact), Method: ptr.To("bar"), }, - expectedRule: "PathRegexp(`/[^/]+/bar`)", + expectedRule: `PathRegexp("/[^/]+/bar")`, }, { desc: "Exact service and method matching", @@ -125,7 +125,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { Service: ptr.To("foo"), Method: ptr.To("bar"), }, - expectedRule: "PathRegexp(`/foo/bar`)", + expectedRule: `PathRegexp("/foo/bar")`, }, { desc: "Regexp service matching", @@ -133,7 +133,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { Type: ptr.To(gatev1.GRPCMethodMatchRegularExpression), Service: ptr.To("[^1-9/]"), }, - expectedRule: "PathRegexp(`/[^1-9/]/[^/]+`)", + expectedRule: `PathRegexp("/[^1-9/]/[^/]+")`, }, { desc: "Regexp method matching", @@ -141,7 +141,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { Type: ptr.To(gatev1.GRPCMethodMatchRegularExpression), Method: ptr.To("[^1-9/]"), }, - expectedRule: "PathRegexp(`/[^/]+/[^1-9/]`)", + expectedRule: `PathRegexp("/[^/]+/[^1-9/]")`, }, { desc: "Regexp service and method matching", @@ -150,7 +150,7 @@ func Test_buildGRPCMethodRule(t *testing.T) { Service: ptr.To("[^1-9/]"), Method: ptr.To("[^1-9/]"), }, - expectedRule: "PathRegexp(`/[^1-9/]/[^1-9/]`)", + expectedRule: `PathRegexp("/[^1-9/]/[^1-9/]")`, }, } @@ -182,7 +182,7 @@ func Test_buildGRPCHeaderRules(t *testing.T) { Value: "bar", }, }, - expectedRules: []string{"Header(`foo`,`bar`)"}, + expectedRules: []string{`Header("foo","bar")`}, }, { desc: "One regexp match type", @@ -193,7 +193,7 @@ func Test_buildGRPCHeaderRules(t *testing.T) { Value: ".*", }, }, - expectedRules: []string{"HeaderRegexp(`foo`,`.*`)"}, + expectedRules: []string{`HeaderRegexp("foo",".*")`}, }, { desc: "One exact and regexp match type", @@ -210,8 +210,8 @@ func Test_buildGRPCHeaderRules(t *testing.T) { }, }, expectedRules: []string{ - "Header(`foo`,`bar`)", - "HeaderRegexp(`foo`,`.*`)", + `Header("foo","bar")`, + `HeaderRegexp("foo",".*")`, }, }, } diff --git a/pkg/provider/kubernetes/gateway/httproute.go b/pkg/provider/kubernetes/gateway/httproute.go index 158014af80..94a5d381dc 100644 --- a/pkg/provider/kubernetes/gateway/httproute.go +++ b/pkg/provider/kubernetes/gateway/httproute.go @@ -628,12 +628,12 @@ func buildHostRule(hostnames []gatev1.Hostname) (string, int) { wildcard := strings.Count(host, "*") if wildcard == 0 { - rules = append(rules, fmt.Sprintf("Host(`%s`)", host)) + rules = append(rules, fmt.Sprintf("Host(%q)", host)) continue } host = strings.Replace(regexp.QuoteMeta(host), `\*\.`, `[a-z0-9-\.]+\.`, 1) - rules = append(rules, fmt.Sprintf("HostRegexp(`^%s$`)", host)) + rules = append(rules, fmt.Sprintf("HostRegexp(%q)", fmt.Sprintf("^%s$", host))) } switch len(rules) { @@ -671,7 +671,7 @@ func buildMatchRule(hostnames []gatev1.Hostname, match gatev1.HTTPRouteMatch) (s priority += pathPriority if match.Method != nil { - matchRules = append(matchRules, fmt.Sprintf("Method(`%s`)", *match.Method)) + matchRules = append(matchRules, fmt.Sprintf("Method(%q)", *match.Method)) priority += 1000 } @@ -702,23 +702,23 @@ func buildPathRule(pathMatch gatev1.HTTPPathMatch) (string, int) { switch pathType { case gatev1.PathMatchExact: - return fmt.Sprintf("Path(`%s`)", pathValue), 100000 + return fmt.Sprintf("Path(%q)", pathValue), 100000 case gatev1.PathMatchPathPrefix: // PathPrefix(`/`) rule is a catch-all, // here we ensure it would be evaluated last. if pathValue == "/" { - return "PathPrefix(`/`)", 1 + return `PathPrefix("/")`, 1 } pv := strings.TrimSuffix(pathValue, "/") - return fmt.Sprintf("(Path(`%[1]s`) || PathPrefix(`%[1]s/`))", pv), 10000 + len(pathValue)*100 + return fmt.Sprintf("(Path(%q) || PathPrefix(%q))", pv, fmt.Sprintf("%s/", pv)), 10000 + len(pathValue)*100 case gatev1.PathMatchRegularExpression: - return fmt.Sprintf("PathRegexp(`%s`)", pathValue), 10000 + len(pathValue)*100 + return fmt.Sprintf("PathRegexp(%q)", pathValue), 10000 + len(pathValue)*100 default: - return "PathPrefix(`/`)", 1 + return `PathPrefix("/")`, 1 } } @@ -731,9 +731,9 @@ func buildHeaderRules(headers []gatev1.HTTPHeaderMatch) ([]string, int) { typ := ptr.Deref(header.Type, gatev1.HeaderMatchExact) switch typ { case gatev1.HeaderMatchExact: - rules = append(rules, fmt.Sprintf("Header(`%s`,`%s`)", header.Name, header.Value)) + rules = append(rules, fmt.Sprintf("Header(%q,%q)", header.Name, header.Value)) case gatev1.HeaderMatchRegularExpression: - rules = append(rules, fmt.Sprintf("HeaderRegexp(`%s`,`%s`)", header.Name, header.Value)) + rules = append(rules, fmt.Sprintf("HeaderRegexp(%q,%q)", header.Name, header.Value)) } priority += 100 } @@ -750,9 +750,9 @@ func buildQueryParamRules(queryParams []gatev1.HTTPQueryParamMatch) ([]string, i typ := ptr.Deref(qp.Type, gatev1.QueryParamMatchExact) switch typ { case gatev1.QueryParamMatchExact: - rules = append(rules, fmt.Sprintf("Query(`%s`,`%s`)", qp.Name, qp.Value)) + rules = append(rules, fmt.Sprintf("Query(%q,%q)", qp.Name, qp.Value)) case gatev1.QueryParamMatchRegularExpression: - rules = append(rules, fmt.Sprintf("QueryRegexp(`%s`,`%s`)", qp.Name, qp.Value)) + rules = append(rules, fmt.Sprintf("QueryRegexp(%q,%q)", qp.Name, qp.Value)) } priority += 10 } diff --git a/pkg/provider/kubernetes/gateway/httproute_test.go b/pkg/provider/kubernetes/gateway/httproute_test.go index e49b96cb3b..fa39e38b6f 100644 --- a/pkg/provider/kubernetes/gateway/httproute_test.go +++ b/pkg/provider/kubernetes/gateway/httproute_test.go @@ -25,7 +25,7 @@ func Test_buildHostRule(t *testing.T) { hostnames: []gatev1.Hostname{ "Foo", }, - expectedRule: "Host(`Foo`)", + expectedRule: `Host("Foo")`, expectedPriority: 3, }, { @@ -35,7 +35,7 @@ func Test_buildHostRule(t *testing.T) { "Bar", "Bir", }, - expectedRule: "(Host(`Foo`) || Host(`Bar`) || Host(`Bir`))", + expectedRule: `(Host("Foo") || Host("Bar") || Host("Bir"))`, expectedPriority: 3, }, { @@ -45,7 +45,7 @@ func Test_buildHostRule(t *testing.T) { "bar.foo", "foo.foo", }, - expectedRule: "(HostRegexp(`^[a-z0-9-\\.]+\\.bar\\.foo$`) || Host(`bar.foo`) || Host(`foo.foo`))", + expectedRule: `(HostRegexp("^[a-z0-9-\\.]+\\.bar\\.foo$") || Host("bar.foo") || Host("foo.foo"))`, expectedPriority: 9, }, { @@ -53,7 +53,7 @@ func Test_buildHostRule(t *testing.T) { hostnames: []gatev1.Hostname{ "*.bar.foo", }, - expectedRule: "HostRegexp(`^[a-z0-9-\\.]+\\.bar\\.foo$`)", + expectedRule: `HostRegexp("^[a-z0-9-\\.]+\\.bar\\.foo$")`, expectedPriority: 9, }, } @@ -80,13 +80,13 @@ func Test_buildMatchRule(t *testing.T) { }{ { desc: "Empty rule and matches", - expectedRule: "PathPrefix(`/`)", + expectedRule: `PathPrefix("/")`, expectedPriority: 1, }, { desc: "One Host rule without match", hostnames: []gatev1.Hostname{"foo.com"}, - expectedRule: "Host(`foo.com`) && PathPrefix(`/`)", + expectedRule: `Host("foo.com") && PathPrefix("/")`, expectedPriority: 8, }, { @@ -98,7 +98,7 @@ func Test_buildMatchRule(t *testing.T) { }), Headers: nil, }, - expectedRule: "PathPrefix(`/`)", + expectedRule: `PathPrefix("/")`, expectedPriority: 1, }, { @@ -112,13 +112,13 @@ func Test_buildMatchRule(t *testing.T) { {Name: "foo", Value: "bar"}, }, }, - expectedRule: "PathPrefix(`/`) && Header(`foo`,`bar`)", + expectedRule: `PathPrefix("/") && Header("foo","bar")`, expectedPriority: 101, }, { desc: "One HTTPRouteMatch with nil HTTPPathMatch", match: gatev1.HTTPRouteMatch{Path: nil}, - expectedRule: "PathPrefix(`/`)", + expectedRule: `PathPrefix("/")`, expectedPriority: 1, }, { @@ -129,7 +129,7 @@ func Test_buildMatchRule(t *testing.T) { Value: ptr.To("/foo/"), }, }, - expectedRule: "(Path(`/foo`) || PathPrefix(`/foo/`))", + expectedRule: `(Path("/foo") || PathPrefix("/foo/"))`, expectedPriority: 10500, }, { @@ -140,7 +140,7 @@ func Test_buildMatchRule(t *testing.T) { Value: nil, }, }, - expectedRule: "Path(`/`)", + expectedRule: `Path("/")`, expectedPriority: 100000, }, { @@ -151,7 +151,7 @@ func Test_buildMatchRule(t *testing.T) { Value: ptr.To("/foo/"), }, }, - expectedRule: "Path(`/foo/`)", + expectedRule: `Path("/foo/")`, expectedPriority: 100000, }, { @@ -169,7 +169,7 @@ func Test_buildMatchRule(t *testing.T) { }, }, }, - expectedRule: "Path(`/foo/`) && Header(`my-header`,`foo`)", + expectedRule: `Path("/foo/") && Header("my-header","foo")`, expectedPriority: 100100, }, { @@ -188,7 +188,7 @@ func Test_buildMatchRule(t *testing.T) { }, }, }, - expectedRule: "Host(`foo.com`) && Path(`/foo/`) && Header(`my-header`,`foo`)", + expectedRule: `Host("foo.com") && Path("/foo/") && Header("my-header","foo")`, expectedPriority: 100107, }, } diff --git a/pkg/provider/kubernetes/gateway/kubernetes_test.go b/pkg/provider/kubernetes/gateway/kubernetes_test.go index 1f5c1df8fd..988ff73a99 100644 --- a/pkg/provider/kubernetes/gateway/kubernetes_test.go +++ b/pkg/provider/kubernetes/gateway/kubernetes_test.go @@ -264,17 +264,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -633,17 +633,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -695,10 +695,10 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, Service: "api@internal", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, @@ -729,10 +729,10 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-af329269dd38031b03e3": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -740,7 +740,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -801,17 +801,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-66e726cd8903b49727ae": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-68ef33b73c758387c1f3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-66e726cd8903b49727ae-wrr", - Rule: "(Host(`foo.com`) || Host(`bar.com`)) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-68ef33b73c758387c1f3-wrr", + Rule: `(Host("foo.com") || Host("bar.com")) && PathPrefix("/")`, Priority: 9, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-66e726cd8903b49727ae-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-68ef33b73c758387c1f3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -863,17 +863,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-baa117c0219e3878749f": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-e9a5f9c29d35e93ffeef": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-baa117c0219e3878749f-wrr", - Rule: "(Host(`foo.com`) || HostRegexp(`^[a-z0-9-\\.]+\\.bar\\.com$`)) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-e9a5f9c29d35e93ffeef-wrr", + Rule: `(Host("foo.com") || HostRegexp("^[a-z0-9-\\.]+\\.bar\\.com$")) && PathPrefix("/")`, Priority: 11, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-baa117c0219e3878749f-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-e9a5f9c29d35e93ffeef-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -925,17 +925,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-45eba2eaf40ac792e036": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-5c1d3f0c956b39f87c03": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-45eba2eaf40ac792e036-wrr", - Rule: "(Host(`foo.com`) || HostRegexp(`^[a-z0-9-\\.]+\\.foo\\.com$`)) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-5c1d3f0c956b39f87c03-wrr", + Rule: `(Host("foo.com") || HostRegexp("^[a-z0-9-\\.]+\\.foo\\.com$")) && PathPrefix("/")`, Priority: 11, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-45eba2eaf40ac792e036-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-5c1d3f0c956b39f87c03-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -987,24 +987,24 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && Path(`/bar`)", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100009, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-d737b4933fa88e68ab8a": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-9618b798382aa725aa8b": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && Path(`/bir`)", + Rule: `Host("foo.com") && Path("/bir")`, Priority: 100008, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-d737b4933fa88e68ab8a-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-9618b798382aa725aa8b-wrr", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1014,7 +1014,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-d737b4933fa88e68ab8a-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-9618b798382aa725aa8b-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1083,17 +1083,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && Path(`/bar`)", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1171,17 +1171,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-http-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-http-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-http-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-http-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, - "httproute-default-http-app-1-gw-default-my-gateway-https-ep-websecure-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-https-ep-websecure-0-af329269dd38031b03e3": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-https-ep-websecure-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-https-ep-websecure-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -1189,7 +1189,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-http-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-http-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1199,7 +1199,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-1-gw-default-my-gateway-https-ep-websecure-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-https-ep-websecure-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1265,17 +1265,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-af329269dd38031b03e3": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -1283,7 +1283,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1293,7 +1293,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1354,31 +1354,31 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-6cf37fa71907768d925c": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-e6f8c7ac24ba601f1855": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && (Path(`/bar`) || PathPrefix(`/bar/`)) && Header(`my-header`,`foo`) && Header(`my-header2`,`bar`)", + Rule: `Host("foo.com") && (Path("/bar") || PathPrefix("/bar/")) && Header("my-header","foo") && Header("my-header2","bar")`, Priority: 10610, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-6cf37fa71907768d925c-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-e6f8c7ac24ba601f1855-wrr", }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-2-d23f7039bc8036fb918c": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-2-b69179397f7b7cef15cd": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && PathRegexp(`^/buzz/[0-9]+$`)", + Rule: `Host("foo.com") && PathRegexp("^/buzz/[0-9]+$")`, Priority: 11408, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-2-d23f7039bc8036fb918c-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-2-b69179397f7b7cef15cd-wrr", }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-aaba0f24fd26e1ca2276": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-2c055906fe09bc52ae0a": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && Path(`/bar`) && Header(`my-header`,`bar`)", + Rule: `Host("foo.com") && Path("/bar") && Header("my-header","bar")`, Priority: 100109, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-aaba0f24fd26e1ca2276-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-2c055906fe09bc52ae0a-wrr", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-6cf37fa71907768d925c-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-e6f8c7ac24ba601f1855-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1388,7 +1388,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-2-d23f7039bc8036fb918c-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-2-b69179397f7b7cef15cd-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1398,7 +1398,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-aaba0f24fd26e1ca2276-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-1-2c055906fe09bc52ae0a-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1450,17 +1450,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-74ad70a7cf090becdd3c": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-c93669faca743dc125a6": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && (Path(`/foo`) || PathPrefix(`/foo/`)) && Method(`GET`)", + Rule: `Host("foo.com") && (Path("/foo") || PathPrefix("/foo/")) && Method("GET")`, Priority: 11408, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-74ad70a7cf090becdd3c-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-c93669faca743dc125a6-wrr", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-74ad70a7cf090becdd3c-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-c93669faca743dc125a6-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1512,17 +1512,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-bb7b03c9610e982fd627": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-fa3e8bf16a9c0d8be299": { EntryPoints: []string{"web"}, - Rule: "Host(`foo.com`) && (Path(`/foo`) || PathPrefix(`/foo/`)) && Query(`foo`,`bar`) && QueryRegexp(`baz`,`buz`)", + Rule: `Host("foo.com") && (Path("/foo") || PathPrefix("/foo/")) && Query("foo","bar") && QueryRegexp("baz","buz")`, Priority: 10428, RuleSyntax: "default", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-bb7b03c9610e982fd627-wrr", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-fa3e8bf16a9c0d8be299-wrr", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-bb7b03c9610e982fd627-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-fa3e8bf16a9c0d8be299-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1574,17 +1574,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-efde1997778109a1f6eb": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a5ad2b19cc7661582983": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-efde1997778109a1f6eb-wrr", - Rule: "Host(`foo.com`) && Path(`/foo`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a5ad2b19cc7661582983-wrr", + Rule: `Host("foo.com") && Path("/foo")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-efde1997778109a1f6eb-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a5ad2b19cc7661582983-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1636,24 +1636,24 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-efde1997778109a1f6eb": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a5ad2b19cc7661582983": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-efde1997778109a1f6eb-wrr", - Rule: "Host(`foo.com`) && Path(`/foo`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a5ad2b19cc7661582983-wrr", + Rule: `Host("foo.com") && Path("/foo")`, Priority: 100008, RuleSyntax: "default", }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-66f5c78d03d948e36597": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-95b064ae9808f10000f4": { EntryPoints: []string{"web"}, - Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-66f5c78d03d948e36597-wrr", - Rule: "Host(`bar.com`) && Path(`/bar`)", + Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-95b064ae9808f10000f4-wrr", + Rule: `Host("bar.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-efde1997778109a1f6eb-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a5ad2b19cc7661582983-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1663,7 +1663,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-66f5c78d03d948e36597-wrr": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-95b064ae9808f10000f4-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1732,17 +1732,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-66f5c78d03d948e36597": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-95b064ae9808f10000f4": { EntryPoints: []string{"web"}, - Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-66f5c78d03d948e36597-wrr", - Rule: "Host(`bar.com`) && Path(`/bar`)", + Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-95b064ae9808f10000f4-wrr", + Rule: `Host("bar.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-66f5c78d03d948e36597-wrr": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-95b064ae9808f10000f4-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1794,17 +1794,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr", - Rule: "Host(`example.org`) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr", + Rule: `Host("example.org") && PathPrefix("/")`, Priority: 13, RuleSyntax: "default", - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-requestheadermodifier-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-requestheadermodifier-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-requestheadermodifier-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-requestheadermodifier-0": { RequestHeaderModifier: &dynamic.HeaderModifier{ Set: map[string]string{"X-Foo": "Bar"}, Add: map[string]string{"X-Bar": "Foo"}, @@ -1813,7 +1813,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1865,17 +1865,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr", - Rule: "Host(`example.org`) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr", + Rule: `Host("example.org") && PathPrefix("/")`, Priority: 13, RuleSyntax: "default", - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-responseheadermodifier-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-responseheadermodifier-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-responseheadermodifier-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-responseheadermodifier-0": { ResponseHeaderModifier: &dynamic.HeaderModifier{ Set: map[string]string{"X-Foo": "Bar"}, Add: map[string]string{"X-Bar": "Foo"}, @@ -1884,7 +1884,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -1936,17 +1936,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr", - Rule: "Host(`example.org`) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr", + Rule: `Host("example.org") && PathPrefix("/")`, Priority: 13, RuleSyntax: "default", - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-requestredirect-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-requestredirect-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-requestredirect-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-requestredirect-0": { RequestRedirect: &dynamic.RequestRedirect{ Scheme: ptr.To("https"), Port: ptr.To(""), @@ -1955,7 +1955,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr": { Weighted: &dynamic.WeightedRoundRobin{}, }, }, @@ -1983,17 +1983,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr", - Rule: "Host(`example.org`) && PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr", + Rule: `Host("example.org") && PathPrefix("/")`, Priority: 13, RuleSyntax: "default", - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-requestredirect-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-requestredirect-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-requestredirect-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-requestredirect-0": { RequestRedirect: &dynamic.RequestRedirect{ Hostname: ptr.To("example.com"), Port: ptr.To("443"), @@ -2002,7 +2002,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-364ce6ec04c3d49b19c4-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-3be6c6c1abd7a2aec50c-wrr": { Weighted: &dynamic.WeightedRoundRobin{}, }, }, @@ -2030,24 +2030,24 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-wrr", - Rule: "Host(`example.com`) && (Path(`/foo`) || PathPrefix(`/foo/`))", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-wrr", + Rule: `Host("example.com") && (Path("/foo") || PathPrefix("/foo/"))`, RuleSyntax: "default", Priority: 10412, - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-urlrewrite-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-urlrewrite-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-urlrewrite-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-urlrewrite-0": { URLRewrite: &dynamic.URLRewrite{ Path: ptr.To("/bar"), }, }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2099,24 +2099,24 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-wrr", - Rule: "Host(`example.com`) && (Path(`/foo`) || PathPrefix(`/foo/`))", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-wrr", + Rule: `Host("example.com") && (Path("/foo") || PathPrefix("/foo/"))`, RuleSyntax: "default", Priority: 10412, - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-urlrewrite-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-urlrewrite-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-urlrewrite-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-urlrewrite-0": { URLRewrite: &dynamic.URLRewrite{ Hostname: ptr.To("www.foo.bar"), }, }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2168,17 +2168,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-wrr", - Rule: "Host(`example.com`) && (Path(`/foo`) || PathPrefix(`/foo/`))", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-wrr", + Rule: `Host("example.com") && (Path("/foo") || PathPrefix("/foo/"))`, RuleSyntax: "default", Priority: 10412, - Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-urlrewrite-0"}, + Middlewares: []string{"httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-urlrewrite-0"}, }, }, Middlewares: map[string]*dynamic.Middleware{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-urlrewrite-0": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-urlrewrite-0": { URLRewrite: &dynamic.URLRewrite{ Hostname: ptr.To("www.foo.bar"), Path: ptr.To("/xyz"), @@ -2187,7 +2187,7 @@ func TestLoadHTTPRoutes(t *testing.T) { }, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-7f90cf546b15efadf2f8-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1fc167f18269cb272259-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2239,17 +2239,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2310,17 +2310,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2378,17 +2378,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2437,17 +2437,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2497,17 +2497,17 @@ func TestLoadHTTPRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2611,17 +2611,17 @@ func TestLoadHTTPRoutes_backendExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2661,17 +2661,17 @@ func TestLoadHTTPRoutes_backendExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2714,17 +2714,17 @@ func TestLoadHTTPRoutes_backendExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2765,17 +2765,17 @@ func TestLoadHTTPRoutes_backendExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2817,17 +2817,17 @@ func TestLoadHTTPRoutes_backendExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -2889,17 +2889,17 @@ func TestLoadHTTPRoutes_backendExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-multi-protocols-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-multi-protocols-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-multi-protocols-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-multi-protocols-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-multi-protocols-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-multi-protocols-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3072,10 +3072,10 @@ func TestLoadHTTPRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", Middlewares: []string{ @@ -3086,7 +3086,7 @@ func TestLoadHTTPRoutes_filterExtensionRef(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3142,10 +3142,10 @@ func TestLoadHTTPRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", Middlewares: []string{ @@ -3159,7 +3159,7 @@ func TestLoadHTTPRoutes_filterExtensionRef(t *testing.T) { "default-my-second-middleware": {Headers: &dynamic.Headers{CustomRequestHeaders: map[string]string{"Test-Header": "Test"}}}, }, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3210,17 +3210,17 @@ func TestLoadHTTPRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-err-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-err-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-err-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-err-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3260,17 +3260,17 @@ func TestLoadHTTPRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-err-wrr", - Rule: "Host(`foo.com`) && Path(`/bar`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-err-wrr", + Rule: `Host("foo.com") && Path("/bar")`, Priority: 100008, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-1c0cf64bde37d9d0df06-err-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-af329269dd38031b03e3-err-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3358,10 +3358,10 @@ func TestLoadGRPCRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64": { EntryPoints: []string{"web"}, - Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-wrr", - Rule: "Host(`foo.com`) && PathPrefix(`/`)", + Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-wrr", + Rule: `Host("foo.com") && PathPrefix("/")`, Priority: 22, RuleSyntax: "default", Middlewares: []string{ @@ -3372,7 +3372,7 @@ func TestLoadGRPCRoutes_filterExtensionRef(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-wrr": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3428,10 +3428,10 @@ func TestLoadGRPCRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64": { EntryPoints: []string{"web"}, - Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-wrr", - Rule: "Host(`foo.com`) && PathPrefix(`/`)", + Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-wrr", + Rule: `Host("foo.com") && PathPrefix("/")`, Priority: 22, RuleSyntax: "default", Middlewares: []string{ @@ -3445,7 +3445,7 @@ func TestLoadGRPCRoutes_filterExtensionRef(t *testing.T) { "default-my-second-middleware": {Headers: &dynamic.Headers{CustomRequestHeaders: map[string]string{"Test-Header": "Test"}}}, }, Services: map[string]*dynamic.Service{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-wrr": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3496,17 +3496,17 @@ func TestLoadGRPCRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64": { EntryPoints: []string{"web"}, - Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-err-wrr", - Rule: "Host(`foo.com`) && PathPrefix(`/`)", + Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-err-wrr", + Rule: `Host("foo.com") && PathPrefix("/")`, Priority: 22, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-err-wrr": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-err-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3549,17 +3549,17 @@ func TestLoadGRPCRoutes_filterExtensionRef(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64": { EntryPoints: []string{"web"}, - Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-err-wrr", - Rule: "Host(`foo.com`) && PathPrefix(`/`)", + Service: "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-err-wrr", + Rule: `Host("foo.com") && PathPrefix("/")`, Priority: 22, RuleSyntax: "default", }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-74471866db6e94e08d00-err-wrr": { + "grpcroute-default-grpc-app-1-gw-default-my-gateway-ep-web-0-6a1e0890d475642f7c64-err-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -3796,7 +3796,7 @@ func TestLoadTCPRoutes(t *testing.T) { Routers: map[string]*dynamic.TCPRouter{ "tcproute-default-TCP-app-1-gw-default-my-gateway-ep-TCP-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"TCP"}, - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", Service: "tcproute-default-TCP-app-1-gw-default-my-gateway-ep-TCP-0-e3b0c44298fc1c149afb-wrr", }, @@ -3844,7 +3844,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -3902,13 +3902,13 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp-1"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-default-tcp-app-2-gw-default-my-tcp-gateway-ep-tcp-2-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp-2"}, Service: "tcproute-default-tcp-app-2-gw-default-my-tcp-gateway-ep-tcp-2-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -3988,13 +3988,13 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-gw-default-my-tcp-gateway-ep-tcp-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp-1"}, Service: "tcproute-default-tcp-app-gw-default-my-tcp-gateway-ep-tcp-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-default-tcp-app-gw-default-my-tcp-gateway-ep-tcp-1-1-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp-1"}, Service: "tcproute-default-tcp-app-gw-default-my-tcp-gateway-ep-tcp-1-1-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4072,7 +4072,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4132,7 +4132,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls"}, Service: "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -4196,7 +4196,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-default-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-default-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4252,13 +4252,13 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-default-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-default-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-bar-tcp-app-bar-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-bar-tcp-app-bar-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4336,7 +4336,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-bar-tcp-app-bar-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-bar-tcp-app-bar-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4393,7 +4393,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4446,7 +4446,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4500,7 +4500,7 @@ func TestLoadTCPRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tcp-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, }, @@ -4730,7 +4730,7 @@ func TestLoadTLSRoutes(t *testing.T) { "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-TCP-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"TCP"}, Priority: 0, - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", Service: "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-TCP-0-e3b0c44298fc1c149afb-wrr", TLS: &dynamic.RouterTCPTLSConfig{}, @@ -4822,7 +4822,7 @@ func TestLoadTLSRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -4888,7 +4888,7 @@ func TestLoadTLSRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -4948,7 +4948,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tcp"}, Service: "tlsroute-default-tls-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`)", + Rule: `HostSNI("foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5008,7 +5008,7 @@ func TestLoadTLSRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-tls-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls"}, Service: "tcproute-default-tcp-app-1-gw-default-my-tls-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -5016,7 +5016,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tcp"}, Service: "tlsroute-default-tls-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", Priority: 0, - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5106,7 +5106,7 @@ func TestLoadTLSRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls"}, Service: "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -5177,7 +5177,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`)", + Rule: `HostSNI("foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5237,7 +5237,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`)", + Rule: `HostSNI("foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5297,7 +5297,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`)", + Rule: `HostSNI("foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5357,7 +5357,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`) || HostSNI(`bar.example.com`)", + Rule: `HostSNI("foo.example.com") || HostSNI("bar.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5417,7 +5417,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-default-tls-app-default-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 11, - Rule: "HostSNI(`foo.default`)", + Rule: `HostSNI("foo.default")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5477,7 +5477,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-default-tls-app-default-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 11, - Rule: "HostSNI(`foo.default`)", + Rule: `HostSNI("foo.default")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5487,7 +5487,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-bar-tls-app-bar-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 7, - Rule: "HostSNI(`foo.bar`)", + Rule: `HostSNI("foo.bar")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5569,7 +5569,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tls"}, Service: "tlsroute-bar-tls-app-bar-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", Priority: 7, - Rule: "HostSNI(`foo.bar`)", + Rule: `HostSNI("foo.bar")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5629,7 +5629,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tcp-1"}, Service: "tlsroute-default-tls-app-gw-default-my-gateway-ep-tcp-1-0-e3b0c44298fc1c149afb-wrr", Priority: 0, - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5639,7 +5639,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tcp-1"}, Service: "tlsroute-default-tls-app-gw-default-my-gateway-ep-tcp-1-1-e3b0c44298fc1c149afb-wrr", Priority: 0, - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5722,7 +5722,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tcp"}, Service: "tlsroute-default-tls-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`)", + Rule: `HostSNI("foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5779,7 +5779,7 @@ func TestLoadTLSRoutes(t *testing.T) { EntryPoints: []string{"tcp"}, Service: "tlsroute-default-tls-app-1-gw-default-my-tls-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", Priority: 15, - Rule: "HostSNI(`foo.example.com`)", + Rule: `HostSNI("foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -5988,13 +5988,13 @@ func TestLoadMixedRoutes(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls-1"}, Service: "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -6002,7 +6002,7 @@ func TestLoadMixedRoutes(t *testing.T) { EntryPoints: []string{"tls-2"}, Service: "tlsroute-default-tls-app-1-gw-default-my-gateway-ep-tls-2-0-e3b0c44298fc1c149afb-wrr", Priority: 24, - Rule: "HostSNI(`pass.tls.foo.example.com`)", + Rule: `HostSNI("pass.tls.foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -6058,17 +6058,17 @@ func TestLoadMixedRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -6076,7 +6076,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6086,7 +6086,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6177,13 +6177,13 @@ func TestLoadMixedRoutes(t *testing.T) { "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls-1"}, Service: "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -6191,7 +6191,7 @@ func TestLoadMixedRoutes(t *testing.T) { EntryPoints: []string{"tls-2"}, Service: "tlsroute-default-tls-app-default-gw-default-my-gateway-ep-tls-2-0-e3b0c44298fc1c149afb-wrr", Priority: 24, - Rule: "HostSNI(`pass.tls.foo.example.com`)", + Rule: `HostSNI("pass.tls.foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -6247,17 +6247,17 @@ func TestLoadMixedRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", }, - "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -6265,7 +6265,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6275,7 +6275,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6338,13 +6338,13 @@ func TestLoadMixedRoutes(t *testing.T) { "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls-1"}, Service: "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -6352,7 +6352,7 @@ func TestLoadMixedRoutes(t *testing.T) { EntryPoints: []string{"tls-2"}, Service: "tlsroute-default-tls-app-default-gw-default-my-gateway-ep-tls-2-0-e3b0c44298fc1c149afb-wrr", Priority: 24, - Rule: "HostSNI(`pass.tls.foo.example.com`)", + Rule: `HostSNI("pass.tls.foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -6361,13 +6361,13 @@ func TestLoadMixedRoutes(t *testing.T) { "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls-1"}, Service: "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -6453,32 +6453,32 @@ func TestLoadMixedRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", }, - "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900": { EntryPoints: []string{"web"}, - Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900": { EntryPoints: []string{"websecure"}, - Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -6486,7 +6486,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6496,7 +6496,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6540,7 +6540,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6550,7 +6550,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6596,13 +6596,13 @@ func TestLoadMixedRoutes(t *testing.T) { "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls-1"}, Service: "tcproute-bar-tcp-app-bar-gw-default-my-gateway-ep-tls-1-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -6610,7 +6610,7 @@ func TestLoadMixedRoutes(t *testing.T) { EntryPoints: []string{"tls-2"}, Service: "tlsroute-bar-tls-app-bar-gw-default-my-gateway-ep-tls-2-0-e3b0c44298fc1c149afb-wrr", Priority: 24, - Rule: "HostSNI(`pass.tls.foo.example.com`)", + Rule: `HostSNI("pass.tls.foo.example.com")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{ Passthrough: true, @@ -6666,17 +6666,17 @@ func TestLoadMixedRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900": { EntryPoints: []string{"web"}, - Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900": { EntryPoints: []string{"websecure"}, - Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -6701,7 +6701,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6711,7 +6711,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr": { + "httproute-bar-http-app-bar-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6756,13 +6756,13 @@ func TestLoadMixedRoutes(t *testing.T) { "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tcp"}, Service: "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tcp-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", }, "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls"}, Service: "tcproute-default-tcp-app-default-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -6806,17 +6806,17 @@ func TestLoadMixedRoutes(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900": { EntryPoints: []string{"web"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", }, - "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900": { EntryPoints: []string{"websecure"}, - Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr", - Rule: "PathPrefix(`/`)", + Service: "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr", + Rule: `PathPrefix("/")`, Priority: 2, RuleSyntax: "default", TLS: &dynamic.RouterTLSConfig{}, @@ -6824,7 +6824,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-web-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -6834,7 +6834,7 @@ func TestLoadMixedRoutes(t *testing.T) { }, }, }, - "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-a431b128267aabc954fd-wrr": { + "httproute-default-http-app-default-gw-default-my-gateway-ep-websecure-0-fc344df89b6d773f1900-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { @@ -7040,7 +7040,7 @@ func TestLoadRoutesWithReferenceGrants(t *testing.T) { "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb": { EntryPoints: []string{"tls"}, Service: "tcproute-default-tcp-app-1-gw-default-my-gateway-ep-tls-0-e3b0c44298fc1c149afb-wrr", - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, RuleSyntax: "default", TLS: &dynamic.RouterTCPTLSConfig{}, }, @@ -7185,17 +7185,17 @@ func TestLoadRoutesWithReferenceGrants(t *testing.T) { }, HTTP: &dynamic.HTTPConfiguration{ Routers: map[string]*dynamic.Router{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-http-0-d40286ed9f4652ca2108": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-http-0-f407383e48e821a834a9": { EntryPoints: []string{"http"}, - Rule: "Host(`foo.example.com`) && PathPrefix(`/`)", - Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-http-0-d40286ed9f4652ca2108-wrr", + Rule: `Host("foo.example.com") && PathPrefix("/")`, + Service: "httproute-default-http-app-1-gw-default-my-gateway-ep-http-0-f407383e48e821a834a9-wrr", RuleSyntax: "default", Priority: 17, }, }, Middlewares: map[string]*dynamic.Middleware{}, Services: map[string]*dynamic.Service{ - "httproute-default-http-app-1-gw-default-my-gateway-ep-http-0-d40286ed9f4652ca2108-wrr": { + "httproute-default-http-app-1-gw-default-my-gateway-ep-http-0-f407383e48e821a834a9-wrr": { Weighted: &dynamic.WeightedRoundRobin{ Services: []dynamic.WRRService{ { diff --git a/pkg/provider/kubernetes/gateway/tcproute.go b/pkg/provider/kubernetes/gateway/tcproute.go index 04c84af5d0..e75b2ebdb2 100644 --- a/pkg/provider/kubernetes/gateway/tcproute.go +++ b/pkg/provider/kubernetes/gateway/tcproute.go @@ -119,7 +119,7 @@ func (p *Provider) loadTCPRoute(listener gatewayListener, route *gatev1alpha2.TC } router := dynamic.TCPRouter{ - Rule: "HostSNI(`*`)", + Rule: `HostSNI("*")`, EntryPoints: []string{listener.EPName}, RuleSyntax: "default", } diff --git a/pkg/provider/kubernetes/gateway/tlsroute.go b/pkg/provider/kubernetes/gateway/tlsroute.go index 86c93ac902..4252e04e8f 100644 --- a/pkg/provider/kubernetes/gateway/tlsroute.go +++ b/pkg/provider/kubernetes/gateway/tlsroute.go @@ -327,16 +327,16 @@ func hostSNIRule(hostnames []gatev1.Hostname) (string, int) { uniqHostnames[hostname] = struct{}{} if wildcard == 0 { - rules = append(rules, fmt.Sprintf("HostSNI(`%s`)", host)) + rules = append(rules, fmt.Sprintf("HostSNI(%q)", host)) continue } host = strings.Replace(regexp.QuoteMeta(host), `\*\.`, `[a-z0-9-\.]+\.`, 1) - rules = append(rules, fmt.Sprintf("HostSNIRegexp(`^%s$`)", host)) + rules = append(rules, fmt.Sprintf("HostSNIRegexp(%q)", fmt.Sprintf("^%s$", host))) } if len(hostnames) == 0 || len(rules) == 0 { - return "HostSNI(`*`)", 0 + return `HostSNI("*")`, 0 } return strings.Join(rules, " || "), priority diff --git a/pkg/provider/kubernetes/gateway/tlsroute_test.go b/pkg/provider/kubernetes/gateway/tlsroute_test.go index 64858b09b6..af66b65f7f 100644 --- a/pkg/provider/kubernetes/gateway/tlsroute_test.go +++ b/pkg/provider/kubernetes/gateway/tlsroute_test.go @@ -17,49 +17,49 @@ func Test_hostSNIRule(t *testing.T) { }{ { desc: "Empty", - expectedRule: "HostSNI(`*`)", + expectedRule: `HostSNI("*")`, expectedPriority: 0, }, { desc: "Empty hostname", hostnames: []gatev1.Hostname{""}, - expectedRule: "HostSNI(`*`)", + expectedRule: `HostSNI("*")`, expectedPriority: 0, }, { desc: "Supported wildcard", hostnames: []gatev1.Hostname{"*.foo"}, - expectedRule: "HostSNIRegexp(`^[a-z0-9-\\.]+\\.foo$`)", + expectedRule: `HostSNIRegexp("^[a-z0-9-\\.]+\\.foo$")`, expectedPriority: 4, }, { desc: "Some empty hostnames", hostnames: []gatev1.Hostname{"foo", "", "bar"}, - expectedRule: "HostSNI(`foo`) || HostSNI(`bar`)", + expectedRule: `HostSNI("foo") || HostSNI("bar")`, expectedPriority: 3, }, { desc: "Valid hostname", hostnames: []gatev1.Hostname{"foo"}, - expectedRule: "HostSNI(`foo`)", + expectedRule: `HostSNI("foo")`, expectedPriority: 3, }, { desc: "Multiple valid hostnames", hostnames: []gatev1.Hostname{"foo", "bar"}, - expectedRule: "HostSNI(`foo`) || HostSNI(`bar`)", + expectedRule: `HostSNI("foo") || HostSNI("bar")`, expectedPriority: 3, }, { desc: "Multiple valid hostnames with wildcard", hostnames: []gatev1.Hostname{"bar.foo", "foo.foo", "*.foo"}, - expectedRule: "HostSNI(`bar.foo`) || HostSNI(`foo.foo`) || HostSNIRegexp(`^[a-z0-9-\\.]+\\.foo$`)", + expectedRule: `HostSNI("bar.foo") || HostSNI("foo.foo") || HostSNIRegexp("^[a-z0-9-\\.]+\\.foo$")`, expectedPriority: 7, }, { desc: "Multiple overlapping hostnames", hostnames: []gatev1.Hostname{"foo", "bar", "foo", "baz"}, - expectedRule: "HostSNI(`foo`) || HostSNI(`bar`) || HostSNI(`baz`)", + expectedRule: `HostSNI("foo") || HostSNI("bar") || HostSNI("baz")`, expectedPriority: 3, }, } From c662b9ac6be6f25a13be433978b83150b4c960eb Mon Sep 17 00:00:00 2001 From: Romain Date: Thu, 5 Mar 2026 15:00:06 +0100 Subject: [PATCH 11/20] Remove path parsing with grpc healthcheck --- pkg/healthcheck/healthcheck.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pkg/healthcheck/healthcheck.go b/pkg/healthcheck/healthcheck.go index d8b7c81294..c7bcf2c518 100644 --- a/pkg/healthcheck/healthcheck.go +++ b/pkg/healthcheck/healthcheck.go @@ -213,10 +213,18 @@ func (shc *ServiceHealthChecker) executeHealthCheck(ctx context.Context, config ctx, cancel := context.WithDeadline(ctx, time.Now().Add(shc.timeout)) defer cancel() - if config.Mode == modeGRPC { - return shc.checkHealthGRPC(ctx, target) + switch config.Mode { + case modeGRPC: + if err := shc.checkHealthGRPC(ctx, target); err != nil { + return fmt.Errorf("checking gRPC health: %w", err) + } + default: + if err := shc.checkHealthHTTP(ctx, target); err != nil { + return fmt.Errorf("checking HTTP health: %w", err) + } } - return shc.checkHealthHTTP(ctx, target) + + return nil } // checkHealthHTTP returns an error with a meaningful description if the health check failed. @@ -287,17 +295,12 @@ func (shc *ServiceHealthChecker) newRequest(ctx context.Context, target *url.URL // checkHealthGRPC returns an error with a meaningful description if the health check failed. // Dedicated to gRPC servers implementing gRPC Health Checking Protocol v1. func (shc *ServiceHealthChecker) checkHealthGRPC(ctx context.Context, serverURL *url.URL) error { - u, err := serverURL.Parse(shc.config.Path) - if err != nil { - return fmt.Errorf("failed to parse server URL: %w", err) - } - - port := u.Port() + port := serverURL.Port() if shc.config.Port != 0 { port = strconv.Itoa(shc.config.Port) } - serverAddr := net.JoinHostPort(u.Hostname(), port) + serverAddr := net.JoinHostPort(serverURL.Hostname(), port) var opts []grpc.DialOption switch shc.config.Scheme { From 1268d9bc22eded1c8181a5e346ae89aef69029f1 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 5 Mar 2026 15:52:04 +0100 Subject: [PATCH 12/20] Bump Docker and OpenTelemetry dependencies --- go.mod | 18 ++++++------- go.sum | 40 ++++++++++++++--------------- pkg/provider/docker/builder_test.go | 8 +++--- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 5ed90eda2c..b991e7aef4 100644 --- a/go.mod +++ b/go.mod @@ -17,9 +17,9 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/containous/alice v0.0.0-20181107144136-d83ebdd94cbd // No tag on the repo. github.com/coreos/go-systemd/v22 v22.5.0 - github.com/docker/cli v28.3.3+incompatible - github.com/docker/docker v28.3.3+incompatible - github.com/docker/go-connections v0.5.0 + github.com/docker/cli v29.2.1+incompatible + github.com/docker/docker v28.5.2+incompatible + github.com/docker/go-connections v0.6.0 github.com/fatih/structs v1.1.0 github.com/fsnotify/fsnotify v1.9.0 github.com/gambol99/go-marathon v0.0.0-20180614232016-99a156b96fb2 // No tag on the repo. @@ -200,7 +200,7 @@ require ( github.com/go-errors/errors v1.0.1 // indirect github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -363,7 +363,7 @@ require ( go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect go.etcd.io/etcd/client/v3 v3.5.10 // indirect go.mongodb.org/mongo-driver v1.13.1 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/collector/component v1.31.0 // indirect go.opentelemetry.io/collector/featuregate v1.31.0 // indirect go.opentelemetry.io/collector/internal/telemetry v0.125.0 // indirect @@ -371,11 +371,11 @@ require ( go.opentelemetry.io/collector/semconv v0.125.0 // indirect go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect - go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel v1.40.0 // indirect go.opentelemetry.io/otel/log v0.11.0 // indirect - go.opentelemetry.io/otel/metric v1.36.0 // indirect - go.opentelemetry.io/otel/sdk v1.36.0 // indirect - go.opentelemetry.io/otel/trace v1.36.0 // indirect + go.opentelemetry.io/otel/metric v1.40.0 // indirect + go.opentelemetry.io/otel/sdk v1.40.0 // indirect + go.opentelemetry.io/otel/trace v1.40.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect diff --git a/go.sum b/go.sum index 3c4b199217..47660a01ed 100644 --- a/go.sum +++ b/go.sum @@ -401,12 +401,12 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnsimple/dnsimple-go/v4 v4.0.0 h1:nUCICZSyZDiiqimAAL+E8XL+0sKGks5VRki5S8XotRo= github.com/dnsimple/dnsimple-go/v4 v4.0.0/go.mod h1:AXT2yfAFOntJx6iMeo1J/zKBw0ggXFYBt4e97dqqPnc= -github.com/docker/cli v28.3.3+incompatible h1:fp9ZHAr1WWPGdIWBM1b3zLtgCF+83gRdVMTJsUeiyAo= -github.com/docker/cli v28.3.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= -github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/cli v29.2.1+incompatible h1:n3Jt0QVCN65eiVBoUTZQM9mcQICCJt3akW4pKAbKdJg= +github.com/docker/cli v29.2.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= @@ -524,8 +524,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= @@ -1519,8 +1519,8 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/collector/component v1.31.0 h1:9LzU8X1RhV3h8/QsAoTX23aFUfoJ3EUc9O/vK+hFpSI= go.opentelemetry.io/collector/component v1.31.0/go.mod h1:JbZl/KywXJxpUXPbt96qlEXJSym1zQ2hauMxYMuvlxM= go.opentelemetry.io/collector/component/componentstatus v0.125.0 h1:zlxGQZYd9kknRZSjRpOYW5SBjl0a5zYFYRPbreobXoU= @@ -1561,22 +1561,22 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= -go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= go.opentelemetry.io/otel/log v0.11.0 h1:c24Hrlk5WJ8JWcwbQxdBqxZdOK7PcP/LFtOtwpDTe3Y= go.opentelemetry.io/otel/log v0.11.0/go.mod h1:U/sxQ83FPmT29trrifhQg+Zj2lo1/IPN1PF6RTFqdwc= -go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= -go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= -go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= -go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= -go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= -go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= -go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= -go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= diff --git a/pkg/provider/docker/builder_test.go b/pkg/provider/docker/builder_test.go index c7ec5bb698..77dad2b57a 100644 --- a/pkg/provider/docker/builder_test.go +++ b/pkg/provider/docker/builder_test.go @@ -13,10 +13,8 @@ func containerJSON(ops ...func(*dockercontainertypes.InspectResponse)) dockercon Name: "fake", HostConfig: &dockercontainertypes.HostConfig{}, }, - Config: &dockercontainertypes.Config{}, - NetworkSettings: &dockercontainertypes.NetworkSettings{ - NetworkSettingsBase: dockercontainertypes.NetworkSettingsBase{}, - }, + Config: &dockercontainertypes.Config{}, + NetworkSettings: &dockercontainertypes.NetworkSettings{}, } for _, op := range ops { @@ -40,7 +38,7 @@ func networkMode(mode string) func(*dockercontainertypes.InspectResponse) { func ports(portMap nat.PortMap) func(*dockercontainertypes.InspectResponse) { return func(c *dockercontainertypes.InspectResponse) { - c.NetworkSettings.NetworkSettingsBase.Ports = portMap + c.NetworkSettings.Ports = portMap } } From d5745c38071c7a124a8f413405d2d8fda17b4efe Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 6 Mar 2026 08:54:05 +0100 Subject: [PATCH 13/20] Correct documentation for Digest auth --- .../routing-configuration/http/middlewares/digestauth.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/content/reference/routing-configuration/http/middlewares/digestauth.md b/docs/content/reference/routing-configuration/http/middlewares/digestauth.md index 8e53543933..3789f2c7a2 100644 --- a/docs/content/reference/routing-configuration/http/middlewares/digestauth.md +++ b/docs/content/reference/routing-configuration/http/middlewares/digestauth.md @@ -67,8 +67,7 @@ spec: ### Passwords format -Passwords must be hashed using MD5, SHA1, or BCrypt. -Use `htpasswd` to generate the passwords. +Use `htdigest` to generate the passwords. ### users & usersFile From 86a8f87acd13b43d6e93c64defaccba6f0d08733 Mon Sep 17 00:00:00 2001 From: Romain Date: Fri, 6 Mar 2026 09:56:04 +0100 Subject: [PATCH 14/20] Prepare release v2.11.39 --- CHANGELOG.md | 7 +++++++ script/gcg/traefik-bugfix.toml | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d72b05925..bf97a50820 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [v2.11.39](https://github.com/traefik/traefik/tree/v2.11.39) (2026-03-06) +[All Commits](https://github.com/traefik/traefik/compare/v2.11.38...v2.11.39) + +**Bug fixes:** +- **[docker]** Bump Docker and OpenTelemetry dependencies ([#12761](https://github.com/traefik/traefik/pull/12761) by [mmatur](https://github.com/mmatur)) +- **[server]** Bump golang.org/x/net to v0.51.0 ([#12756](https://github.com/traefik/traefik/pull/12756) by [kevinpollet](https://github.com/kevinpollet)) + ## [v2.11.38](https://github.com/traefik/traefik/tree/v2.11.38) (2026-02-23) [All Commits](https://github.com/traefik/traefik/compare/v2.11.37...v2.11.38) diff --git a/script/gcg/traefik-bugfix.toml b/script/gcg/traefik-bugfix.toml index 09dcfba470..f1ba207c23 100644 --- a/script/gcg/traefik-bugfix.toml +++ b/script/gcg/traefik-bugfix.toml @@ -4,11 +4,11 @@ RepositoryName = "traefik" OutputType = "file" FileName = "traefik_changelog.md" -# example new bugfix v2.11.38 +# example new bugfix v2.11.39 CurrentRef = "v2.11" -PreviousRef = "v2.11.37" +PreviousRef = "v2.11.38" BaseBranch = "v2.11" -FutureCurrentRefName = "v2.11.38" +FutureCurrentRefName = "v2.11.39" ThresholdPreviousRef = 10000 ThresholdCurrentRef = 10000 From fc32e6dc0b1144627504c03795797726f963f1d1 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 6 Mar 2026 10:04:05 +0100 Subject: [PATCH 15/20] Fix priority display in dashboard and ACME bypass redirect --- .../install-configuration/entrypoints.md | 50 ++++++++++++++++- .../http/routing/rules-and-priority.md | 4 +- .../fixtures/simple_acme_bypass_redirect.toml | 38 +++++++++++++ integration/simple_test.go | 37 +++++++++++++ pkg/api/handler_http.go | 12 ++-- pkg/api/handler_tcp.go | 6 +- pkg/api/testdata/router-bar.json | 1 + .../router-baz-custom-tls-options.json | 1 + .../router-baz-default-tls-options.json | 1 + pkg/api/testdata/router-foo-slash-bar.json | 1 + .../routers-filtered-middlewareName.json | 2 + pkg/api/testdata/routers-filtered-search.json | 1 + .../routers-filtered-serviceName.json | 2 + pkg/api/testdata/routers-filtered-status.json | 1 + pkg/api/testdata/routers-many-lastpage.json | 5 ++ pkg/api/testdata/routers-page2.json | 1 + pkg/api/testdata/routers.json | 2 + pkg/api/testdata/tcprouter-bar.json | 1 + pkg/api/testdata/tcprouter-foo-slash-bar.json | 1 + .../tcprouters-filtered-middlewareName.json | 2 + .../testdata/tcprouters-filtered-search.json | 1 + .../tcprouters-filtered-serviceName.json | 2 + .../testdata/tcprouters-filtered-status.json | 1 + pkg/api/testdata/tcprouters-page2.json | 1 + pkg/api/testdata/tcprouters.json | 3 + .../redirection_with_acme_bypass.json | 31 +++++++++++ .../redirection_without_acme_bypass.json | 41 ++++++++++++++ pkg/provider/traefik/internal.go | 7 ++- pkg/provider/traefik/internal_test.go | 55 +++++++++++++++++++ .../src/components/resources/RouterPanel.tsx | 6 +- webui/src/hooks/use-resource-detail.tsx | 3 + webui/src/mocks/data/api-http_routers.json | 3 +- webui/src/pages/http/HttpRouters.tsx | 2 +- webui/src/pages/tcp/TcpRouters.tsx | 2 +- webui/src/pages/udp/UdpRouters.tsx | 2 +- 35 files changed, 311 insertions(+), 18 deletions(-) create mode 100644 integration/fixtures/simple_acme_bypass_redirect.toml create mode 100644 pkg/provider/traefik/fixtures/redirection_with_acme_bypass.json create mode 100644 pkg/provider/traefik/fixtures/redirection_without_acme_bypass.json diff --git a/docs/content/reference/install-configuration/entrypoints.md b/docs/content/reference/install-configuration/entrypoints.md index a00c8de45f..233b916cc1 100644 --- a/docs/content/reference/install-configuration/entrypoints.md +++ b/docs/content/reference/install-configuration/entrypoints.md @@ -87,12 +87,13 @@ additionalArguments: |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------|:---------| | `address` | Define the port, and optionally the hostname, on which to listen for incoming connections and packets.
It also defines the protocol to use (TCP or UDP).
If no protocol is specified, the default is TCP. The format is:`[host]:port[/tcp\|/udp] | - | Yes | | `asDefault` | Mark the `entryPoint` to be in the list of default `entryPoints`.
`entryPoints`in this list are used (by default) on HTTP and TCP routers that do not define their own `entryPoints` option.
More information [here](#asdefault). | false | No | +| `allowACMEByPass` | Enables handling of ACME TLS and HTTP challenges with custom routers instead of the internal ACME router. | false | No | | `forwardedHeaders.trustedIPs` | Set the IPs or CIDR from where Traefik trusts the forwarded headers information (`X-Forwarded-*`). | - | No | | `forwardedHeaders.insecure` | Set the insecure mode to always trust the forwarded headers information (`X-Forwarded-*`).
We recommend to use this option only for tests purposes, not in production. | false | No | | `http.redirections.`
`entryPoint.to`
| The target element to enable (permanent) redirecting of all incoming requests on an entry point to another one.
The target element can be an entry point name (ex: `websecure`), or a port (`:443`). | - | Yes | | `http.redirections.`
`entryPoint.scheme`
| The target scheme to use for (permanent) redirection of all incoming requests. | https | No | | `http.redirections.`
`entryPoint.permanent`
| Enable permanent redirecting of all incoming requests on an entry point to another one changing the scheme.
The target element, it can be an entry point name (ex: `websecure`), or a port (`:443`). | false | No | -| `http.redirections.`
`entryPoint.priority`
| Default priority applied to the routers attached to the `entryPoint`. | MaxInt32-1 (2147483646) | No | +| `http.redirections.`
`entryPoint.priority`
| Default priority applied to the routers attached to the `entryPoint`. | MaxInt-1 (`2147483646` on 32-bit, `9223372036854775806` on 64-bit) | No | | `http.encodedCharacters` | Defines which encoded characters are allowed in the request path. More information [here](#encoded-characters). | false | No | | `http.encodedCharacters.`
`allowEncodedSlash`
| Defines whether requests with encoded slash characters in the path are allowed. | true | No | | `http.encodedCharacters.`
`allowEncodedBackSlash`
| Defines whether requests with encoded back slash characters in the path are allowed. | true | No | @@ -144,6 +145,53 @@ The `asDefault` option has no effect on UDP entryPoints. When a UDP router does not define the entryPoints option, it is attached to all available UDP entryPoints. +### allowACMEByPass + +By default, Traefik creates an internal router with the highest possible priority (`MaxInt`) to handle +ACME HTTP and TLS challenges. This ensures that certificate challenges always succeed, +but it also prevents any user-defined router from intercepting challenge requests on the same entrypoint. + +When `allowACMEByPass` is set to `true` on an entrypoint: + +- The internal ACME HTTP challenge router is created **without** an explicit high priority, + allowing user-defined routers to handle challenge requests instead. +- The TLS-ALPN challenge passthrough is enabled on the entrypoint, + allowing user-defined TLS routers to handle TLS challenges. + +This is useful when you need custom handling of ACME challenges, +for example when using a dedicated service to solve HTTP-01 or TLS-ALPN-01 challenges. + +!!! note + + When no TLS challenge resolver is configured, `allowACMEByPass` is implicitly enabled + for TLS passthrough on all entrypoints. + +!!! note + + When `allowACMEByPass` is enabled and the entrypoint has an HTTP redirect configured + (via `http.redirections.entryPoint`), the redirect router automatically excludes + the ACME challenge path (`/.well-known/acme-challenge/`). + This allows user-defined ACME challenge routers to handle challenge requests + without being overridden by the redirect. + +```yaml tab="File (YAML)" +entryPoints: + web: + address: ":80" + allowACMEByPass: true +``` + +```toml tab="File (TOML)" +[entryPoints.web] + address = ":80" + allowACMEByPass = true +``` + +```bash tab="CLI" +--entryPoints.web.address=:80 +--entryPoints.web.allowACMEByPass=true +``` + ### http.middlewares - You can attach a list of [middlewares](../../middlewares/http/overview.md) diff --git a/docs/content/reference/routing-configuration/http/routing/rules-and-priority.md b/docs/content/reference/routing-configuration/http/routing/rules-and-priority.md index 1a8acf172a..0291b9efe8 100644 --- a/docs/content/reference/routing-configuration/http/routing/rules-and-priority.md +++ b/docs/content/reference/routing-configuration/http/routing/rules-and-priority.md @@ -229,8 +229,8 @@ Negative priority values are supported. Traefik reserves a range of priorities for its internal routers, the maximum user-defined router priority value is: -- `(MaxInt32 - 1000)` for 32-bit platforms, -- `(MaxInt64 - 1000)` for 64-bit platforms. +- `(MaxInt32 - 1000)` = `2147482647` for 32-bit platforms, +- `(MaxInt64 - 1000)` = `9223372036854774807` for 64-bit platforms. ### Example diff --git a/integration/fixtures/simple_acme_bypass_redirect.toml b/integration/fixtures/simple_acme_bypass_redirect.toml new file mode 100644 index 0000000000..a9c3d23f36 --- /dev/null +++ b/integration/fixtures/simple_acme_bypass_redirect.toml @@ -0,0 +1,38 @@ +[global] + checkNewVersion = false + sendAnonymousUsage = false + +[log] + level = "DEBUG" + noColor = true + +[entryPoints] + [entryPoints.web] + address = ":8888" + allowACMEByPass = true + [entryPoints.web.http.redirections.entryPoint] + to = ":8443" + scheme = "https" + + [entryPoints.websecure] + address = ":8443" + +[api] + insecure = true + +[providers.file] + filename = "{{ .SelfFilename }}" + +## dynamic configuration ## + +[http.routers] + [http.routers.acme-challenge] + entryPoints = ["web"] + rule = "PathPrefix(`/.well-known/acme-challenge/`)" + service = "acme-solver" + +[http.services] + [http.services.acme-solver] + [http.services.acme-solver.loadBalancer] + [[http.services.acme-solver.loadBalancer.servers]] + url = "{{ .AcmeSolverURL }}" diff --git a/integration/simple_test.go b/integration/simple_test.go index 816e06a592..f0169edbc2 100644 --- a/integration/simple_test.go +++ b/integration/simple_test.go @@ -2227,3 +2227,40 @@ func waitForWritePartial(t *testing.T, conn net.Conn) { t.Fatalf("timeout waiting for connection timeout") } } + +func (s *SimpleSuite) TestAllowACMEByPassRedirect() { + // Start a local server that simulates an ACME challenge solver. + acmeSolver := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + rw.WriteHeader(http.StatusOK) + _, _ = rw.Write([]byte("acme-challenge-token")) + })) + defer acmeSolver.Close() + + file := s.adaptFile("fixtures/simple_acme_bypass_redirect.toml", struct { + AcmeSolverURL string + }{ + AcmeSolverURL: acmeSolver.URL, + }) + + s.traefikCmd(withConfigFile(file)) + + // Wait for Traefik to be ready with the user-defined ACME challenge router. + err := try.GetRequest("http://127.0.0.1:8080/api/rawdata", 5*time.Second, try.BodyContains("acme-challenge@file")) + require.NoError(s.T(), err) + + noRedirectClient := &http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + } + + // ACME challenge path should NOT be redirected — it should reach the solver. + resp, err := noRedirectClient.Get("http://127.0.0.1:8888/.well-known/acme-challenge/test-token") + require.NoError(s.T(), err) + assert.Equal(s.T(), http.StatusOK, resp.StatusCode) + + // Normal path should be redirected to HTTPS. + resp, err = noRedirectClient.Get("http://127.0.0.1:8888/other-path") + require.NoError(s.T(), err) + assert.Equal(s.T(), http.StatusMovedPermanently, resp.StatusCode) +} diff --git a/pkg/api/handler_http.go b/pkg/api/handler_http.go index 24df129f1c..9cc71fd0ef 100644 --- a/pkg/api/handler_http.go +++ b/pkg/api/handler_http.go @@ -17,8 +17,9 @@ import ( type routerRepresentation struct { *runtime.RouterInfo - Name string `json:"name,omitempty"` - Provider string `json:"provider,omitempty"` + Name string `json:"name,omitempty"` + Provider string `json:"provider,omitempty"` + PriorityStr string `json:"priorityStr,omitempty"` } func newRouterRepresentation(name string, rt *runtime.RouterInfo) routerRepresentation { @@ -27,9 +28,10 @@ func newRouterRepresentation(name string, rt *runtime.RouterInfo) routerRepresen } return routerRepresentation{ - RouterInfo: rt, - Name: name, - Provider: getProviderName(name), + RouterInfo: rt, + Name: name, + Provider: getProviderName(name), + PriorityStr: strconv.FormatInt(int64(rt.Priority), 10), } } diff --git a/pkg/api/handler_tcp.go b/pkg/api/handler_tcp.go index 470b1ecb61..39656c0289 100644 --- a/pkg/api/handler_tcp.go +++ b/pkg/api/handler_tcp.go @@ -16,8 +16,9 @@ import ( type tcpRouterRepresentation struct { *runtime.TCPRouterInfo - Name string `json:"name,omitempty"` - Provider string `json:"provider,omitempty"` + Name string `json:"name,omitempty"` + Provider string `json:"provider,omitempty"` + PriorityStr string `json:"priorityStr,omitempty"` } func newTCPRouterRepresentation(name string, rt *runtime.TCPRouterInfo) tcpRouterRepresentation { @@ -25,6 +26,7 @@ func newTCPRouterRepresentation(name string, rt *runtime.TCPRouterInfo) tcpRoute TCPRouterInfo: rt, Name: name, Provider: getProviderName(name), + PriorityStr: strconv.FormatInt(int64(rt.Priority), 10), } } diff --git a/pkg/api/testdata/router-bar.json b/pkg/api/testdata/router-bar.json index 098ea0b1ad..36dd356aee 100644 --- a/pkg/api/testdata/router-bar.json +++ b/pkg/api/testdata/router-bar.json @@ -8,6 +8,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/router-baz-custom-tls-options.json b/pkg/api/testdata/router-baz-custom-tls-options.json index c95dc7949b..1c247092cd 100644 --- a/pkg/api/testdata/router-baz-custom-tls-options.json +++ b/pkg/api/testdata/router-baz-custom-tls-options.json @@ -8,6 +8,7 @@ ], "name": "baz@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.baz`)", "service": "foo-service@myprovider", "tls": { diff --git a/pkg/api/testdata/router-baz-default-tls-options.json b/pkg/api/testdata/router-baz-default-tls-options.json index 0541980470..4f04d810eb 100644 --- a/pkg/api/testdata/router-baz-default-tls-options.json +++ b/pkg/api/testdata/router-baz-default-tls-options.json @@ -8,6 +8,7 @@ ], "name": "baz@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.baz`)", "service": "foo-service@myprovider", "tls": { diff --git a/pkg/api/testdata/router-foo-slash-bar.json b/pkg/api/testdata/router-foo-slash-bar.json index f9e30c240b..3108c05a6d 100644 --- a/pkg/api/testdata/router-foo-slash-bar.json +++ b/pkg/api/testdata/router-foo-slash-bar.json @@ -8,6 +8,7 @@ ], "name": "foo / bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers-filtered-middlewareName.json b/pkg/api/testdata/routers-filtered-middlewareName.json index d227748c50..b679211b03 100644 --- a/pkg/api/testdata/routers-filtered-middlewareName.json +++ b/pkg/api/testdata/routers-filtered-middlewareName.json @@ -9,6 +9,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "disabled", @@ -26,6 +27,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`fii.bar.other`)", "service": "fii-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers-filtered-search.json b/pkg/api/testdata/routers-filtered-search.json index 4e251f5da3..692408320a 100644 --- a/pkg/api/testdata/routers-filtered-search.json +++ b/pkg/api/testdata/routers-filtered-search.json @@ -9,6 +9,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`fii.bar.other`)", "service": "fii-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers-filtered-serviceName.json b/pkg/api/testdata/routers-filtered-serviceName.json index 7d50bc03a4..5efced1fc6 100644 --- a/pkg/api/testdata/routers-filtered-serviceName.json +++ b/pkg/api/testdata/routers-filtered-serviceName.json @@ -5,6 +5,7 @@ ], "name": "foo@otherprovider", "provider": "otherprovider", + "priorityStr": "0", "rule": "Host(`fii.foo.other`)", "service": "fii-service", "status": "enabled", @@ -22,6 +23,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`fii.bar.other`)", "service": "fii-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers-filtered-status.json b/pkg/api/testdata/routers-filtered-status.json index 1c96e3802b..6bef270c0c 100644 --- a/pkg/api/testdata/routers-filtered-status.json +++ b/pkg/api/testdata/routers-filtered-status.json @@ -9,6 +9,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar.other`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers-many-lastpage.json b/pkg/api/testdata/routers-many-lastpage.json index df1ee7929f..e863feda94 100644 --- a/pkg/api/testdata/routers-many-lastpage.json +++ b/pkg/api/testdata/routers-many-lastpage.json @@ -5,6 +5,7 @@ ], "name": "bar14@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar14`)", "service": "foo-service@myprovider", "status": "enabled", @@ -18,6 +19,7 @@ ], "name": "bar15@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar15`)", "service": "foo-service@myprovider", "status": "enabled", @@ -31,6 +33,7 @@ ], "name": "bar16@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar16`)", "service": "foo-service@myprovider", "status": "enabled", @@ -44,6 +47,7 @@ ], "name": "bar17@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar17`)", "service": "foo-service@myprovider", "status": "enabled", @@ -57,6 +61,7 @@ ], "name": "bar18@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar18`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers-page2.json b/pkg/api/testdata/routers-page2.json index 579e2a04fb..8a7e63a52e 100644 --- a/pkg/api/testdata/routers-page2.json +++ b/pkg/api/testdata/routers-page2.json @@ -5,6 +5,7 @@ ], "name": "baz@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`toto.bar`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/routers.json b/pkg/api/testdata/routers.json index ed0d10e28b..1f81aa8cad 100644 --- a/pkg/api/testdata/routers.json +++ b/pkg/api/testdata/routers.json @@ -9,6 +9,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "enabled", @@ -26,6 +27,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar.other`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/tcprouter-bar.json b/pkg/api/testdata/tcprouter-bar.json index 70d06a3eaf..c89541c60c 100644 --- a/pkg/api/testdata/tcprouter-bar.json +++ b/pkg/api/testdata/tcprouter-bar.json @@ -4,6 +4,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/tcprouter-foo-slash-bar.json b/pkg/api/testdata/tcprouter-foo-slash-bar.json index 4656ea9f99..a05ae8c59d 100644 --- a/pkg/api/testdata/tcprouter-foo-slash-bar.json +++ b/pkg/api/testdata/tcprouter-foo-slash-bar.json @@ -4,6 +4,7 @@ ], "name": "foo / bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/tcprouters-filtered-middlewareName.json b/pkg/api/testdata/tcprouters-filtered-middlewareName.json index e3f5352ecb..27b1e325b7 100644 --- a/pkg/api/testdata/tcprouters-filtered-middlewareName.json +++ b/pkg/api/testdata/tcprouters-filtered-middlewareName.json @@ -9,6 +9,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service", "status": "warning", @@ -26,6 +27,7 @@ ], "name": "foo@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "bar-service@myprovider", "status": "disabled", diff --git a/pkg/api/testdata/tcprouters-filtered-search.json b/pkg/api/testdata/tcprouters-filtered-search.json index 4593f1b039..1263ec1041 100644 --- a/pkg/api/testdata/tcprouters-filtered-search.json +++ b/pkg/api/testdata/tcprouters-filtered-search.json @@ -5,6 +5,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "warning", diff --git a/pkg/api/testdata/tcprouters-filtered-serviceName.json b/pkg/api/testdata/tcprouters-filtered-serviceName.json index 6bf20f9db2..7c2efa92b7 100644 --- a/pkg/api/testdata/tcprouters-filtered-serviceName.json +++ b/pkg/api/testdata/tcprouters-filtered-serviceName.json @@ -5,6 +5,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service", "status": "warning", @@ -18,6 +19,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar.other`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/tcprouters-filtered-status.json b/pkg/api/testdata/tcprouters-filtered-status.json index 64d232ebc1..3f7417c0e8 100644 --- a/pkg/api/testdata/tcprouters-filtered-status.json +++ b/pkg/api/testdata/tcprouters-filtered-status.json @@ -5,6 +5,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar.other`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/tcprouters-page2.json b/pkg/api/testdata/tcprouters-page2.json index 579e2a04fb..8a7e63a52e 100644 --- a/pkg/api/testdata/tcprouters-page2.json +++ b/pkg/api/testdata/tcprouters-page2.json @@ -5,6 +5,7 @@ ], "name": "baz@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`toto.bar`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/api/testdata/tcprouters.json b/pkg/api/testdata/tcprouters.json index bf6bffc172..c710658f69 100644 --- a/pkg/api/testdata/tcprouters.json +++ b/pkg/api/testdata/tcprouters.json @@ -5,6 +5,7 @@ ], "name": "bar@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "warning", @@ -18,6 +19,7 @@ ], "name": "foo@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar`)", "service": "foo-service@myprovider", "status": "disabled", @@ -31,6 +33,7 @@ ], "name": "test@myprovider", "provider": "myprovider", + "priorityStr": "0", "rule": "Host(`foo.bar.other`)", "service": "foo-service@myprovider", "status": "enabled", diff --git a/pkg/provider/traefik/fixtures/redirection_with_acme_bypass.json b/pkg/provider/traefik/fixtures/redirection_with_acme_bypass.json new file mode 100644 index 0000000000..d50cefb386 --- /dev/null +++ b/pkg/provider/traefik/fixtures/redirection_with_acme_bypass.json @@ -0,0 +1,31 @@ +{ + "http": { + "routers": { + "web-to-websecure": { + "entryPoints": [ + "web" + ], + "middlewares": [ + "redirect-web-to-websecure" + ], + "service": "noop@internal", + "rule": "HostRegexp(`^.+$`) \u0026\u0026 !PathPrefix(`/.well-known/acme-challenge/`)", + "ruleSyntax": "default" + } + }, + "services": { + "noop": {} + }, + "middlewares": { + "redirect-web-to-websecure": { + "redirectScheme": { + "scheme": "https", + "port": "443", + "permanent": true + } + } + } + }, + "tcp": {}, + "tls": {} +} \ No newline at end of file diff --git a/pkg/provider/traefik/fixtures/redirection_without_acme_bypass.json b/pkg/provider/traefik/fixtures/redirection_without_acme_bypass.json new file mode 100644 index 0000000000..9774e2a229 --- /dev/null +++ b/pkg/provider/traefik/fixtures/redirection_without_acme_bypass.json @@ -0,0 +1,41 @@ +{ + "http": { + "routers": { + "acme-http": { + "entryPoints": [ + "web" + ], + "service": "acme-http@internal", + "rule": "PathPrefix(`/.well-known/acme-challenge/`)", + "ruleSyntax": "default", + "priority": 9223372036854775807 + }, + "web-to-websecure": { + "entryPoints": [ + "web" + ], + "middlewares": [ + "redirect-web-to-websecure" + ], + "service": "noop@internal", + "rule": "HostRegexp(`^.+$`)", + "ruleSyntax": "default" + } + }, + "services": { + "acme-http": {}, + "noop": {} + }, + "middlewares": { + "redirect-web-to-websecure": { + "redirectScheme": { + "scheme": "https", + "port": "443", + "permanent": true + } + } + } + }, + "tcp": {}, + "tls": {} +} \ No newline at end of file diff --git a/pkg/provider/traefik/internal.go b/pkg/provider/traefik/internal.go index 7c99f977e1..ddde13c3a1 100644 --- a/pkg/provider/traefik/internal.go +++ b/pkg/provider/traefik/internal.go @@ -161,11 +161,16 @@ func (i *Provider) redirection(ctx context.Context, cfg *dynamic.Configuration) continue } + rule := "HostRegexp(`^.+$`)" + if ep.AllowACMEByPass { + rule = "HostRegexp(`^.+$`) && !PathPrefix(`/.well-known/acme-challenge/`)" + } + rtName := provider.Normalize(name + "-to-" + def.EntryPoint.To) mdName := "redirect-" + rtName rt := &dynamic.Router{ - Rule: "HostRegexp(`^.+$`)", + Rule: rule, // "default" stands for the default rule syntax in Traefik v3, i.e. the v3 syntax. RuleSyntax: "default", EntryPoints: []string{name}, diff --git a/pkg/provider/traefik/internal_test.go b/pkg/provider/traefik/internal_test.go index e0697dd8d2..a118db9b07 100644 --- a/pkg/provider/traefik/internal_test.go +++ b/pkg/provider/traefik/internal_test.go @@ -12,6 +12,7 @@ import ( "github.com/traefik/traefik/v3/pkg/config/static" otypes "github.com/traefik/traefik/v3/pkg/observability/types" "github.com/traefik/traefik/v3/pkg/ping" + acmeprovider "github.com/traefik/traefik/v3/pkg/provider/acme" "github.com/traefik/traefik/v3/pkg/provider/rest" "github.com/traefik/traefik/v3/pkg/types" ) @@ -261,6 +262,60 @@ func Test_createConfiguration(t *testing.T) { }, }, }, + { + desc: "redirection_with_acme_bypass.json", + staticCfg: static.Configuration{ + EntryPoints: map[string]*static.EntryPoint{ + "web": { + Address: ":80", + AllowACMEByPass: true, + HTTP: static.HTTPConfig{ + Redirections: &static.Redirections{ + EntryPoint: &static.RedirectEntryPoint{ + To: "websecure", + Scheme: "https", + Permanent: true, + }, + }, + }, + }, + "websecure": { + Address: ":443", + }, + }, + }, + }, + { + desc: "redirection_without_acme_bypass.json", + staticCfg: static.Configuration{ + EntryPoints: map[string]*static.EntryPoint{ + "web": { + Address: ":80", + HTTP: static.HTTPConfig{ + Redirections: &static.Redirections{ + EntryPoint: &static.RedirectEntryPoint{ + To: "websecure", + Scheme: "https", + Permanent: true, + }, + }, + }, + }, + "websecure": { + Address: ":443", + }, + }, + CertificatesResolvers: map[string]static.CertificateResolver{ + "default": { + ACME: &acmeprovider.Configuration{ + HTTPChallenge: &acmeprovider.HTTPChallenge{ + EntryPoint: "web", + }, + }, + }, + }, + }, + }, } for _, test := range testCases { diff --git a/webui/src/components/resources/RouterPanel.tsx b/webui/src/components/resources/RouterPanel.tsx index c380df50e9..99c7fa29ed 100644 --- a/webui/src/components/resources/RouterPanel.tsx +++ b/webui/src/components/resources/RouterPanel.tsx @@ -27,10 +27,10 @@ const RouterPanel = ({ data }: Props) => ( {data.provider} )} - {data.priority && ( + {(data.priorityStr || data.priority) && ( - - {data.priority.toString()} + + {data.priorityStr ?? data.priority?.toString()} )} diff --git a/webui/src/hooks/use-resource-detail.tsx b/webui/src/hooks/use-resource-detail.tsx index df6e389416..fea6eb70b6 100644 --- a/webui/src/hooks/use-resource-detail.tsx +++ b/webui/src/hooks/use-resource-detail.tsx @@ -36,6 +36,7 @@ type Router = { status: 'enabled' | 'disabled' | 'warning' rule?: string priority?: number + priorityStr?: string provider: string tls?: { options: string @@ -141,6 +142,8 @@ export const useResourceDetail = (name: string, resource: string, protocol = 'ht status: routeDetail.status, provider: routeDetail.provider, rule: routeDetail.rule, + priority: routeDetail.priority, + priorityStr: routeDetail.priorityStr, tls: routeDetail.tls, error: routeDetail.error, middlewares: validMiddlewares, diff --git a/webui/src/mocks/data/api-http_routers.json b/webui/src/mocks/data/api-http_routers.json index 227aa7cc3b..bd57a2173a 100644 --- a/webui/src/mocks/data/api-http_routers.json +++ b/webui/src/mocks/data/api-http_routers.json @@ -108,7 +108,8 @@ "using": [ "web-redirect" ], - "priority": 9223372036854776000, + "priority": 9223372036854775806, + "priorityStr": "9223372036854775806", "provider": "docker" }, { diff --git a/webui/src/pages/http/HttpRouters.tsx b/webui/src/pages/http/HttpRouters.tsx index 7896ca38ae..ca891e11a4 100644 --- a/webui/src/pages/http/HttpRouters.tsx +++ b/webui/src/pages/http/HttpRouters.tsx @@ -59,7 +59,7 @@ export const makeRowRender = (protocol = 'http'): RenderRowType => { - + ) diff --git a/webui/src/pages/tcp/TcpRouters.tsx b/webui/src/pages/tcp/TcpRouters.tsx index 8a8f638acd..e9115ffd1f 100644 --- a/webui/src/pages/tcp/TcpRouters.tsx +++ b/webui/src/pages/tcp/TcpRouters.tsx @@ -55,7 +55,7 @@ export const makeRowRender = (): RenderRowType => { - + ) diff --git a/webui/src/pages/udp/UdpRouters.tsx b/webui/src/pages/udp/UdpRouters.tsx index b468630ce9..9494f84f7e 100644 --- a/webui/src/pages/udp/UdpRouters.tsx +++ b/webui/src/pages/udp/UdpRouters.tsx @@ -42,7 +42,7 @@ export const makeRowRender = (): RenderRowType => { - + ) From 8291b1d049e1041a0686707de9c72cc76a1d0e98 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 6 Mar 2026 14:58:04 +0100 Subject: [PATCH 16/20] Fix go-version for CI --- .go-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.go-version b/.go-version index f1968aa881..5e2b950027 100644 --- a/.go-version +++ b/.go-version @@ -1 +1 @@ -1.25.7 +1.25 From 9ab7fb860d3b3b38012fd3d61e2e5627cab4c695 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Fri, 6 Mar 2026 15:00:12 +0100 Subject: [PATCH 17/20] Bump github.com/valyala/fasthttp to v1.69.0 --- go.mod | 6 ++--- go.sum | 12 ++++----- .../compress/compression_handler_test.go | 27 +++++-------------- pkg/proxy/fast/proxy_websocket_test.go | 2 +- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index a008b39038..c540bd8ee6 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/BurntSushi/toml v1.6.0 github.com/Masterminds/sprig/v3 v3.2.3 github.com/abbot/go-http-auth v0.0.0-00010101000000-000000000000 // No tag on the repo. - github.com/andybalholm/brotli v1.1.1 + github.com/andybalholm/brotli v1.2.0 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/aws/aws-sdk-go-v2 v1.41.1 github.com/aws/aws-sdk-go-v2/config v1.32.8 @@ -38,7 +38,7 @@ require ( github.com/http-wasm/http-wasm-host-go v0.7.0 github.com/influxdata/influxdb-client-go/v2 v2.7.0 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab // No tag on the repo. - github.com/klauspost/compress v1.18.0 + github.com/klauspost/compress v1.18.2 github.com/kvtools/consul v1.0.2 github.com/kvtools/etcdv3 v1.0.3 github.com/kvtools/redis v1.2.0 @@ -73,7 +73,7 @@ require ( github.com/traefik/yaegi v0.16.1 github.com/unrolled/render v1.0.2 github.com/unrolled/secure v1.0.9 - github.com/valyala/fasthttp v1.58.0 + github.com/valyala/fasthttp v1.69.0 github.com/vulcand/oxy/v2 v2.0.3 github.com/vulcand/predicate v1.2.0 github.com/yuin/gopher-lua v1.1.1 diff --git a/go.sum b/go.sum index 4cb464fc47..05593b42bc 100644 --- a/go.sum +++ b/go.sum @@ -180,8 +180,8 @@ github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmP github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/aliyun/credentials-go v1.4.7 h1:T17dLqEtPUFvjDRRb5giVvLh6dFT8IcNFJJb7MeyCxw= github.com/aliyun/credentials-go v1.4.7/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -790,8 +790,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= @@ -1301,8 +1301,8 @@ github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.58.0 h1:GGB2dWxSbEprU9j0iMJHgdKYJVDyjrOwF9RE59PbRuE= -github.com/valyala/fasthttp v1.58.0/go.mod h1:SYXvHHaFp7QZHGKSHmoMipInhrI5StHrhDTYVEjK/Kw= +github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= +github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vinyldns/go-vinyldns v0.9.17 h1:hfPZfCaxcRBX6Gsgl42rLCeoal58/BH8kkvJShzjjdI= diff --git a/pkg/middlewares/compress/compression_handler_test.go b/pkg/middlewares/compress/compression_handler_test.go index 62d9e5787b..3dfb3ca3c9 100644 --- a/pkg/middlewares/compress/compression_handler_test.go +++ b/pkg/middlewares/compress/compression_handler_test.go @@ -374,25 +374,18 @@ func Test_FlushAfterWriteNil(t *testing.T) { desc string cfg Config algo string - readerBuilder func(io.Reader) (io.Reader, error) acceptEncoding string }{ { - desc: "brotli", - cfg: Config{MinSize: 1024, MiddlewareName: "Test"}, - algo: brotliName, - readerBuilder: func(reader io.Reader) (io.Reader, error) { - return brotli.NewReader(reader), nil - }, + desc: "brotli", + cfg: Config{MinSize: 1024, MiddlewareName: "Test"}, + algo: brotliName, acceptEncoding: "br", }, { - desc: "zstd", - cfg: Config{MinSize: 1024, MiddlewareName: "Test"}, - algo: zstdName, - readerBuilder: func(reader io.Reader) (io.Reader, error) { - return zstd.NewReader(reader) - }, + desc: "zstd", + cfg: Config{MinSize: 1024, MiddlewareName: "Test"}, + algo: zstdName, acceptEncoding: "zstd", }, } @@ -423,13 +416,7 @@ func Test_FlushAfterWriteNil(t *testing.T) { assert.Equal(t, http.StatusOK, res.StatusCode) assert.Empty(t, res.Header.Get(contentEncoding)) - - reader, err := test.readerBuilder(res.Body) - require.NoError(t, err) - - got, err := io.ReadAll(reader) - require.NoError(t, err) - assert.Empty(t, got) + assert.Equal(t, http.NoBody, res.Body) }) } } diff --git a/pkg/proxy/fast/proxy_websocket_test.go b/pkg/proxy/fast/proxy_websocket_test.go index 3137183224..323827de89 100644 --- a/pkg/proxy/fast/proxy_websocket_test.go +++ b/pkg/proxy/fast/proxy_websocket_test.go @@ -35,7 +35,7 @@ func TestWebSocketUpgradeCase(t *testing.T) { require.NoError(t, err) // Force answer with "Connection: upgrade" in lowercase. - _, err = c.Write([]byte("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: upgrade\r\nSec-WebSocket-Accept: " + computeAcceptKey(challengeKey) + "\r\n\n")) + _, err = c.Write([]byte("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: upgrade\r\nSec-WebSocket-Accept: " + computeAcceptKey(challengeKey) + "\r\n\r\n")) require.NoError(t, err) })) defer srv.Close() From bb7bb492267b2bdba53ae82b3c19a5758e5d4eda Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 6 Mar 2026 15:10:04 +0100 Subject: [PATCH 18/20] Prepare release v2.11.40 --- CHANGELOG.md | 9 +++++++-- script/gcg/traefik-bugfix.toml | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf97a50820..ff06e55992 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,15 @@ -## [v2.11.39](https://github.com/traefik/traefik/tree/v2.11.39) (2026-03-06) -[All Commits](https://github.com/traefik/traefik/compare/v2.11.38...v2.11.39) +## [v2.11.40](https://github.com/traefik/traefik/tree/v2.11.40) (2026-03-06) +[All Commits](https://github.com/traefik/traefik/compare/v2.11.38...v2.11.40) **Bug fixes:** - **[docker]** Bump Docker and OpenTelemetry dependencies ([#12761](https://github.com/traefik/traefik/pull/12761) by [mmatur](https://github.com/mmatur)) - **[server]** Bump golang.org/x/net to v0.51.0 ([#12756](https://github.com/traefik/traefik/pull/12756) by [kevinpollet](https://github.com/kevinpollet)) +## [v2.11.39](https://github.com/traefik/traefik/tree/v2.11.39) (2026-03-06) +[All Commits](https://github.com/traefik/traefik/compare/v2.11.38...v2.11.39) + +Release canceled. + ## [v2.11.38](https://github.com/traefik/traefik/tree/v2.11.38) (2026-02-23) [All Commits](https://github.com/traefik/traefik/compare/v2.11.37...v2.11.38) diff --git a/script/gcg/traefik-bugfix.toml b/script/gcg/traefik-bugfix.toml index f1ba207c23..8468dda025 100644 --- a/script/gcg/traefik-bugfix.toml +++ b/script/gcg/traefik-bugfix.toml @@ -4,11 +4,11 @@ RepositoryName = "traefik" OutputType = "file" FileName = "traefik_changelog.md" -# example new bugfix v2.11.39 +# example new bugfix v2.11.40 CurrentRef = "v2.11" -PreviousRef = "v2.11.38" +PreviousRef = "v2.11.39" BaseBranch = "v2.11" -FutureCurrentRefName = "v2.11.39" +FutureCurrentRefName = "v2.11.40" ThresholdPreviousRef = 10000 ThresholdCurrentRef = 10000 From c7d55074625f4a49f9fb3b0b0397c28853f9f176 Mon Sep 17 00:00:00 2001 From: Jesper Noordsij <45041769+jnoordsij@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:22:06 +0100 Subject: [PATCH 19/20] Use modern `WaitGroup.Go` function in additional places --- pkg/healthcheck/healthcheck_test.go | 1 - pkg/middlewares/auth/basic_auth_test.go | 6 ++---- pkg/server/server_entrypoint_udp.go | 2 -- .../service/loadbalancer/leasttime/leasttime_test.go | 8 +++----- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/pkg/healthcheck/healthcheck_test.go b/pkg/healthcheck/healthcheck_test.go index 9f39eaaaf4..9b70911c40 100644 --- a/pkg/healthcheck/healthcheck_test.go +++ b/pkg/healthcheck/healthcheck_test.go @@ -515,7 +515,6 @@ func TestDifferentIntervals(t *testing.T) { wg := sync.WaitGroup{} wg.Go(func() { hc.Launch(ctx) - wg.Done() }) select { diff --git a/pkg/middlewares/auth/basic_auth_test.go b/pkg/middlewares/auth/basic_auth_test.go index b81a22c038..8741ec8abd 100644 --- a/pkg/middlewares/auth/basic_auth_test.go +++ b/pkg/middlewares/auth/basic_auth_test.go @@ -192,11 +192,9 @@ func TestBasicAuthConcurrentHashOnce(t *testing.T) { defer ts.Close() var wg sync.WaitGroup - wg.Add(2) for range 2 { - go func() { - defer wg.Done() + wg.Go(func() { req := testhelpers.MustNewRequest(http.MethodGet, ts.URL, nil) req.SetBasicAuth("test", "test") @@ -205,7 +203,7 @@ func TestBasicAuthConcurrentHashOnce(t *testing.T) { defer res.Body.Close() assert.Equal(t, http.StatusOK, res.StatusCode, "they should be equal") - }() + }) } wg.Wait() diff --git a/pkg/server/server_entrypoint_udp.go b/pkg/server/server_entrypoint_udp.go index 323d5ac2c8..45b2ce34a1 100644 --- a/pkg/server/server_entrypoint_udp.go +++ b/pkg/server/server_entrypoint_udp.go @@ -51,8 +51,6 @@ func (eps UDPEntryPoints) Stop() { for epn, ep := range eps { wg.Go(func() { - defer wg.Done() - logger := log.With().Str(logs.EntryPointName, epn).Logger() ep.Shutdown(logger.WithContext(context.Background())) diff --git a/pkg/server/service/loadbalancer/leasttime/leasttime_test.go b/pkg/server/service/loadbalancer/leasttime/leasttime_test.go index ede621426a..5190ed79b2 100644 --- a/pkg/server/service/loadbalancer/leasttime/leasttime_test.go +++ b/pkg/server/service/loadbalancer/leasttime/leasttime_test.go @@ -560,13 +560,11 @@ func TestConcurrentResponseTimeUpdates(t *testing.T) { updatesPerGoroutine := 20 for i := range numGoroutines { - wg.Add(1) - go func(id int) { - defer wg.Done() + wg.Go(func() { for range updatesPerGoroutine { - handler.updateResponseTime(time.Duration(id+1) * time.Millisecond) + handler.updateResponseTime(time.Duration(i+1) * time.Millisecond) } - }(i) + }) } wg.Wait() From 043583490b0a92a97777713048f8bec1b3aff61c Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 6 Mar 2026 15:56:05 +0100 Subject: [PATCH 20/20] Prepare release v3.6.10 --- CHANGELOG.md | 20 ++++++++++++++++++++ script/gcg/traefik-bugfix.toml | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d08cd17a3..5c59b6a802 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +## [v3.6.10](https://github.com/traefik/traefik/tree/v3.6.10) (2026-03-06) +[All Commits](https://github.com/traefik/traefik/compare/v3.6.9...v3.6.10) + + **Bug fixes:** +- **[docker]** Bump Docker and OpenTelemetry dependencies ([#12761](https://github.com/traefik/traefik/pull/12761) by [mmatur](https://github.com/mmatur)) +- **[fastproxy]** Bump github.com/valyala/fasthttp to v1.69.0 ([#12763](https://github.com/traefik/traefik/pull/12763) by [kevinpollet](https://github.com/kevinpollet)) +- **[healthcheck, grpc]** Remove path parsing with grpc healthcheck ([#12760](https://github.com/traefik/traefik/pull/12760) by [rtribotte](https://github.com/rtribotte)) +- **[k8s/gatewayapi]** Fix Gateway API router's rules ([#12753](https://github.com/traefik/traefik/pull/12753) by [rtribotte](https://github.com/rtribotte)) +- **[middleware]** Fix HasSecureHeadersDefined returning false when stsSeconds is 0 ([#12684](https://github.com/traefik/traefik/pull/12684) by [veeceey](https://github.com/veeceey)) +- **[otel]** Bump go.opentelemetry.io/otel dependencies ([#12754](https://github.com/traefik/traefik/pull/12754) by [rtribotte](https://github.com/rtribotte)) +- **[server]** Bump golang.org/x/net to v0.51.0 ([#12756](https://github.com/traefik/traefik/pull/12756) by [kevinpollet](https://github.com/kevinpollet)) +- **[webui]** Fix priority display in dashboard and ACME bypass redirect ([#12740](https://github.com/traefik/traefik/pull/12740) by [mmatur](https://github.com/mmatur)) +- **[webui]** Fix basePath validation for dashboard template ([#12729](https://github.com/traefik/traefik/pull/12729) by [gndz07](https://github.com/gndz07)) + +**Documentation:** +- **[middleware]** Correct documentation for Digest auth ([#12651](https://github.com/traefik/traefik/pull/12651) by [Zash](https://github.com/Zash)) +- Add missing `.http` to TOML table names ([#12713](https://github.com/traefik/traefik/pull/12713) by [Darsstar](https://github.com/Darsstar)) +- Fix incorrect TOML example in entrypoints docs ([#12711](https://github.com/traefik/traefik/pull/12711) by [mfmfuyu](https://github.com/mfmfuyu)) +- Fix API basepath option documentation ([#12744](https://github.com/traefik/traefik/pull/12744) by [nmengin](https://github.com/nmengin)) + ## [v2.11.40](https://github.com/traefik/traefik/tree/v2.11.40) (2026-03-06) [All Commits](https://github.com/traefik/traefik/compare/v2.11.38...v2.11.40) diff --git a/script/gcg/traefik-bugfix.toml b/script/gcg/traefik-bugfix.toml index ad0b089635..5d696a1e36 100644 --- a/script/gcg/traefik-bugfix.toml +++ b/script/gcg/traefik-bugfix.toml @@ -4,11 +4,11 @@ RepositoryName = "traefik" OutputType = "file" FileName = "traefik_changelog.md" -# example new bugfix v3.6.9 +# example new bugfix v3.6.10 CurrentRef = "v3.6" -PreviousRef = "v3.6.8" +PreviousRef = "v3.6.10" BaseBranch = "v3.6" -FutureCurrentRefName = "v3.6.9" +FutureCurrentRefName = "v3.6.10" ThresholdPreviousRef = 10000 ThresholdCurrentRef = 10000