Merge current v2.11 into v3.0

This commit is contained in:
mmatur 2024-03-12 10:38:29 +01:00
commit 05be441027
No known key found for this signature in database
GPG key ID: 2FFE42FC256CFF8E
156 changed files with 5826 additions and 8436 deletions

View file

@ -7,7 +7,7 @@ on:
env: env:
GO_VERSION: '1.22' GO_VERSION: '1.22'
GOLANGCI_LINT_VERSION: v1.56.0 GOLANGCI_LINT_VERSION: v1.56.2
MISSSPELL_VERSION: v0.4.1 MISSSPELL_VERSION: v0.4.1
jobs: jobs:

View file

@ -217,7 +217,7 @@ issues:
exclude: exclude:
- 'Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked' - 'Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked'
- "should have a package comment, unless it's in another file for this package" - "should have a package comment, unless it's in another file for this package"
- 'fmt.Sprintf can be replaced with string addition' - 'fmt.Sprintf can be replaced with string'
exclude-rules: exclude-rules:
- path: '(.+)_test.go' - path: '(.+)_test.go'
linters: linters:

View file

@ -46,7 +46,7 @@ builds:
goarch: arm goarch: arm
changelog: changelog:
skip: true disable: true
archives: archives:
- id: traefik - id: traefik

View file

@ -25,7 +25,7 @@ global_job_config:
- export "PATH=${GOPATH}/bin:${PATH}" - export "PATH=${GOPATH}/bin:${PATH}"
- mkdir -vp "${SEMAPHORE_GIT_DIR}" "${GOPATH}/bin" - mkdir -vp "${SEMAPHORE_GIT_DIR}" "${GOPATH}/bin"
- export GOPROXY=https://proxy.golang.org,direct - export GOPROXY=https://proxy.golang.org,direct
- curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.56.0 - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.56.2
- curl -sSfL https://gist.githubusercontent.com/traefiker/6d7ac019c11d011e4f131bb2cca8900e/raw/goreleaser.sh | bash -s -- -b "${GOPATH}/bin" - curl -sSfL https://gist.githubusercontent.com/traefiker/6d7ac019c11d011e4f131bb2cca8900e/raw/goreleaser.sh | bash -s -- -b "${GOPATH}/bin"
- checkout - checkout
- cache restore traefik-$(checksum go.sum) - cache restore traefik-$(checksum go.sum)

View file

@ -9,7 +9,7 @@ GIT_BRANCH := $(subst heads/,,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/nul
REPONAME := $(shell echo $(REPO) | tr '[:upper:]' '[:lower:]') REPONAME := $(shell echo $(REPO) | tr '[:upper:]' '[:lower:]')
BIN_NAME := traefik BIN_NAME := traefik
CODENAME := cheddar CODENAME ?= cheddar
DATE := $(shell date -u '+%Y-%m-%d_%I:%M:%S%p') DATE := $(shell date -u '+%Y-%m-%d_%I:%M:%S%p')

View file

@ -160,7 +160,7 @@ func (c Centrifuge) writeStruct(name string, obj *types.Struct, rootPkg string,
b := strings.Builder{} b := strings.Builder{}
b.WriteString(fmt.Sprintf("type %s struct {\n", name)) b.WriteString(fmt.Sprintf("type %s struct {\n", name))
for i := 0; i < obj.NumFields(); i++ { for i := range obj.NumFields() {
field := obj.Field(i) field := obj.Field(i)
if !field.Exported() { if !field.Exported() {

View file

@ -6,7 +6,8 @@ Below is a non-exhaustive list of versions and their maintenance status:
| Version | Release Date | Active Support | Security Support | | Version | Release Date | Active Support | Security Support |
|---------|--------------|--------------------|------------------| |---------|--------------|--------------------|------------------|
| 2.10 | Apr 24, 2023 | Yes | Yes | | 2.11 | Feb 12, 2024 | Yes | Yes |
| 2.10 | Apr 24, 2023 | Ended Feb 12, 2024 | No |
| 2.9 | Oct 03, 2022 | Ended Apr 24, 2023 | No | | 2.9 | Oct 03, 2022 | Ended Apr 24, 2023 | No |
| 2.8 | Jun 29, 2022 | Ended Oct 03, 2022 | No | | 2.8 | Jun 29, 2022 | Ended Oct 03, 2022 | No |
| 2.7 | May 24, 2022 | Ended Jun 29, 2022 | No | | 2.7 | May 24, 2022 | Ended Jun 29, 2022 | No |

View file

@ -294,6 +294,12 @@ Use the `DNS-01` challenge to generate and renew ACME certificates by provisioni
LEGO_DISABLE_CNAME_SUPPORT=true LEGO_DISABLE_CNAME_SUPPORT=true
``` ```
!!! warning "Multiple DNS Challenge provider"
Multiple DNS challenge provider are not supported with Traefik, but you can use `CNAME` to handle that.
For example, if you have `example.org` (account foo) and `example.com` (account bar) you can create a CNAME on `example.org` called `_acme-challenge.example.org` pointing to `challenge.example.com`.
This way, you can obtain certificates for `example.com` with the `foo` account.
!!! important !!! important
A `provider` is mandatory. A `provider` is mandatory.
@ -331,6 +337,7 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [CloudXNS](https://www.cloudxns.net) | `cloudxns` | `CLOUDXNS_API_KEY`, `CLOUDXNS_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudxns) | | [CloudXNS](https://www.cloudxns.net) | `cloudxns` | `CLOUDXNS_API_KEY`, `CLOUDXNS_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudxns) |
| [ConoHa](https://www.conoha.jp) | `conoha` | `CONOHA_TENANT_ID`, `CONOHA_API_USERNAME`, `CONOHA_API_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/conoha) | | [ConoHa](https://www.conoha.jp) | `conoha` | `CONOHA_TENANT_ID`, `CONOHA_API_USERNAME`, `CONOHA_API_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/conoha) |
| [Constellix](https://constellix.com) | `constellix` | `CONSTELLIX_API_KEY`, `CONSTELLIX_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/constellix) | | [Constellix](https://constellix.com) | `constellix` | `CONSTELLIX_API_KEY`, `CONSTELLIX_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/constellix) |
| [CPanel and WHM](https://cpanel.net/) | `cpanel` | `CPANEL_MODE`, `CPANEL_USERNAME`, `CPANEL_TOKEN`, `CPANEL_BASE_URL` | [Additional configuration](https://go-acme.github.io/lego/dns/cpanel) |
| [Derak Cloud](https://derak.cloud/) | `derak` | `DERAK_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/derak) | | [Derak Cloud](https://derak.cloud/) | `derak` | `DERAK_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/derak) |
| [deSEC](https://desec.io) | `desec` | `DESEC_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/desec) | | [deSEC](https://desec.io) | `desec` | `DESEC_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/desec) |
| [DigitalOcean](https://www.digitalocean.com) | `digitalocean` | `DO_AUTH_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/digitalocean) | | [DigitalOcean](https://www.digitalocean.com) | `digitalocean` | `DO_AUTH_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/digitalocean) |
@ -352,7 +359,7 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [Fast DNS](https://www.akamai.com/) | `fastdns` | `AKAMAI_CLIENT_TOKEN`, `AKAMAI_CLIENT_SECRET`, `AKAMAI_ACCESS_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/edgedns) | | [Fast DNS](https://www.akamai.com/) | `fastdns` | `AKAMAI_CLIENT_TOKEN`, `AKAMAI_CLIENT_SECRET`, `AKAMAI_ACCESS_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/edgedns) |
| [Freemyip.com](https://freemyip.com) | `freemyip` | `FREEMYIP_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/freemyip) | | [Freemyip.com](https://freemyip.com) | `freemyip` | `FREEMYIP_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/freemyip) |
| [G-Core](https://gcore.com/dns/) | `gcore` | `GCORE_PERMANENT_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/gcore) | | [G-Core](https://gcore.com/dns/) | `gcore` | `GCORE_PERMANENT_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/gcore) |
| [Gandi v5](https://doc.livedns.gandi.net) | `gandiv5` | `GANDIV5_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/gandiv5) | | [Gandi v5](https://doc.livedns.gandi.net) | `gandiv5` | `GANDIV5_PERSONAL_ACCESS_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/gandiv5) |
| [Gandi](https://www.gandi.net) | `gandi` | `GANDI_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/gandi) | | [Gandi](https://www.gandi.net) | `gandi` | `GANDI_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/gandi) |
| [Glesys](https://glesys.com/) | `glesys` | `GLESYS_API_USER`, `GLESYS_API_KEY`, `GLESYS_DOMAIN` | [Additional configuration](https://go-acme.github.io/lego/dns/glesys) | | [Glesys](https://glesys.com/) | `glesys` | `GLESYS_API_USER`, `GLESYS_API_KEY`, `GLESYS_DOMAIN` | [Additional configuration](https://go-acme.github.io/lego/dns/glesys) |
| [GoDaddy](https://www.godaddy.com) | `godaddy` | `GODADDY_API_KEY`, `GODADDY_API_SECRET` | [Additional configuration](https://go-acme.github.io/lego/dns/godaddy) | | [GoDaddy](https://www.godaddy.com) | `godaddy` | `GODADDY_API_KEY`, `GODADDY_API_SECRET` | [Additional configuration](https://go-acme.github.io/lego/dns/godaddy) |
@ -381,6 +388,7 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [Liquid Web](https://www.liquidweb.com/) | `liquidweb` | `LIQUID_WEB_PASSWORD`, `LIQUID_WEB_USERNAME`, `LIQUID_WEB_ZONE` | [Additional configuration](https://go-acme.github.io/lego/dns/liquidweb) | | [Liquid Web](https://www.liquidweb.com/) | `liquidweb` | `LIQUID_WEB_PASSWORD`, `LIQUID_WEB_USERNAME`, `LIQUID_WEB_ZONE` | [Additional configuration](https://go-acme.github.io/lego/dns/liquidweb) |
| [Loopia](https://loopia.com/) | `loopia` | `LOOPIA_API_PASSWORD`, `LOOPIA_API_USER` | [Additional configuration](https://go-acme.github.io/lego/dns/loopia) | | [Loopia](https://loopia.com/) | `loopia` | `LOOPIA_API_PASSWORD`, `LOOPIA_API_USER` | [Additional configuration](https://go-acme.github.io/lego/dns/loopia) |
| [LuaDNS](https://luadns.com) | `luadns` | `LUADNS_API_USERNAME`, `LUADNS_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/luadns) | | [LuaDNS](https://luadns.com) | `luadns` | `LUADNS_API_USERNAME`, `LUADNS_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/luadns) |
| [Mail-in-a-Box](https://mailinabox.email) | `mailinabox` | `MAILINABOX_EMAIL`, `MAILINABOX_PASSWORD`, `MAILINABOX_BASE_URL` | [Additional configuration](https://go-acme.github.io/lego/dns/mailinabox) |
| [Metaname](https://metaname.net) | `metaname` | `METANAME_ACCOUNT_REFERENCE`, `METANAME_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/metaname) | | [Metaname](https://metaname.net) | `metaname` | `METANAME_ACCOUNT_REFERENCE`, `METANAME_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/metaname) |
| [MyDNS.jp](https://www.mydns.jp/) | `mydnsjp` | `MYDNSJP_MASTER_ID`, `MYDNSJP_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/mydnsjp) | | [MyDNS.jp](https://www.mydns.jp/) | `mydnsjp` | `MYDNSJP_MASTER_ID`, `MYDNSJP_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/mydnsjp) |
| [Mythic Beasts](https://www.mythic-beasts.com) | `mythicbeasts` | `MYTHICBEASTS_USER_NAME`, `MYTHICBEASTS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/mythicbeasts) | | [Mythic Beasts](https://www.mythic-beasts.com) | `mythicbeasts` | `MYTHICBEASTS_USER_NAME`, `MYTHICBEASTS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/mythicbeasts) |
@ -412,6 +420,7 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [Scaleway](https://www.scaleway.com) | `scaleway` | `SCALEWAY_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/scaleway) | | [Scaleway](https://www.scaleway.com) | `scaleway` | `SCALEWAY_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/scaleway) |
| [Selectel](https://selectel.ru/en/) | `selectel` | `SELECTEL_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/selectel) | | [Selectel](https://selectel.ru/en/) | `selectel` | `SELECTEL_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/selectel) |
| [Servercow](https://servercow.de) | `servercow` | `SERVERCOW_USERNAME`, `SERVERCOW_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/servercow) | | [Servercow](https://servercow.de) | `servercow` | `SERVERCOW_USERNAME`, `SERVERCOW_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/servercow) |
| [Shellrent](https://www.shellrent.com) | `shellrent` | `SHELLRENT_USERNAME`, `SHELLRENT_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/shellrent) |
| [Simply.com](https://www.simply.com/en/domains/) | `simply` | `SIMPLY_ACCOUNT_NAME`, `SIMPLY_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/simply) | | [Simply.com](https://www.simply.com/en/domains/) | `simply` | `SIMPLY_ACCOUNT_NAME`, `SIMPLY_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/simply) |
| [Sonic](https://www.sonic.com/) | `sonic` | `SONIC_USER_ID`, `SONIC_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/sonic) | | [Sonic](https://www.sonic.com/) | `sonic` | `SONIC_USER_ID`, `SONIC_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/sonic) |
| [Stackpath](https://www.stackpath.com/) | `stackpath` | `STACKPATH_CLIENT_ID`, `STACKPATH_CLIENT_SECRET`, `STACKPATH_STACK_ID` | [Additional configuration](https://go-acme.github.io/lego/dns/stackpath) | | [Stackpath](https://www.stackpath.com/) | `stackpath` | `STACKPATH_CLIENT_ID`, `STACKPATH_CLIENT_SECRET`, `STACKPATH_STACK_ID` | [Additional configuration](https://go-acme.github.io/lego/dns/stackpath) |

View file

@ -235,4 +235,4 @@ traefik_entrypoint_requests_total{code="200",entrypoint="web",method="GET",proto
// For incoming requests, the Host header is promoted to the // For incoming requests, the Host header is promoted to the
// Request.Host field and removed from the Header map. // Request.Host field and removed from the Header map.
As a workaround, to obtain the Host of a request as a label, one should use instead the `X-Forwarded-For` header. As a workaround, to obtain the Host of a request as a label, one should use instead the `X-Forwarded-Host` header.

View file

@ -69,7 +69,7 @@ metrics:
_Optional, Default=false_ _Optional, Default=false_
Enable metrics on entry points. Enable metrics on routers.
```yaml tab="File (YAML)" ```yaml tab="File (YAML)"
metrics: metrics:

View file

@ -192,9 +192,9 @@ See the [Docker API Access](#docker-api-access) section for more information.
??? example "Using SSH" ??? example "Using SSH"
Using Docker 18.09+ you can connect Traefik to daemon using SSH Using Docker 18.09+ you can connect Traefik to daemon using SSH.
We specify the SSH host and user in Traefik's configuration file. We specify the SSH host and user in Traefik's configuration file.
Note that is server requires public keys for authentication you must have those accessible for user who runs Traefik. Note that if the server requires public keys for authentication, you must have them accessible for the user running Traefik.
```yaml tab="File (YAML)" ```yaml tab="File (YAML)"
providers: providers:

View file

@ -225,6 +225,12 @@
- "traefik.tcp.services.tcpservice01.loadbalancer.terminationdelay=42" - "traefik.tcp.services.tcpservice01.loadbalancer.terminationdelay=42"
- "traefik.tcp.services.tcpservice01.loadbalancer.server.port=foobar" - "traefik.tcp.services.tcpservice01.loadbalancer.server.port=foobar"
- "traefik.tcp.services.tcpservice01.loadbalancer.server.tls=true" - "traefik.tcp.services.tcpservice01.loadbalancer.server.tls=true"
- "traefik.tls.stores.store0.defaultgeneratedcert.domain.main=foobar"
- "traefik.tls.stores.store0.defaultgeneratedcert.domain.sans=foobar, foobar"
- "traefik.tls.stores.store0.defaultgeneratedcert.resolver=foobar"
- "traefik.tls.stores.store1.defaultgeneratedcert.domain.main=foobar"
- "traefik.tls.stores.store1.defaultgeneratedcert.domain.sans=foobar, foobar"
- "traefik.tls.stores.store1.defaultgeneratedcert.resolver=foobar"
- "traefik.udp.routers.udprouter0.entrypoints=foobar, foobar" - "traefik.udp.routers.udprouter0.entrypoints=foobar, foobar"
- "traefik.udp.routers.udprouter0.service=foobar" - "traefik.udp.routers.udprouter0.service=foobar"
- "traefik.udp.routers.udprouter1.entrypoints=foobar, foobar" - "traefik.udp.routers.udprouter1.entrypoints=foobar, foobar"

View file

@ -139,7 +139,7 @@ Default middlewares for the routers linked to the entry point.
Applies a permanent redirection. (Default: ```true```) Applies a permanent redirection. (Default: ```true```)
`--entrypoints.<name>.http.redirections.entrypoint.priority`: `--entrypoints.<name>.http.redirections.entrypoint.priority`:
Priority of the generated router. (Default: ```2147483646```) Priority of the generated router. (Default: ```9223372036854775806```)
`--entrypoints.<name>.http.redirections.entrypoint.scheme`: `--entrypoints.<name>.http.redirections.entrypoint.scheme`:
Scheme used for the redirection. (Default: ```https```) Scheme used for the redirection. (Default: ```https```)

View file

@ -148,7 +148,7 @@ Default middlewares for the routers linked to the entry point.
Applies a permanent redirection. (Default: ```true```) Applies a permanent redirection. (Default: ```true```)
`TRAEFIK_ENTRYPOINTS_<NAME>_HTTP_REDIRECTIONS_ENTRYPOINT_PRIORITY`: `TRAEFIK_ENTRYPOINTS_<NAME>_HTTP_REDIRECTIONS_ENTRYPOINT_PRIORITY`:
Priority of the generated router. (Default: ```2147483646```) Priority of the generated router. (Default: ```9223372036854775806```)
`TRAEFIK_ENTRYPOINTS_<NAME>_HTTP_REDIRECTIONS_ENTRYPOINT_SCHEME`: `TRAEFIK_ENTRYPOINTS_<NAME>_HTTP_REDIRECTIONS_ENTRYPOINT_SCHEME`:
Scheme used for the redirection. (Default: ```https```) Scheme used for the redirection. (Default: ```https```)

View file

@ -702,29 +702,29 @@ _Optional, Default=0_
The maximum number of requests Traefik can handle before sending a `Connection: Close` header to the client (for HTTP2, Traefik sends a GOAWAY). Zero means no limit. The maximum number of requests Traefik can handle before sending a `Connection: Close` header to the client (for HTTP2, Traefik sends a GOAWAY). Zero means no limit.
```yaml tab="File (YAML)" ```yaml tab="File (YAML)"
## Static configuration ## Static configuration
entryPoints: entryPoints:
name: name:
address: ":8888" address: ":8888"
transport: transport:
keepAliveMaxRequests: 42 keepAliveMaxRequests: 42
``` ```
```toml tab="File (TOML)" ```toml tab="File (TOML)"
## Static configuration ## Static configuration
[entryPoints] [entryPoints]
[entryPoints.name] [entryPoints.name]
address = ":8888" address = ":8888"
[entryPoints.name.transport] [entryPoints.name.transport]
keepAliveMaxRequests = 42 keepAliveMaxRequests = 42
``` ```
```bash tab="CLI" ```bash tab="CLI"
## Static configuration ## Static configuration
--entryPoints.name.address=:8888 --entryPoints.name.address=:8888
--entryPoints.name.transport.keepAliveMaxRequests=42 --entryPoints.name.transport.keepAliveMaxRequests=42
``` ```
#### `keepAliveMaxTime` #### `keepAliveMaxTime`
@ -732,29 +732,29 @@ _Optional, Default=0s_
The maximum duration Traefik can handle requests before sending a `Connection: Close` header to the client (for HTTP2, Traefik sends a GOAWAY). Zero means no limit. The maximum duration Traefik can handle requests before sending a `Connection: Close` header to the client (for HTTP2, Traefik sends a GOAWAY). Zero means no limit.
```yaml tab="File (YAML)" ```yaml tab="File (YAML)"
## Static configuration ## Static configuration
entryPoints: entryPoints:
name: name:
address: ":8888" address: ":8888"
transport: transport:
keepAliveMaxTime: 42s keepAliveMaxTime: 42s
``` ```
```toml tab="File (TOML)" ```toml tab="File (TOML)"
## Static configuration ## Static configuration
[entryPoints] [entryPoints]
[entryPoints.name] [entryPoints.name]
address = ":8888" address = ":8888"
[entryPoints.name.transport] [entryPoints.name.transport]
keepAliveMaxTime = 42s keepAliveMaxTime = 42s
``` ```
```bash tab="CLI" ```bash tab="CLI"
## Static configuration ## Static configuration
--entryPoints.name.address=:8888 --entryPoints.name.address=:8888
--entryPoints.name.transport.keepAliveMaxTime=42s --entryPoints.name.transport.keepAliveMaxTime=42s
``` ```
### ProxyProtocol ### ProxyProtocol
@ -972,7 +972,7 @@ This section is a convenience to enable (permanent) redirecting of all incoming
??? info "`entryPoint.priority`" ??? info "`entryPoint.priority`"
_Optional, Default=MaxInt32-1 (2147483646)_ _Optional, Default=MaxInt-1_
Priority of the generated router. Priority of the generated router.

View file

@ -784,7 +784,7 @@ spec:
#### `peerCertURI` #### `peerCertURI`
_Optional, Default=false_ _Optional, Default=""_
`peerCertURI` defines the URI used to match against SAN URIs during the server's certificate verification. `peerCertURI` defines the URI used to match against SAN URIs during the server's certificate verification.

14
go.mod
View file

@ -17,7 +17,7 @@ require (
github.com/docker/go-connections v0.4.0 github.com/docker/go-connections v0.4.0
github.com/fatih/structs v1.1.0 github.com/fatih/structs v1.1.0
github.com/fsnotify/fsnotify v1.7.0 github.com/fsnotify/fsnotify v1.7.0
github.com/go-acme/lego/v4 v4.15.0 github.com/go-acme/lego/v4 v4.16.1
github.com/go-kit/kit v0.10.1-0.20200915143503-439c4d2ed3ea github.com/go-kit/kit v0.10.1-0.20200915143503-439c4d2ed3ea
github.com/golang/protobuf v1.5.3 github.com/golang/protobuf v1.5.3
github.com/google/go-github/v28 v28.1.1 github.com/google/go-github/v28 v28.1.1
@ -172,7 +172,7 @@ require (
github.com/ghodss/yaml v1.0.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-errors/errors v1.0.1 // indirect github.com/go-errors/errors v1.0.1 // indirect
github.com/go-jose/go-jose/v3 v3.0.1 // indirect github.com/go-jose/go-jose/v4 v4.0.1 // indirect
github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect
github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect
@ -183,6 +183,7 @@ require (
github.com/go-playground/validator/v10 v10.15.1 // indirect github.com/go-playground/validator/v10 v10.15.1 // indirect
github.com/go-resty/resty/v2 v2.11.0 // indirect github.com/go-resty/resty/v2 v2.11.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
github.com/go-zookeeper/zk v1.0.3 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect
github.com/goccy/go-json v0.10.2 // indirect github.com/goccy/go-json v0.10.2 // indirect
github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect
@ -255,6 +256,7 @@ require (
github.com/nrdcg/dnspod-go v0.4.0 // indirect github.com/nrdcg/dnspod-go v0.4.0 // indirect
github.com/nrdcg/freemyip v0.2.0 // indirect github.com/nrdcg/freemyip v0.2.0 // indirect
github.com/nrdcg/goinwx v0.10.0 // indirect github.com/nrdcg/goinwx v0.10.0 // indirect
github.com/nrdcg/mailinabox v0.2.0 // indirect
github.com/nrdcg/namesilo v0.2.1 // indirect github.com/nrdcg/namesilo v0.2.1 // indirect
github.com/nrdcg/nodion v0.1.0 // indirect github.com/nrdcg/nodion v0.1.0 // indirect
github.com/nrdcg/porkbun v0.3.0 // indirect github.com/nrdcg/porkbun v0.3.0 // indirect
@ -263,7 +265,7 @@ require (
github.com/onsi/ginkgo/v2 v2.11.0 // indirect github.com/onsi/ginkgo/v2 v2.11.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect
github.com/opencontainers/runc v1.1.5 // indirect github.com/opencontainers/runc v1.1.7 // indirect
github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect
github.com/ovh/go-ovh v1.4.3 // indirect github.com/ovh/go-ovh v1.4.3 // indirect
github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/pelletier/go-toml/v2 v2.0.9 // indirect
@ -288,7 +290,7 @@ require (
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect
github.com/softlayer/softlayer-go v1.1.3 // indirect github.com/softlayer/softlayer-go v1.1.3 // indirect
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect
github.com/spf13/cast v1.3.1 // indirect github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.5.1 // indirect github.com/stretchr/objx v0.5.1 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.490 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.490 // indirect
@ -320,9 +322,9 @@ require (
go.uber.org/ratelimit v0.2.0 // indirect go.uber.org/ratelimit v0.2.0 // indirect
go.uber.org/zap v1.26.0 // indirect go.uber.org/zap v1.26.0 // indirect
golang.org/x/arch v0.4.0 // indirect golang.org/x/arch v0.4.0 // indirect
golang.org/x/crypto v0.18.0 // indirect golang.org/x/crypto v0.19.0 // indirect
golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect
golang.org/x/term v0.16.0 // indirect golang.org/x/term v0.17.0 // indirect
google.golang.org/api v0.149.0 // indirect google.golang.org/api v0.149.0 // indirect
google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect

53
go.sum
View file

@ -179,7 +179,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
@ -189,7 +188,6 @@ github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLI
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/civo/civogo v0.3.11 h1:mON/fyrV946Sbk6paRtOSGsN+asCgCmHCgArf5xmGxM= github.com/civo/civogo v0.3.11 h1:mON/fyrV946Sbk6paRtOSGsN+asCgCmHCgArf5xmGxM=
@ -208,7 +206,6 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw=
github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
@ -231,7 +228,6 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= 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/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
@ -248,7 +244,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@ -278,7 +273,6 @@ github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig
github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= 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/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@ -317,7 +311,8 @@ github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
@ -335,15 +330,15 @@ github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwv
github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-acme/lego/v4 v4.15.0 h1:A7MHEU3b+TDFqhC/HmzMJnzPbyeaYvMZQBbqgvbThhU= github.com/go-acme/lego/v4 v4.16.1 h1:JxZ93s4KG0jL27rZ30UsIgxap6VGzKuREsSkkyzeoCQ=
github.com/go-acme/lego/v4 v4.15.0/go.mod h1:eeGhjW4zWT7Ccqa3sY7ayEqFLCAICx+mXgkMHKIkLxg= github.com/go-acme/lego/v4 v4.16.1/go.mod h1:AVvwdPned/IWpD/ihHhMsKnveF7HHYAz/CmtXi7OZoE=
github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs=
github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s=
github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA= github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U=
github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.10.1-0.20200915143503-439c4d2ed3ea h1:CnEQOUv4ilElSwFB9g/lVmz206oLE4aNZDYngIY1Gvg= github.com/go-kit/kit v0.10.1-0.20200915143503-439c4d2ed3ea h1:CnEQOUv4ilElSwFB9g/lVmz206oLE4aNZDYngIY1Gvg=
@ -395,6 +390,8 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c=
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA=
@ -412,7 +409,6 @@ github.com/goccy/go-json v0.7.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGF
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
@ -796,7 +792,6 @@ github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkV
github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc=
github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
@ -810,7 +805,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@ -841,6 +835,8 @@ github.com/nrdcg/freemyip v0.2.0 h1:/GscavT4GVqAY13HExl5UyoB4wlchv6Cg5NYDGsUoJ8=
github.com/nrdcg/freemyip v0.2.0/go.mod h1:HjF0Yz0lSb37HD2ihIyGz9esyGcxbCrrGFLPpKevbx4= github.com/nrdcg/freemyip v0.2.0/go.mod h1:HjF0Yz0lSb37HD2ihIyGz9esyGcxbCrrGFLPpKevbx4=
github.com/nrdcg/goinwx v0.10.0 h1:6W630bjDxQD6OuXKqrFRYVpTt0G/9GXXm3CeOrN0zJM= github.com/nrdcg/goinwx v0.10.0 h1:6W630bjDxQD6OuXKqrFRYVpTt0G/9GXXm3CeOrN0zJM=
github.com/nrdcg/goinwx v0.10.0/go.mod h1:mnMSTi7CXBu2io4DzdOBoGFA1XclD0sEPWJaDhNgkA4= github.com/nrdcg/goinwx v0.10.0/go.mod h1:mnMSTi7CXBu2io4DzdOBoGFA1XclD0sEPWJaDhNgkA4=
github.com/nrdcg/mailinabox v0.2.0 h1:IKq8mfKiVwNW2hQii/ng1dJ4yYMMv3HAP3fMFIq2CFk=
github.com/nrdcg/mailinabox v0.2.0/go.mod h1:0yxqeYOiGyxAu7Sb94eMxHPIOsPYXAjTeA9ZhePhGnc=
github.com/nrdcg/namesilo v0.2.1 h1:kLjCjsufdW/IlC+iSfAqj0iQGgKjlbUUeDJio5Y6eMg= github.com/nrdcg/namesilo v0.2.1 h1:kLjCjsufdW/IlC+iSfAqj0iQGgKjlbUUeDJio5Y6eMg=
github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw= github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw=
github.com/nrdcg/nodion v0.1.0 h1:zLKaqTn2X0aDuBHHfyA1zFgeZfiCpmu/O9DM73okavw= github.com/nrdcg/nodion v0.1.0 h1:zLKaqTn2X0aDuBHHfyA1zFgeZfiCpmu/O9DM73okavw=
@ -879,10 +875,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI=
github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8=
github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= github.com/opencontainers/runc v1.1.7 h1:y2EZDS8sNng4Ksf0GUYNhKbTShZJPJg1FiXJNH/uoCk=
github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50=
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
@ -1001,7 +995,6 @@ github.com/scaleway/scaleway-sdk-go v1.0.0-beta.22 h1:wJrcTdddKOI8TFxs8cemnhKP2E
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.22/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.22/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM=
github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY=
github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ= github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ=
@ -1017,7 +1010,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@ -1038,8 +1030,9 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
@ -1077,7 +1070,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
github.com/stvp/go-udp-testing v0.0.0-20191102171040-06b61409b154 h1:XGopsea1Dw7ecQ8JscCNQXDGYAKDiWjDeXnpN/+BY9g= github.com/stvp/go-udp-testing v0.0.0-20191102171040-06b61409b154 h1:XGopsea1Dw7ecQ8JscCNQXDGYAKDiWjDeXnpN/+BY9g=
github.com/stvp/go-udp-testing v0.0.0-20191102171040-06b61409b154/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/stvp/go-udp-testing v0.0.0-20191102171040-06b61409b154/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/tailscale/tscert v0.0.0-20220316030059-54bbcb9f74e2 h1:xwMw7LFhV9dbvot9A7NLClP9udqbjrQlIwWMH8e7uiQ= github.com/tailscale/tscert v0.0.0-20220316030059-54bbcb9f74e2 h1:xwMw7LFhV9dbvot9A7NLClP9udqbjrQlIwWMH8e7uiQ=
github.com/tailscale/tscert v0.0.0-20220316030059-54bbcb9f74e2/go.mod h1:hL4gB6APAasMR2NNi/JHzqKkxW3EPQlFgLEq9PMi2t0= github.com/tailscale/tscert v0.0.0-20220316030059-54bbcb9f74e2/go.mod h1:hL4gB6APAasMR2NNi/JHzqKkxW3EPQlFgLEq9PMi2t0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.490 h1:mmz27tVi2r70JYnm5y0Zk8w0Qzsx+vfUw3oqSyrEfP8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.490 h1:mmz27tVi2r70JYnm5y0Zk8w0Qzsx+vfUw3oqSyrEfP8=
@ -1134,8 +1126,6 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4ulRMcQ= github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4ulRMcQ=
github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q= github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q=
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/vulcand/oxy/v2 v2.0.0-20230427132221-be5cf38f3c1c h1:Qt/YKpE8uAKNF4x2mwBZxmVo2WtgUL1WFDeXr1nlfpA= github.com/vulcand/oxy/v2 v2.0.0-20230427132221-be5cf38f3c1c h1:Qt/YKpE8uAKNF4x2mwBZxmVo2WtgUL1WFDeXr1nlfpA=
github.com/vulcand/oxy/v2 v2.0.0-20230427132221-be5cf38f3c1c/go.mod h1:A2voDnpONyqdplUDK0lt5y4XHLiBXPBw7iQES8+ZWRw= github.com/vulcand/oxy/v2 v2.0.0-20230427132221-be5cf38f3c1c/go.mod h1:A2voDnpONyqdplUDK0lt5y4XHLiBXPBw7iQES8+ZWRw=
github.com/vulcand/predicate v1.2.0 h1:uFsW1gcnnR7R+QTID+FVcs0sSYlIGntoGOTb3rQJt50= github.com/vulcand/predicate v1.2.0 h1:uFsW1gcnnR7R+QTID+FVcs0sSYlIGntoGOTb3rQJt50=
@ -1240,7 +1230,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@ -1258,8 +1247,8 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -1319,7 +1308,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
@ -1372,7 +1360,6 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1385,7 +1372,6 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1412,11 +1398,8 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -1444,8 +1427,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.3.0/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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

View file

@ -67,7 +67,7 @@ func (s *ThrottlingSuite) TestThrottleConfReload() {
confChanges := 10 confChanges := 10
for i := 0; i < confChanges; i++ { for i := range confChanges {
config.HTTP.Routers[fmt.Sprintf("routerHTTP%d", i)] = router config.HTTP.Routers[fmt.Sprintf("routerHTTP%d", i)] = router
data, err := json.Marshal(config) data, err := json.Marshal(config)
require.NoError(s.T(), err) require.NoError(s.T(), err)

View file

@ -312,7 +312,7 @@ func (s *HealthCheckSuite) TestPropagate() {
// Verify load-balancing on root still works, and that we're getting an alternation between wsp2, and wsp4. // Verify load-balancing on root still works, and that we're getting an alternation between wsp2, and wsp4.
reachedServers := make(map[string]int) reachedServers := make(map[string]int)
for i := 0; i < 4; i++ { for range 4 {
resp, err := client.Do(rootReq) resp, err := client.Do(rootReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -352,7 +352,7 @@ func (s *HealthCheckSuite) TestPropagate() {
// Verify load-balancing on foo still works, and that we're getting wsp2, wsp2, wsp2, wsp2, etc. // Verify load-balancing on foo still works, and that we're getting wsp2, wsp2, wsp2, wsp2, etc.
want := `IP: ` + s.whoami2IP want := `IP: ` + s.whoami2IP
for i := 0; i < 4; i++ { for range 4 {
resp, err := client.Do(fooReq) resp, err := client.Do(fooReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -368,7 +368,7 @@ func (s *HealthCheckSuite) TestPropagate() {
// Verify load-balancing on bar still works, and that we're getting wsp2, wsp2, wsp2, wsp2, etc. // Verify load-balancing on bar still works, and that we're getting wsp2, wsp2, wsp2, wsp2, etc.
want = `IP: ` + s.whoami2IP want = `IP: ` + s.whoami2IP
for i := 0; i < 4; i++ { for range 4 {
resp, err := client.Do(barReq) resp, err := client.Do(barReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -390,7 +390,7 @@ func (s *HealthCheckSuite) TestPropagate() {
try.Sleep(time.Second) try.Sleep(time.Second)
// Verify that everything is down, and that we get 503s everywhere. // Verify that everything is down, and that we get 503s everywhere.
for i := 0; i < 2; i++ { for range 2 {
resp, err := client.Do(rootReq) resp, err := client.Do(rootReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)
assert.Equal(s.T(), http.StatusServiceUnavailable, resp.StatusCode) assert.Equal(s.T(), http.StatusServiceUnavailable, resp.StatusCode)
@ -417,7 +417,7 @@ func (s *HealthCheckSuite) TestPropagate() {
// Verify everything is up on root router. // Verify everything is up on root router.
reachedServers = make(map[string]int) reachedServers = make(map[string]int)
for i := 0; i < 4; i++ { for range 4 {
resp, err := client.Do(rootReq) resp, err := client.Do(rootReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -452,7 +452,7 @@ func (s *HealthCheckSuite) TestPropagate() {
// Verify everything is up on foo router. // Verify everything is up on foo router.
reachedServers = make(map[string]int) reachedServers = make(map[string]int)
for i := 0; i < 4; i++ { for range 4 {
resp, err := client.Do(fooReq) resp, err := client.Do(fooReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -487,7 +487,7 @@ func (s *HealthCheckSuite) TestPropagate() {
// Verify everything is up on bar router. // Verify everything is up on bar router.
reachedServers = make(map[string]int) reachedServers = make(map[string]int)
for i := 0; i < 4; i++ { for range 4 {
resp, err := client.Do(barReq) resp, err := client.Do(barReq)
require.NoError(s.T(), err) require.NoError(s.T(), err)

View file

@ -243,7 +243,7 @@ func (s *BaseSuite) createComposeProject(name string) {
} }
if containerConfig.Deploy.Replicas > 0 { if containerConfig.Deploy.Replicas > 0 {
for i := 0; i < containerConfig.Deploy.Replicas; i++ { for i := range containerConfig.Deploy.Replicas {
id = fmt.Sprintf("%s-%d", id, i+1) id = fmt.Sprintf("%s-%d", id, i+1)
con, err := s.createContainer(ctx, containerConfig, id, mounts) con, err := s.createContainer(ctx, containerConfig, id, mounts)
require.NoError(s.T(), err) require.NoError(s.T(), err)

View file

@ -311,7 +311,7 @@ func (s *SimpleSuite) TestMetricsPrometheusTwoRoutersOneService() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
// adding a loop to test if metrics are not deleted // adding a loop to test if metrics are not deleted
for i := 0; i < 10; i++ { for range 10 {
request, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8080/metrics", nil) request, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8080/metrics", nil)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -876,7 +876,7 @@ func (s *SimpleSuite) TestWRR() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
repartition := map[string]int{} repartition := map[string]int{}
for i := 0; i < 4; i++ { for range 4 {
req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil) req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -922,7 +922,7 @@ func (s *SimpleSuite) TestWRRSticky() {
req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil) req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil)
require.NoError(s.T(), err) require.NoError(s.T(), err)
for i := 0; i < 4; i++ { for range 4 {
response, err := http.DefaultClient.Do(req) response, err := http.DefaultClient.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
assert.Equal(s.T(), http.StatusOK, response.StatusCode) assert.Equal(s.T(), http.StatusOK, response.StatusCode)
@ -978,7 +978,7 @@ func (s *SimpleSuite) TestMirror() {
req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil) req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil)
require.NoError(s.T(), err) require.NoError(s.T(), err)
for i := 0; i < 10; i++ { for range 10 {
response, err := http.DefaultClient.Do(req) response, err := http.DefaultClient.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
assert.Equal(s.T(), http.StatusOK, response.StatusCode) assert.Equal(s.T(), http.StatusOK, response.StatusCode)
@ -1049,7 +1049,7 @@ func (s *SimpleSuite) TestMirrorWithBody() {
req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", bytes.NewBuffer(body20)) req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", bytes.NewBuffer(body20))
require.NoError(s.T(), err) require.NoError(s.T(), err)
req.Header.Set("Size", "20") req.Header.Set("Size", "20")
for i := 0; i < 10; i++ { for range 10 {
response, err := http.DefaultClient.Do(req) response, err := http.DefaultClient.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
assert.Equal(s.T(), http.StatusOK, response.StatusCode) assert.Equal(s.T(), http.StatusOK, response.StatusCode)
@ -1070,7 +1070,7 @@ func (s *SimpleSuite) TestMirrorWithBody() {
req, err = http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoamiWithMaxBody", bytes.NewBuffer(body5)) req, err = http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoamiWithMaxBody", bytes.NewBuffer(body5))
require.NoError(s.T(), err) require.NoError(s.T(), err)
req.Header.Set("Size", "5") req.Header.Set("Size", "5")
for i := 0; i < 10; i++ { for range 10 {
response, err := http.DefaultClient.Do(req) response, err := http.DefaultClient.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
assert.Equal(s.T(), http.StatusOK, response.StatusCode) assert.Equal(s.T(), http.StatusOK, response.StatusCode)
@ -1091,7 +1091,7 @@ func (s *SimpleSuite) TestMirrorWithBody() {
req, err = http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoamiWithMaxBody", bytes.NewBuffer(body20)) req, err = http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoamiWithMaxBody", bytes.NewBuffer(body20))
require.NoError(s.T(), err) require.NoError(s.T(), err)
req.Header.Set("Size", "20") req.Header.Set("Size", "20")
for i := 0; i < 10; i++ { for range 10 {
response, err := http.DefaultClient.Do(req) response, err := http.DefaultClient.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
assert.Equal(s.T(), http.StatusOK, response.StatusCode) assert.Equal(s.T(), http.StatusOK, response.StatusCode)
@ -1137,7 +1137,7 @@ func (s *SimpleSuite) TestMirrorCanceled() {
err := try.GetRequest("http://127.0.0.1:8080/api/http/services", 1000*time.Millisecond, try.BodyContains("mirror1", "mirror2", "service1")) err := try.GetRequest("http://127.0.0.1:8080/api/http/services", 1000*time.Millisecond, try.BodyContains("mirror1", "mirror2", "service1"))
require.NoError(s.T(), err) require.NoError(s.T(), err)
for i := 0; i < 5; i++ { for range 5 {
req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil) req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:8000/whoami", nil)
require.NoError(s.T(), err) require.NoError(s.T(), err)

View file

@ -287,7 +287,7 @@ func (s *TCPSuite) TestWRR() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
call := map[string]int{} call := map[string]int{}
for i := 0; i < 4; i++ { for range 4 {
// Traefik passes through, termination handled by whoami-b or whoami-bb // Traefik passes through, termination handled by whoami-b or whoami-bb
out, err := guessWhoTLSPassthrough("127.0.0.1:8093", "whoami-b.test") out, err := guessWhoTLSPassthrough("127.0.0.1:8093", "whoami-b.test")
require.NoError(s.T(), err) require.NoError(s.T(), err)

View file

@ -53,7 +53,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -69,7 +69,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -53,7 +53,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -69,7 +69,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -6,7 +6,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -22,7 +22,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -6,7 +6,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -22,7 +22,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -6,7 +6,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -22,7 +22,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -6,7 +6,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -22,7 +22,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -6,7 +6,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -22,7 +22,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -53,7 +53,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -69,7 +69,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -53,7 +53,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646, "priority": 9223372036854775806,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"
@ -69,7 +69,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645, "priority": 9223372036854775805,
"status": "enabled", "status": "enabled",
"using": [ "using": [
"traefik" "traefik"

View file

@ -82,7 +82,7 @@ func (s *UDPSuite) TestWRR() {
stop := make(chan struct{}) stop := make(chan struct{})
go func() { go func() {
call := map[string]int{} call := map[string]int{}
for i := 0; i < 8; i++ { for range 8 {
out, err := guessWhoUDP("127.0.0.1:8093") out, err := guessWhoUDP("127.0.0.1:8093")
require.NoError(s.T(), err) require.NoError(s.T(), err)
switch { switch {

View file

@ -206,7 +206,7 @@ func clean(element any) {
valueSvcRoot := valSvcs.MapIndex(key).Elem() valueSvcRoot := valSvcs.MapIndex(key).Elem()
var svcFieldNames []string var svcFieldNames []string
for i := 0; i < valueSvcRoot.NumField(); i++ { for i := range valueSvcRoot.NumField() {
svcFieldNames = append(svcFieldNames, valueSvcRoot.Type().Field(i).Name) svcFieldNames = append(svcFieldNames, valueSvcRoot.Type().Field(i).Name)
} }

View file

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"net/url" "net/url"
"slices"
"strconv" "strconv"
"strings" "strings"
) )
@ -59,13 +60,9 @@ func (c *searchCriterion) searchIn(values ...string) bool {
return true return true
} }
for _, v := range values { return slices.ContainsFunc(values, func(v string) bool {
if strings.Contains(strings.ToLower(v), strings.ToLower(c.Search)) { return strings.Contains(strings.ToLower(v), strings.ToLower(c.Search))
return true })
}
}
return false
} }
func (c *searchCriterion) filterService(name string) bool { func (c *searchCriterion) filterService(name string) bool {

View file

@ -149,7 +149,7 @@ func getProviderName(id string) string {
func extractType(element interface{}) string { func extractType(element interface{}) string {
v := reflect.ValueOf(element).Elem() v := reflect.ValueOf(element).Elem()
for i := 0; i < v.NumField(); i++ { for i := range v.NumField() {
field := v.Field(i) field := v.Field(i)
if field.Kind() == reflect.Map && field.Type().Elem() == reflect.TypeOf(dynamic.PluginConf{}) { if field.Kind() == reflect.Map && field.Type().Elem() == reflect.TypeOf(dynamic.PluginConf{}) {

View file

@ -256,7 +256,7 @@ func TestHandler_EntryPoints(t *testing.T) {
func generateEntryPoints(nb int) map[string]*static.EntryPoint { func generateEntryPoints(nb int) map[string]*static.EntryPoint {
eps := make(map[string]*static.EntryPoint, nb) eps := make(map[string]*static.EntryPoint, nb)
for i := 0; i < nb; i++ { for i := range nb {
eps[fmt.Sprintf("ep%2d", i)] = &static.EntryPoint{ eps[fmt.Sprintf("ep%2d", i)] = &static.EntryPoint{
Address: ":" + strconv.Itoa(i), Address: ":" + strconv.Itoa(i),
} }

View file

@ -1050,7 +1050,7 @@ func TestHandler_HTTP(t *testing.T) {
func generateHTTPRouters(nbRouters int) map[string]*runtime.RouterInfo { func generateHTTPRouters(nbRouters int) map[string]*runtime.RouterInfo {
routers := make(map[string]*runtime.RouterInfo, nbRouters) routers := make(map[string]*runtime.RouterInfo, nbRouters)
for i := 0; i < nbRouters; i++ { for i := range nbRouters {
routers[fmt.Sprintf("bar%2d@myprovider", i)] = &runtime.RouterInfo{ routers[fmt.Sprintf("bar%2d@myprovider", i)] = &runtime.RouterInfo{
Router: &dynamic.Router{ Router: &dynamic.Router{
EntryPoints: []string{"web"}, EntryPoints: []string{"web"},

View file

@ -226,7 +226,7 @@ func getProviders(conf static.Configuration) []string {
var providers []string var providers []string
v := reflect.ValueOf(conf.Providers).Elem() v := reflect.ValueOf(conf.Providers).Elem()
for i := 0; i < v.NumField(); i++ { for i := range v.NumField() {
field := v.Field(i) field := v.Field(i)
if field.Kind() == reflect.Ptr && field.Elem().Kind() == reflect.Struct { if field.Kind() == reflect.Ptr && field.Elem().Kind() == reflect.Struct {
if !field.IsNil() { if !field.IsNil() {
@ -256,7 +256,7 @@ func getMetrics(conf static.Configuration) string {
} }
v := reflect.ValueOf(conf.Metrics).Elem() v := reflect.ValueOf(conf.Metrics).Elem()
for i := 0; i < v.NumField(); i++ { for i := range v.NumField() {
field := v.Field(i) field := v.Field(i)
if field.Kind() == reflect.Ptr && field.Elem().Kind() == reflect.Struct { if field.Kind() == reflect.Ptr && field.Elem().Kind() == reflect.Struct {
if !field.IsNil() { if !field.IsNil() {
@ -274,7 +274,7 @@ func getTracing(conf static.Configuration) string {
} }
v := reflect.ValueOf(conf.Tracing).Elem() v := reflect.ValueOf(conf.Tracing).Elem()
for i := 0; i < v.NumField(); i++ { for i := range v.NumField() {
field := v.Field(i) field := v.Field(i)
if field.Kind() == reflect.Ptr && field.Elem().Kind() == reflect.Struct { if field.Kind() == reflect.Ptr && field.Elem().Kind() == reflect.Struct {
if !field.IsNil() { if !field.IsNil() {

View file

@ -56,7 +56,7 @@ func fill(field reflect.Value) error {
case reflect.Int64: case reflect.Int64:
switch field.Type() { switch field.Type() {
case reflect.TypeOf(types.Duration(time.Second)): case reflect.TypeOf(types.Duration(time.Second)):
setTyped(field, int64(defaultNumber*int(time.Second))) setTyped(field, types.Duration(defaultNumber*time.Second))
default: default:
setTyped(field, int64(defaultNumber)) setTyped(field, int64(defaultNumber))
} }
@ -93,12 +93,12 @@ func setTyped(field reflect.Value, i interface{}) {
func setMap(field reflect.Value) error { func setMap(field reflect.Value) error {
field.Set(reflect.MakeMap(field.Type())) field.Set(reflect.MakeMap(field.Type()))
for i := 0; i < mapItemNumber; i++ { for i := range mapItemNumber {
baseKeyName := makeKeyName(field.Type().Elem()) baseKeyName := makeKeyName(field.Type().Elem())
key := reflect.ValueOf(fmt.Sprintf("%s%d", baseKeyName, i)) key := reflect.ValueOf(fmt.Sprintf("%s%d", baseKeyName, i))
// generate value // generate value
ptrType := reflect.PtrTo(field.Type().Elem()) ptrType := reflect.PointerTo(field.Type().Elem())
ptrValue := reflect.New(ptrType) ptrValue := reflect.New(ptrType)
if err := fill(ptrValue); err != nil { if err := fill(ptrValue); err != nil {
return err return err
@ -125,7 +125,7 @@ func makeKeyName(typ reflect.Type) string {
} }
func setStruct(field reflect.Value) error { func setStruct(field reflect.Value) error {
for i := 0; i < field.NumField(); i++ { for i := range field.NumField() {
fld := field.Field(i) fld := field.Field(i)
stFld := field.Type().Field(i) stFld := field.Type().Field(i)
@ -142,7 +142,7 @@ func setStruct(field reflect.Value) error {
func setSlice(field reflect.Value) error { func setSlice(field reflect.Value) error {
field.Set(reflect.MakeSlice(field.Type(), sliceItemNumber, sliceItemNumber)) field.Set(reflect.MakeSlice(field.Type(), sliceItemNumber, sliceItemNumber))
for j := 0; j < field.Len(); j++ { for j := range field.Len() {
if err := fill(field.Index(j)); err != nil { if err := fill(field.Index(j)); err != nil {
return err return err
} }

View file

@ -24,7 +24,7 @@ type Configuration struct {
HTTP *HTTPConfiguration `json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" export:"true"` HTTP *HTTPConfiguration `json:"http,omitempty" toml:"http,omitempty" yaml:"http,omitempty" export:"true"`
TCP *TCPConfiguration `json:"tcp,omitempty" toml:"tcp,omitempty" yaml:"tcp,omitempty" export:"true"` TCP *TCPConfiguration `json:"tcp,omitempty" toml:"tcp,omitempty" yaml:"tcp,omitempty" export:"true"`
UDP *UDPConfiguration `json:"udp,omitempty" toml:"udp,omitempty" yaml:"udp,omitempty" export:"true"` UDP *UDPConfiguration `json:"udp,omitempty" toml:"udp,omitempty" yaml:"udp,omitempty" export:"true"`
TLS *TLSConfiguration `json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" label:"-" export:"true"` TLS *TLSConfiguration `json:"tls,omitempty" toml:"tls,omitempty" yaml:"tls,omitempty" export:"true"`
} }
// +k8s:deepcopy-gen=true // +k8s:deepcopy-gen=true
@ -32,6 +32,6 @@ type Configuration struct {
// TLSConfiguration contains all the configuration parameters of a TLS connection. // TLSConfiguration contains all the configuration parameters of a TLS connection.
type TLSConfiguration struct { type TLSConfiguration struct {
Certificates []*tls.CertAndStores `json:"certificates,omitempty" toml:"certificates,omitempty" yaml:"certificates,omitempty" label:"-" export:"true"` Certificates []*tls.CertAndStores `json:"certificates,omitempty" toml:"certificates,omitempty" yaml:"certificates,omitempty" label:"-" export:"true"`
Options map[string]tls.Options `json:"options,omitempty" toml:"options,omitempty" yaml:"options,omitempty" export:"true"` Options map[string]tls.Options `json:"options,omitempty" toml:"options,omitempty" yaml:"options,omitempty" label:"-" export:"true"`
Stores map[string]tls.Store `json:"stores,omitempty" toml:"stores,omitempty" yaml:"stores,omitempty" export:"true"` Stores map[string]tls.Store `json:"stores,omitempty" toml:"stores,omitempty" yaml:"stores,omitempty" export:"true"`
} }

View file

@ -55,7 +55,7 @@ func getFieldNames(rootName string, rootType reflect.Type) []string {
return nil return nil
} }
for i := 0; i < rootType.NumField(); i++ { for i := range rootType.NumField() {
field := rootType.Field(i) field := rootType.Field(i)
if !parser.IsExported(field) { if !parser.IsExported(field) {

View file

@ -12,9 +12,11 @@ func DecodeConfiguration(labels map[string]string) (*dynamic.Configuration, erro
HTTP: &dynamic.HTTPConfiguration{}, HTTP: &dynamic.HTTPConfiguration{},
TCP: &dynamic.TCPConfiguration{}, TCP: &dynamic.TCPConfiguration{},
UDP: &dynamic.UDPConfiguration{}, UDP: &dynamic.UDPConfiguration{},
TLS: &dynamic.TLSConfiguration{},
} }
err := parser.Decode(labels, conf, parser.DefaultRootName, "traefik.http", "traefik.tcp", "traefik.udp") // When decoding the TLS configuration we are making sure that only the default TLS store can be configured.
err := parser.Decode(labels, conf, parser.DefaultRootName, "traefik.http", "traefik.tcp", "traefik.udp", "traefik.tls.stores.default")
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -9,6 +9,8 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
ptypes "github.com/traefik/paerser/types" ptypes "github.com/traefik/paerser/types"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/tls"
"github.com/traefik/traefik/v3/pkg/types"
) )
func Bool(v bool) *bool { return &v } func Bool(v bool) *bool { return &v }
@ -217,6 +219,10 @@ func TestDecodeConfiguration(t *testing.T) {
"traefik.udp.routers.Router1.service": "foobar", "traefik.udp.routers.Router1.service": "foobar",
"traefik.udp.services.Service0.loadbalancer.server.Port": "42", "traefik.udp.services.Service0.loadbalancer.server.Port": "42",
"traefik.udp.services.Service1.loadbalancer.server.Port": "42", "traefik.udp.services.Service1.loadbalancer.server.Port": "42",
"traefik.tls.stores.default.defaultgeneratedcert.resolver": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.main": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.sans": "foobar, fiibar",
} }
configuration, err := DecodeConfiguration(labels) configuration, err := DecodeConfiguration(labels)
@ -719,6 +725,19 @@ func TestDecodeConfiguration(t *testing.T) {
}, },
}, },
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{
"default": {
DefaultGeneratedCert: &tls.GeneratedCert{
Resolver: "foobar",
Domain: &types.Domain{
Main: "foobar",
SANs: []string{"foobar", "fiibar"},
},
},
},
},
},
} }
assert.Nil(t, configuration.HTTP.ServersTransports) assert.Nil(t, configuration.HTTP.ServersTransports)
@ -1216,6 +1235,19 @@ func TestEncodeConfiguration(t *testing.T) {
}, },
}, },
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{
"default": {
DefaultGeneratedCert: &tls.GeneratedCert{
Resolver: "foobar",
Domain: &types.Domain{
Main: "foobar",
SANs: []string{"foobar", "fiibar"},
},
},
},
},
},
} }
labels, err := EncodeConfiguration(configuration) labels, err := EncodeConfiguration(configuration)
@ -1415,6 +1447,10 @@ func TestEncodeConfiguration(t *testing.T) {
"traefik.TCP.Services.Service1.LoadBalancer.ServersTransport": "foo", "traefik.TCP.Services.Service1.LoadBalancer.ServersTransport": "foo",
"traefik.TCP.Services.Service1.LoadBalancer.TerminationDelay": "42", "traefik.TCP.Services.Service1.LoadBalancer.TerminationDelay": "42",
"traefik.TLS.Stores.default.DefaultGeneratedCert.Resolver": "foobar",
"traefik.TLS.Stores.default.DefaultGeneratedCert.Domain.Main": "foobar",
"traefik.TLS.Stores.default.DefaultGeneratedCert.Domain.SANs": "foobar, fiibar",
"traefik.UDP.Routers.Router0.EntryPoints": "foobar, fiibar", "traefik.UDP.Routers.Router0.EntryPoints": "foobar, fiibar",
"traefik.UDP.Routers.Router0.Service": "foobar", "traefik.UDP.Routers.Router0.Service": "foobar",
"traefik.UDP.Routers.Router1.EntryPoints": "foobar, fiibar", "traefik.UDP.Routers.Router1.EntryPoints": "foobar, fiibar",

View file

@ -97,7 +97,7 @@ type RedirectEntryPoint struct {
func (r *RedirectEntryPoint) SetDefaults() { func (r *RedirectEntryPoint) SetDefaults() {
r.Scheme = "https" r.Scheme = "https"
r.Permanent = true r.Permanent = true
r.Priority = math.MaxInt32 - 1 r.Priority = math.MaxInt - 1
} }
// TLSConfig is the default TLS configuration for all the routers associated to the concerned entry point. // TLSConfig is the default TLS configuration for all the routers associated to the concerned entry point.

View file

@ -76,7 +76,7 @@ func TestLogRotation(t *testing.T) {
halfDone := make(chan bool) halfDone := make(chan bool)
writeDone := make(chan bool) writeDone := make(chan bool)
go func() { go func() {
for i := 0; i < iterations; i++ { for i := range iterations {
handler.ServeHTTP(recorder, req) handler.ServeHTTP(recorder, req)
if i == iterations/2 { if i == iterations/2 {
halfDone <- true halfDone <- true

View file

@ -149,7 +149,7 @@ func BenchmarkCapture(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
b.SetBytes(int64(test.size)) b.SetBytes(int64(test.size))
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for range b.N {
runBenchmark(b, test.size, req, handlers) runBenchmark(b, test.size, req, handlers)
} }
}) })
@ -170,7 +170,7 @@ func runBenchmark(b *testing.B, size int, req *http.Request, handler http.Handle
func generateBytes(length int) []byte { func generateBytes(length int) []byte {
var value []byte var value []byte
for i := 0; i < length; i++ { for i := range length {
value = append(value, 0x61+byte(i%26)) value = append(value, 0x61+byte(i%26))
} }
return value return value

View file

@ -720,7 +720,7 @@ func BenchmarkCompress(b *testing.B) {
} }
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for range b.N {
runBenchmark(b, req, handler) runBenchmark(b, req, handler)
} }
}) })
@ -741,7 +741,7 @@ func runBenchmark(b *testing.B, req *http.Request, handler http.Handler) {
func generateBytes(length int) []byte { func generateBytes(length int) []byte {
var value []byte var value []byte
for i := 0; i < length; i++ { for i := range length {
value = append(value, 0x61+byte(i)) value = append(value, 0x61+byte(i))
} }
return value return value

View file

@ -3,6 +3,7 @@ package metrics
import ( import (
"context" "context"
"net/http" "net/http"
"slices"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -216,12 +217,10 @@ func grpcStatusCode(rw http.ResponseWriter) int {
func containsHeader(req *http.Request, name, value string) bool { func containsHeader(req *http.Request, name, value string) bool {
items := strings.Split(req.Header.Get(name), ",") items := strings.Split(req.Header.Get(name), ",")
for _, item := range items {
if value == strings.ToLower(strings.TrimSpace(item)) { return slices.ContainsFunc(items, func(item string) bool {
return true return value == strings.ToLower(strings.TrimSpace(item))
} })
}
return false
} }
// getMethod returns the request's method. // getMethod returns the request's method.

View file

@ -49,7 +49,7 @@ func (hr *Resolver) CNAMEFlatten(ctx context.Context, host string) string {
logger := log.Ctx(ctx) logger := log.Ctx(ctx)
cacheDuration := 0 * time.Second cacheDuration := 0 * time.Second
for depth := 0; depth < hr.ResolvDepth; depth++ { for depth := range hr.ResolvDepth {
resolv, err := cnameResolve(ctx, request, hr.ResolvConfig) resolv, err := cnameResolve(ctx, request, hr.ResolvConfig)
if err != nil { if err != nil {
logger.Error().Err(err).Send() logger.Error().Err(err).Send()

View file

@ -203,7 +203,7 @@ func TestMultipleRetriesShouldNotLooseHeaders(t *testing.T) {
} }
// Validate that we don't have headers from previous attempts // Validate that we don't have headers from previous attempts
for i := 0; i < attempt; i++ { for i := range attempt {
headerName := fmt.Sprintf("X-Foo-Test-%d", i) headerName := fmt.Sprintf("X-Foo-Test-%d", i)
headerValue = responseRecorder.Header().Get("headerName") headerValue = responseRecorder.Header().Get("headerName")
if headerValue != "" { if headerValue != "" {

View file

@ -2,6 +2,7 @@ package acme
import ( import (
"fmt" "fmt"
"slices"
"sync" "sync"
"time" "time"
@ -119,7 +120,7 @@ func (c *ChallengeTLSALPN) ListenConfiguration(conf dynamic.Configuration) {
c.muChans.Lock() c.muChans.Lock()
for _, certificate := range conf.TLS.Certificates { for _, certificate := range conf.TLS.Certificates {
if !containsACMETLS1(certificate.Stores) { if !slices.Contains(certificate.Stores, tlsalpn01.ACMETLS1Protocol) {
continue continue
} }
@ -162,13 +163,3 @@ func createMessage(certs map[string]*Certificate) dynamic.Message {
return conf return conf
} }
func containsACMETLS1(stores []string) bool {
for _, store := range stores {
if store == tlsalpn01.ACMETLS1Protocol {
return true
}
}
return false
}

View file

@ -33,9 +33,6 @@ import (
const resolverSuffix = ".acme" const resolverSuffix = ".acme"
// ocspMustStaple enables OCSP stapling as from https://github.com/go-acme/lego/issues/270.
var ocspMustStaple = false
// Configuration holds ACME configuration provided by users. // Configuration holds ACME configuration provided by users.
type Configuration struct { type Configuration struct {
Email string `description:"Email address used for registration." json:"email,omitempty" toml:"email,omitempty" yaml:"email,omitempty"` Email string `description:"Email address used for registration." json:"email,omitempty" toml:"email,omitempty" yaml:"email,omitempty"`
@ -427,7 +424,7 @@ func (p *Provider) watchNewDomains(ctx context.Context) {
if len(route.TLS.Domains) > 0 { if len(route.TLS.Domains) > 0 {
domains := deleteUnnecessaryDomains(ctxRouter, route.TLS.Domains) domains := deleteUnnecessaryDomains(ctxRouter, route.TLS.Domains)
for i := 0; i < len(domains); i++ { for i := range len(domains) {
domain := domains[i] domain := domains[i]
safe.Go(func() { safe.Go(func() {
dom, cert, err := p.resolveCertificate(ctx, domain, traefiktls.DefaultTLSStoreName) dom, cert, err := p.resolveCertificate(ctx, domain, traefiktls.DefaultTLSStoreName)
@ -464,7 +461,7 @@ func (p *Provider) watchNewDomains(ctx context.Context) {
if len(route.TLS.Domains) > 0 { if len(route.TLS.Domains) > 0 {
domains := deleteUnnecessaryDomains(ctxRouter, route.TLS.Domains) domains := deleteUnnecessaryDomains(ctxRouter, route.TLS.Domains)
for i := 0; i < len(domains); i++ { for i := range len(domains) {
domain := domains[i] domain := domains[i]
safe.Go(func() { safe.Go(func() {
dom, cert, err := p.resolveCertificate(ctx, domain, traefiktls.DefaultTLSStoreName) dom, cert, err := p.resolveCertificate(ctx, domain, traefiktls.DefaultTLSStoreName)
@ -585,7 +582,6 @@ func (p *Provider) resolveDefaultCertificate(ctx context.Context, domains []stri
request := certificate.ObtainRequest{ request := certificate.ObtainRequest{
Domains: domains, Domains: domains,
Bundle: true, Bundle: true,
MustStaple: ocspMustStaple,
PreferredChain: p.PreferredChain, PreferredChain: p.PreferredChain,
} }
@ -630,7 +626,6 @@ func (p *Provider) resolveCertificate(ctx context.Context, domain types.Domain,
request := certificate.ObtainRequest{ request := certificate.ObtainRequest{
Domains: domains, Domains: domains,
Bundle: true, Bundle: true,
MustStaple: ocspMustStaple,
PreferredChain: p.PreferredChain, PreferredChain: p.PreferredChain,
} }
@ -821,11 +816,18 @@ func (p *Provider) renewCertificates(ctx context.Context, renewPeriod time.Durat
logger.Info().Msgf("Renewing certificate from LE : %+v", cert.Domain) logger.Info().Msgf("Renewing certificate from LE : %+v", cert.Domain)
renewedCert, err := client.Certificate.Renew(certificate.Resource{ res := certificate.Resource{
Domain: cert.Domain.Main, Domain: cert.Domain.Main,
PrivateKey: cert.Key, PrivateKey: cert.Key,
Certificate: cert.Certificate.Certificate, Certificate: cert.Certificate.Certificate,
}, true, ocspMustStaple, p.PreferredChain) }
opts := &certificate.RenewOptions{
Bundle: true,
PreferredChain: p.PreferredChain,
}
renewedCert, err := client.Certificate.RenewWithOptions(res, opts)
if err != nil { if err != nil {
logger.Error().Err(err).Msgf("Error renewing certificate from LE: %v", cert.Domain) logger.Error().Err(err).Msgf("Error renewing certificate from LE: %v", cert.Domain)
continue continue

View file

@ -13,9 +13,10 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/logs" "github.com/traefik/traefik/v3/pkg/logs"
"github.com/traefik/traefik/v3/pkg/tls"
) )
// Merge Merges multiple configurations. // Merge merges multiple configurations.
func Merge(ctx context.Context, configurations map[string]*dynamic.Configuration) *dynamic.Configuration { func Merge(ctx context.Context, configurations map[string]*dynamic.Configuration) *dynamic.Configuration {
logger := log.Ctx(ctx) logger := log.Ctx(ctx)
@ -36,6 +37,9 @@ func Merge(ctx context.Context, configurations map[string]*dynamic.Configuration
Routers: make(map[string]*dynamic.UDPRouter), Routers: make(map[string]*dynamic.UDPRouter),
Services: make(map[string]*dynamic.UDPService), Services: make(map[string]*dynamic.UDPService),
}, },
TLS: &dynamic.TLSConfiguration{
Stores: make(map[string]tls.Store),
},
} }
servicesToDelete := map[string]struct{}{} servicesToDelete := map[string]struct{}{}
@ -68,6 +72,9 @@ func Merge(ctx context.Context, configurations map[string]*dynamic.Configuration
transportsTCPToDelete := map[string]struct{}{} transportsTCPToDelete := map[string]struct{}{}
transportsTCP := map[string][]string{} transportsTCP := map[string][]string{}
storesToDelete := map[string]struct{}{}
stores := map[string][]string{}
var sortedKeys []string var sortedKeys []string
for key := range configurations { for key := range configurations {
sortedKeys = append(sortedKeys, key) sortedKeys = append(sortedKeys, key)
@ -145,6 +152,13 @@ func Merge(ctx context.Context, configurations map[string]*dynamic.Configuration
middlewaresTCPToDelete[middlewareName] = struct{}{} middlewaresTCPToDelete[middlewareName] = struct{}{}
} }
} }
for storeName, store := range conf.TLS.Stores {
stores[storeName] = append(stores[storeName], root)
if !AddStore(configuration.TLS, storeName, store) {
storesToDelete[storeName] = struct{}{}
}
}
} }
for serviceName := range servicesToDelete { for serviceName := range servicesToDelete {
@ -217,6 +231,12 @@ func Merge(ctx context.Context, configurations map[string]*dynamic.Configuration
delete(configuration.TCP.Middlewares, middlewareName) delete(configuration.TCP.Middlewares, middlewareName)
} }
for storeName := range storesToDelete {
logger.Error().Str("storeName", storeName).
Msgf("TLS store defined multiple times with different configurations in %v", stores[storeName])
delete(configuration.TLS.Stores, storeName)
}
return configuration return configuration
} }
@ -365,7 +385,17 @@ func AddMiddleware(configuration *dynamic.HTTPConfiguration, middlewareName stri
return reflect.DeepEqual(configuration.Middlewares[middlewareName], middleware) return reflect.DeepEqual(configuration.Middlewares[middlewareName], middleware)
} }
// MakeDefaultRuleTemplate Creates the default rule template. // AddStore adds a middleware to a configurations.
func AddStore(configuration *dynamic.TLSConfiguration, storeName string, store tls.Store) bool {
if _, ok := configuration.Stores[storeName]; !ok {
configuration.Stores[storeName] = store
return true
}
return reflect.DeepEqual(configuration.Stores[storeName], store)
}
// MakeDefaultRuleTemplate creates the default rule template.
func MakeDefaultRuleTemplate(defaultRule string, funcMap template.FuncMap) (*template.Template, error) { func MakeDefaultRuleTemplate(defaultRule string, funcMap template.FuncMap) (*template.Template, error) {
defaultFuncMap := sprig.TxtFuncMap() defaultFuncMap := sprig.TxtFuncMap()
defaultFuncMap["normalize"] = Normalize defaultFuncMap["normalize"] = Normalize
@ -377,7 +407,7 @@ func MakeDefaultRuleTemplate(defaultRule string, funcMap template.FuncMap) (*tem
return template.New("defaultRule").Funcs(defaultFuncMap).Parse(defaultRule) return template.New("defaultRule").Funcs(defaultFuncMap).Parse(defaultRule)
} }
// BuildTCPRouterConfiguration Builds a router configuration. // BuildTCPRouterConfiguration builds a router configuration.
func BuildTCPRouterConfiguration(ctx context.Context, configuration *dynamic.TCPConfiguration) { func BuildTCPRouterConfiguration(ctx context.Context, configuration *dynamic.TCPConfiguration) {
for routerName, router := range configuration.Routers { for routerName, router := range configuration.Routers {
loggerRouter := log.Ctx(ctx).With().Str(logs.RouterName, routerName).Logger() loggerRouter := log.Ctx(ctx).With().Str(logs.RouterName, routerName).Logger()
@ -403,7 +433,7 @@ func BuildTCPRouterConfiguration(ctx context.Context, configuration *dynamic.TCP
} }
} }
// BuildUDPRouterConfiguration Builds a router configuration. // BuildUDPRouterConfiguration builds a router configuration.
func BuildUDPRouterConfiguration(ctx context.Context, configuration *dynamic.UDPConfiguration) { func BuildUDPRouterConfiguration(ctx context.Context, configuration *dynamic.UDPConfiguration) {
for routerName, router := range configuration.Routers { for routerName, router := range configuration.Routers {
loggerRouter := log.Ctx(ctx).With().Str(logs.RouterName, routerName).Logger() loggerRouter := log.Ctx(ctx).With().Str(logs.RouterName, routerName).Logger()
@ -426,7 +456,7 @@ func BuildUDPRouterConfiguration(ctx context.Context, configuration *dynamic.UDP
} }
} }
// BuildRouterConfiguration Builds a router configuration. // BuildRouterConfiguration builds a router configuration.
func BuildRouterConfiguration(ctx context.Context, configuration *dynamic.HTTPConfiguration, defaultRouterName string, defaultRuleTpl *template.Template, model interface{}) { func BuildRouterConfiguration(ctx context.Context, configuration *dynamic.HTTPConfiguration, defaultRouterName string, defaultRuleTpl *template.Template, model interface{}) {
if len(configuration.Routers) == 0 { if len(configuration.Routers) == 0 {
if len(configuration.Services) > 1 { if len(configuration.Services) > 1 {
@ -474,7 +504,7 @@ func BuildRouterConfiguration(ctx context.Context, configuration *dynamic.HTTPCo
} }
} }
// Normalize Replace all special chars with `-`. // Normalize replaces all special chars with `-`.
func Normalize(name string) string { func Normalize(name string) string {
fargs := func(c rune) bool { fargs := func(c rune) bool {
return !unicode.IsLetter(c) && !unicode.IsNumber(c) return !unicode.IsLetter(c) && !unicode.IsNumber(c)

View file

@ -3,6 +3,7 @@ package constraints
import ( import (
"errors" "errors"
"regexp" "regexp"
"slices"
"github.com/vulcand/predicate" "github.com/vulcand/predicate"
) )
@ -47,12 +48,7 @@ func MatchTags(tags []string, expr string) (bool, error) {
func tagFn(name string) constraintTagFunc { func tagFn(name string) constraintTagFunc {
return func(tags []string) bool { return func(tags []string) bool {
for _, tag := range tags { return slices.Contains(tags, name)
if tag == name {
return true
}
}
return false
} }
} }
@ -63,13 +59,9 @@ func tagRegexFn(expr string) constraintTagFunc {
return false return false
} }
for _, tag := range tags { return slices.ContainsFunc(tags, func(tag string) bool {
if exp.MatchString(tag) { return exp.MatchString(tag)
return true })
}
}
return false
} }
} }

View file

@ -76,6 +76,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -131,6 +134,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -178,6 +184,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -225,6 +234,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -278,6 +290,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
} }
@ -299,7 +314,7 @@ func TestDefaultRule(t *testing.T) {
err := p.Init() err := p.Init()
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < len(test.items); i++ { for i := range len(test.items) {
var err error var err error
test.items[i].ExtraConf, err = p.getExtraConf(test.items[i].Labels) test.items[i].ExtraConf, err = p.getExtraConf(test.items[i].Labels)
require.NoError(t, err) require.NoError(t, err)
@ -370,6 +385,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -444,6 +462,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
}, },
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -535,6 +556,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
}, },
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -614,6 +638,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -678,6 +705,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -739,6 +769,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -803,6 +836,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -856,6 +892,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -910,6 +949,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -962,6 +1004,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1015,6 +1060,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1077,6 +1125,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1125,6 +1176,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1184,6 +1238,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1250,6 +1307,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1309,6 +1369,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1380,6 +1443,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1445,6 +1511,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1526,6 +1595,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1587,6 +1659,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1662,6 +1737,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1729,6 +1807,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1782,6 +1863,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1836,6 +1920,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1897,6 +1984,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1928,6 +2018,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1960,6 +2053,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1992,6 +2088,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2024,6 +2123,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2058,6 +2160,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2112,6 +2217,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2176,6 +2284,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2233,6 +2344,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2307,6 +2421,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2355,6 +2472,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2398,6 +2518,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2451,6 +2574,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2500,6 +2626,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2591,6 +2720,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2679,6 +2811,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2722,6 +2857,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2765,6 +2903,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2809,6 +2950,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2915,6 +3059,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
}, },
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2990,6 +3137,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3065,6 +3215,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3117,6 +3270,78 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
},
},
{
desc: "one container with default generated certificate labels",
items: []itemData{
{
ID: "Test",
Node: "Node1",
Name: "dev/Test",
Labels: map[string]string{
"traefik.tls.stores.default.defaultgeneratedcert.resolver": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.main": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.sans": "foobar, fiibar",
},
Address: "127.0.0.1",
Port: "80",
Status: api.HealthPassing,
},
},
expected: &dynamic.Configuration{
TCP: &dynamic.TCPConfiguration{
Routers: map[string]*dynamic.TCPRouter{},
Middlewares: map[string]*dynamic.TCPMiddleware{},
Services: map[string]*dynamic.TCPService{},
ServersTransports: map[string]*dynamic.TCPServersTransport{},
},
UDP: &dynamic.UDPConfiguration{
Routers: map[string]*dynamic.UDPRouter{},
Services: map[string]*dynamic.UDPService{},
},
HTTP: &dynamic.HTTPConfiguration{
Routers: map[string]*dynamic.Router{
"dev-Test": {
Service: "dev-Test",
Rule: "Host(`dev-Test.traefik.wtf`)",
DefaultRule: true,
},
},
Middlewares: map[string]*dynamic.Middleware{},
Services: map[string]*dynamic.Service{
"dev-Test": {
LoadBalancer: &dynamic.ServersLoadBalancer{
Servers: []dynamic.Server{
{
URL: "http://127.0.0.1:80",
},
},
PassHostHeader: Bool(true),
ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond),
},
},
},
},
ServersTransports: map[string]*dynamic.ServersTransport{},
},
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{
"default": {
DefaultGeneratedCert: &tls.GeneratedCert{
Resolver: "foobar",
Domain: &types.Domain{
Main: "foobar",
SANs: []string{"foobar", "fiibar"},
},
},
},
},
},
}, },
}, },
} }
@ -3141,7 +3366,7 @@ func Test_buildConfiguration(t *testing.T) {
err := p.Init() err := p.Init()
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < len(test.items); i++ { for i := range len(test.items) {
var err error var err error
test.items[i].ExtraConf, err = p.getExtraConf(test.items[i].Labels) test.items[i].ExtraConf, err = p.getExtraConf(test.items[i].Labels)
require.NoError(t, err) require.NoError(t, err)
@ -3297,6 +3522,9 @@ func TestFilterHealthStatuses(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3331,6 +3559,9 @@ func TestFilterHealthStatuses(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3394,6 +3625,9 @@ func TestFilterHealthStatuses(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3484,6 +3718,9 @@ func TestFilterHealthStatuses(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3619,6 +3856,9 @@ func TestFilterHealthStatuses(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
} }

View file

@ -13,6 +13,8 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
ptypes "github.com/traefik/paerser/types" ptypes "github.com/traefik/paerser/types"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/tls"
"github.com/traefik/traefik/v3/pkg/types"
) )
func TestDynConfBuilder_DefaultRule(t *testing.T) { func TestDynConfBuilder_DefaultRule(t *testing.T) {
@ -80,6 +82,9 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -140,6 +145,9 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -202,6 +210,9 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -256,6 +267,9 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -310,6 +324,9 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -370,6 +387,9 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
} }
@ -389,7 +409,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
err := p.Init() err := p.Init()
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < len(test.containers); i++ { for i := range len(test.containers) {
var err error var err error
test.containers[i].ExtraConf, err = p.extractLabels(test.containers[i]) test.containers[i].ExtraConf, err = p.extractLabels(test.containers[i])
require.NoError(t, err) require.NoError(t, err)
@ -452,6 +472,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -493,6 +516,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -534,6 +560,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -593,6 +622,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -686,6 +718,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -766,6 +801,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -827,6 +865,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -889,6 +930,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -949,6 +993,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1010,6 +1057,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1080,6 +1130,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1141,6 +1194,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1208,6 +1264,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1294,6 +1353,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1378,6 +1440,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1445,6 +1510,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1535,6 +1603,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1619,6 +1690,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1725,6 +1799,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1803,6 +1880,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1903,6 +1983,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1986,6 +2069,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2072,6 +2158,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2133,6 +2222,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2195,6 +2287,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2264,6 +2359,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2301,6 +2399,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2340,6 +2441,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2381,6 +2485,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2409,6 +2516,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2453,6 +2563,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2484,6 +2597,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2525,6 +2641,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2556,6 +2675,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2596,6 +2718,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2638,6 +2763,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2700,6 +2828,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2772,6 +2903,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2837,6 +2971,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2895,6 +3032,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2951,6 +3091,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3002,6 +3145,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3063,6 +3209,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3120,6 +3269,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3225,6 +3377,9 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3276,6 +3431,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3328,6 +3486,9 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3397,6 +3558,92 @@ func TestDynConfBuilder_build(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
},
},
{
desc: "one container with default generated certificate labels",
containers: []dockerData{
{
ServiceName: "Test",
Name: "Test",
Labels: map[string]string{
"traefik.tls.stores.default.defaultgeneratedcert.resolver": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.main": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.sans": "foobar, fiibar",
},
NetworkSettings: networkSettings{
Ports: nat.PortMap{
nat.Port("79/tcp"): []nat.PortBinding{{
HostIP: "192.168.0.1",
HostPort: "8080",
}},
nat.Port("80/tcp"): []nat.PortBinding{{
HostIP: "192.168.0.1",
HostPort: "8081",
}},
},
Networks: map[string]*networkData{
"bridge": {
Name: "bridge",
Addr: "127.0.0.1",
},
},
},
},
},
expected: &dynamic.Configuration{
HTTP: &dynamic.HTTPConfiguration{
Routers: map[string]*dynamic.Router{
"Test": {
Service: "Test",
Rule: "Host(`Test.traefik.wtf`)",
DefaultRule: true,
},
},
Middlewares: map[string]*dynamic.Middleware{},
Services: map[string]*dynamic.Service{
"Test": {
LoadBalancer: &dynamic.ServersLoadBalancer{
Servers: []dynamic.Server{
{
URL: "http://127.0.0.1:79",
},
},
PassHostHeader: Bool(true),
ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond),
},
},
},
},
ServersTransports: map[string]*dynamic.ServersTransport{},
},
TCP: &dynamic.TCPConfiguration{
Routers: map[string]*dynamic.TCPRouter{},
Middlewares: map[string]*dynamic.TCPMiddleware{},
Services: map[string]*dynamic.TCPService{},
ServersTransports: map[string]*dynamic.TCPServersTransport{},
},
UDP: &dynamic.UDPConfiguration{
Routers: map[string]*dynamic.UDPRouter{},
Services: map[string]*dynamic.UDPService{},
},
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{
"default": {
DefaultGeneratedCert: &tls.GeneratedCert{
Resolver: "foobar",
Domain: &types.Domain{
Main: "foobar",
SANs: []string{"foobar", "fiibar"},
},
},
},
},
},
}, },
}, },
} }
@ -3420,7 +3667,7 @@ func TestDynConfBuilder_build(t *testing.T) {
err := p.Init() err := p.Init()
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < len(test.containers); i++ { for i := range len(test.containers) {
var err error var err error
test.containers[i].ExtraConf, err = p.extractLabels(test.containers[i]) test.containers[i].ExtraConf, err = p.extractLabels(test.containers[i])
require.NoError(t, err) require.NoError(t, err)

View file

@ -10,6 +10,8 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
ptypes "github.com/traefik/paerser/types" ptypes "github.com/traefik/paerser/types"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/tls"
"github.com/traefik/traefik/v3/pkg/types"
) )
func Int(v int) *int { return &v } func Int(v int) *int { return &v }
@ -76,6 +78,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -131,6 +136,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -188,6 +196,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -237,6 +248,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -286,6 +300,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -341,6 +358,9 @@ func TestDefaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
} }
@ -359,7 +379,7 @@ func TestDefaultRule(t *testing.T) {
err := p.Init() err := p.Init()
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < len(test.instances); i++ { for i := range len(test.instances) {
var err error var err error
test.instances[i].ExtraConf, err = p.getConfiguration(test.instances[i]) test.instances[i].ExtraConf, err = p.getConfiguration(test.instances[i])
require.NoError(t, err) require.NoError(t, err)
@ -413,6 +433,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -449,6 +472,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -485,6 +511,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -539,6 +568,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -622,6 +654,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -692,6 +727,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -748,6 +786,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -805,6 +846,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -860,6 +904,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -916,6 +963,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -981,6 +1031,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1037,6 +1090,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1094,6 +1150,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1165,6 +1224,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1239,6 +1301,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1301,6 +1366,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1381,6 +1449,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1455,6 +1526,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1546,6 +1620,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1614,6 +1691,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1699,6 +1779,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1773,6 +1856,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1849,6 +1935,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1905,6 +1994,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1962,6 +2054,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2019,6 +2114,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2097,6 +2195,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2161,6 +2262,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2193,6 +2297,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2227,6 +2334,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2263,6 +2373,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2300,6 +2413,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2336,6 +2452,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2373,6 +2492,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2430,6 +2552,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2497,6 +2622,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2557,6 +2685,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2610,6 +2741,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2661,6 +2795,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2707,6 +2844,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2763,6 +2903,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2815,6 +2958,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2910,6 +3056,9 @@ func Test_buildConfiguration(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2956,6 +3105,9 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -3003,6 +3155,80 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
},
},
{
desc: "one container with default generated certificate",
containers: []ecsInstance{
instance(
name("Test"),
labels(map[string]string{
"traefik.tls.stores.default.defaultgeneratedcert.resolver": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.main": "foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.sans": "foobar, fiibar",
}),
iMachine(
mState(ec2.InstanceStateNameRunning),
mPrivateIP("127.0.0.1"),
mPorts(
mPort(0, 80, "tcp"),
),
),
),
},
expected: &dynamic.Configuration{
TCP: &dynamic.TCPConfiguration{
Routers: map[string]*dynamic.TCPRouter{},
Middlewares: map[string]*dynamic.TCPMiddleware{},
Services: map[string]*dynamic.TCPService{},
ServersTransports: map[string]*dynamic.TCPServersTransport{},
},
UDP: &dynamic.UDPConfiguration{
Routers: map[string]*dynamic.UDPRouter{},
Services: map[string]*dynamic.UDPService{},
},
HTTP: &dynamic.HTTPConfiguration{
Routers: map[string]*dynamic.Router{
"Test": {
Service: "Test",
Rule: "Host(`Test.traefik.wtf`)",
DefaultRule: true,
},
},
Middlewares: map[string]*dynamic.Middleware{},
Services: map[string]*dynamic.Service{
"Test": {
LoadBalancer: &dynamic.ServersLoadBalancer{
Servers: []dynamic.Server{
{
URL: "http://127.0.0.1:80",
},
},
PassHostHeader: Bool(true),
ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond),
},
},
},
},
ServersTransports: map[string]*dynamic.ServersTransport{},
},
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{
"default": {
DefaultGeneratedCert: &tls.GeneratedCert{
Resolver: "foobar",
Domain: &types.Domain{
Main: "foobar",
SANs: []string{"foobar", "fiibar"},
},
},
},
},
},
}, },
}, },
} }
@ -3022,7 +3248,7 @@ func Test_buildConfiguration(t *testing.T) {
err := p.Init() err := p.Init()
require.NoError(t, err) require.NoError(t, err)
for i := 0; i < len(test.containers); i++ { for i := range len(test.containers) {
var err error var err error
test.containers[i].ExtraConf, err = p.getConfiguration(test.containers[i]) test.containers[i].ExtraConf, err = p.getConfiguration(test.containers[i])
require.NoError(t, err) require.NoError(t, err)

View file

@ -402,7 +402,7 @@ func (p *Provider) listInstances(ctx context.Context, client *awsClient) ([]ecsI
} }
func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]*ecs.Task) (map[string]*ssm.InstanceInformation, error) { func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]*ecs.Task) (map[string]*ssm.InstanceInformation, error) {
instanceIds := make(map[string]string) instanceIDs := make(map[string]string)
miInstances := make(map[string]*ssm.InstanceInformation) miInstances := make(map[string]*ssm.InstanceInformation)
var containerInstancesArns []*string var containerInstancesArns []*string
@ -424,7 +424,7 @@ func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clu
} }
for _, container := range resp.ContainerInstances { for _, container := range resp.ContainerInstances {
instanceIds[aws.StringValue(container.Ec2InstanceId)] = aws.StringValue(container.ContainerInstanceArn) instanceIDs[aws.StringValue(container.Ec2InstanceId)] = aws.StringValue(container.ContainerInstanceArn)
// Disallow EC2 Instance IDs // Disallow EC2 Instance IDs
// This prevents considering EC2 instances in ECS // This prevents considering EC2 instances in ECS
@ -452,7 +452,7 @@ func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clu
if len(page.InstanceInformationList) > 0 { if len(page.InstanceInformationList) > 0 {
for _, i := range page.InstanceInformationList { for _, i := range page.InstanceInformationList {
if i.InstanceId != nil { if i.InstanceId != nil {
miInstances[instanceIds[aws.StringValue(i.InstanceId)]] = i miInstances[instanceIDs[aws.StringValue(i.InstanceId)]] = i
} }
} }
} }
@ -468,7 +468,7 @@ func (p *Provider) lookupMiInstances(ctx context.Context, client *awsClient, clu
} }
func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]*ecs.Task) (map[string]*ec2.Instance, error) { func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, clusterName *string, ecsDatas map[string]*ecs.Task) (map[string]*ec2.Instance, error) {
instanceIds := make(map[string]string) instanceIDs := make(map[string]string)
ec2Instances := make(map[string]*ec2.Instance) ec2Instances := make(map[string]*ec2.Instance)
var containerInstancesArns []*string var containerInstancesArns []*string
@ -490,7 +490,7 @@ func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, cl
} }
for _, container := range resp.ContainerInstances { for _, container := range resp.ContainerInstances {
instanceIds[aws.StringValue(container.Ec2InstanceId)] = aws.StringValue(container.ContainerInstanceArn) instanceIDs[aws.StringValue(container.Ec2InstanceId)] = aws.StringValue(container.ContainerInstanceArn)
// Disallow Instance IDs of the form mi-* // Disallow Instance IDs of the form mi-*
// This prevents considering external instances in ECS Anywhere setups // This prevents considering external instances in ECS Anywhere setups
// and getting InvalidInstanceID.Malformed error when calling the describe-instances endpoint. // and getting InvalidInstanceID.Malformed error when calling the describe-instances endpoint.
@ -513,7 +513,7 @@ func (p *Provider) lookupEc2Instances(ctx context.Context, client *awsClient, cl
for _, r := range page.Reservations { for _, r := range page.Reservations {
for _, i := range r.Instances { for _, i := range r.Instances {
if i.InstanceId != nil { if i.InstanceId != nil {
ec2Instances[instanceIds[aws.StringValue(i.InstanceId)]] = i ec2Instances[instanceIDs[aws.StringValue(i.InstanceId)]] = i
} }
} }
} }

View file

@ -73,7 +73,7 @@ func TestChunkIDs(t *testing.T) {
t.Parallel() t.Parallel()
var IDs []*string var IDs []*string
for v := 0; v < test.count; v++ { for range test.count {
IDs = append(IDs, aws.String("a")) IDs = append(IDs, aws.String("a"))
} }

View file

@ -6,6 +6,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
"slices"
"time" "time"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -469,12 +470,8 @@ func (c *clientWrapper) isWatchedNamespace(ns string) bool {
if c.isNamespaceAll { if c.isNamespaceAll {
return true return true
} }
for _, watchedNamespace := range c.watchedNamespaces {
if watchedNamespace == ns { return slices.Contains(c.watchedNamespaces, ns)
return true
}
}
return false
} }
// translateNotFoundError will translate a "not found" error to a boolean return // translateNotFoundError will translate a "not found" error to a boolean return

View file

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"os" "os"
"slices"
"time" "time"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -567,10 +568,6 @@ func (c *clientWrapper) isWatchedNamespace(ns string) bool {
if c.isNamespaceAll { if c.isNamespaceAll {
return true return true
} }
for _, watchedNamespace := range c.watchedNamespaces {
if watchedNamespace == ns { return slices.Contains(c.watchedNamespaces, ns)
return true
}
}
return false
} }

View file

@ -7,6 +7,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
"slices"
"time" "time"
"github.com/hashicorp/go-version" "github.com/hashicorp/go-version"
@ -394,12 +395,8 @@ func (c *clientWrapper) isWatchedNamespace(ns string) bool {
if c.isNamespaceAll { if c.isNamespaceAll {
return true return true
} }
for _, watchedNamespace := range c.watchedNamespaces {
if watchedNamespace == ns { return slices.Contains(c.watchedNamespaces, ns)
return true
}
}
return false
} }
// filterIngressClassByName return a slice containing ingressclasses with the correct name. // filterIngressClassByName return a slice containing ingressclasses with the correct name.

View file

@ -9,6 +9,7 @@ import (
"net" "net"
"os" "os"
"regexp" "regexp"
"slices"
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
@ -418,13 +419,9 @@ func (p *Provider) updateIngressStatus(ing *netv1.Ingress, k8sClient Client) err
func (p *Provider) shouldProcessIngress(ingress *netv1.Ingress, ingressClasses []*netv1.IngressClass) bool { func (p *Provider) shouldProcessIngress(ingress *netv1.Ingress, ingressClasses []*netv1.IngressClass) bool {
// configuration through the new kubernetes ingressClass // configuration through the new kubernetes ingressClass
if ingress.Spec.IngressClassName != nil { if ingress.Spec.IngressClassName != nil {
for _, ic := range ingressClasses { return slices.ContainsFunc(ingressClasses, func(ic *netv1.IngressClass) bool {
if *ingress.Spec.IngressClassName == ic.ObjectMeta.Name { return *ingress.Spec.IngressClassName == ic.ObjectMeta.Name
return true })
}
}
return false
} }
return p.IngressClass == ingress.Annotations[annotationKubernetesIngressClass] || return p.IngressClass == ingress.Annotations[annotationKubernetesIngressClass] ||

View file

@ -9,6 +9,8 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
ptypes "github.com/traefik/paerser/types" ptypes "github.com/traefik/paerser/types"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/tls"
"github.com/traefik/traefik/v3/pkg/types"
) )
func Test_defaultRule(t *testing.T) { func Test_defaultRule(t *testing.T) {
@ -68,6 +70,9 @@ func Test_defaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -123,6 +128,9 @@ func Test_defaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -169,6 +177,9 @@ func Test_defaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -221,6 +232,9 @@ func Test_defaultRule(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
} }
@ -296,6 +310,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -373,6 +390,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -437,6 +457,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -498,6 +521,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -562,6 +588,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -615,6 +644,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -669,6 +701,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -721,6 +756,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -774,6 +812,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -836,6 +877,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -885,6 +929,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -944,6 +991,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1010,6 +1060,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1069,6 +1122,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1141,6 +1197,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1207,6 +1266,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1267,6 +1329,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1332,6 +1397,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1385,6 +1453,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1439,6 +1510,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1500,6 +1574,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1531,6 +1608,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1563,6 +1643,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1596,6 +1679,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1630,6 +1716,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1684,6 +1773,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1748,6 +1840,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1805,6 +1900,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1855,6 +1953,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1903,6 +2004,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1946,6 +2050,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -1999,6 +2106,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2048,6 +2158,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2139,6 +2252,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2227,6 +2343,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2270,6 +2389,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2313,6 +2435,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2357,6 +2482,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2445,6 +2573,9 @@ func Test_buildConfig(t *testing.T) {
}, },
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2522,6 +2653,9 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
}, },
}, },
{ {
@ -2599,6 +2733,78 @@ func Test_buildConfig(t *testing.T) {
Services: map[string]*dynamic.Service{}, Services: map[string]*dynamic.Service{},
ServersTransports: map[string]*dynamic.ServersTransport{}, ServersTransports: map[string]*dynamic.ServersTransport{},
}, },
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{},
},
},
},
{
desc: "one service with default generated certificate tags",
items: []item{
{
ID: "id",
Node: "Node1",
Name: "dev/Test",
Address: "127.0.0.1",
Port: 9999,
ExtraConf: configuration{Enable: true},
Tags: []string{
"traefik.tls.stores.default.defaultgeneratedcert.resolver = foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.main = foobar",
"traefik.tls.stores.default.defaultgeneratedcert.domain.sans = foobar, fiibar",
},
},
},
expected: &dynamic.Configuration{
TCP: &dynamic.TCPConfiguration{
Routers: map[string]*dynamic.TCPRouter{},
Middlewares: map[string]*dynamic.TCPMiddleware{},
Services: map[string]*dynamic.TCPService{},
ServersTransports: map[string]*dynamic.TCPServersTransport{},
},
UDP: &dynamic.UDPConfiguration{
Routers: map[string]*dynamic.UDPRouter{},
Services: map[string]*dynamic.UDPService{},
},
HTTP: &dynamic.HTTPConfiguration{
Routers: map[string]*dynamic.Router{
"dev-Test": {
Service: "dev-Test",
Rule: "Host(`dev-Test.traefik.test`)",
DefaultRule: true,
},
},
Middlewares: map[string]*dynamic.Middleware{},
Services: map[string]*dynamic.Service{
"dev-Test": {
LoadBalancer: &dynamic.ServersLoadBalancer{
Servers: []dynamic.Server{
{
URL: "http://127.0.0.1:9999",
},
},
PassHostHeader: Bool(true),
ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond),
},
},
},
},
ServersTransports: map[string]*dynamic.ServersTransport{},
},
TLS: &dynamic.TLSConfiguration{
Stores: map[string]tls.Store{
"default": {
DefaultGeneratedCert: &tls.GeneratedCert{
Resolver: "foobar",
Domain: &types.Domain{
Main: "foobar",
SANs: []string{"foobar", "fiibar"},
},
},
},
},
},
}, },
}, },
} }

View file

@ -7,7 +7,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646 "priority": 9223372036854775806
}, },
"dashboard": { "dashboard": {
"entryPoints": [ "entryPoints": [
@ -19,7 +19,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645 "priority": 9223372036854775805
} }
}, },
"services": { "services": {

View file

@ -7,7 +7,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646 "priority": 9223372036854775806
} }
}, },
"services": { "services": {

View file

@ -7,7 +7,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/api`)", "rule": "PathPrefix(`/api`)",
"priority": 2147483646 "priority": 9223372036854775806
}, },
"dashboard": { "dashboard": {
"entryPoints": [ "entryPoints": [
@ -19,7 +19,7 @@
], ],
"service": "dashboard@internal", "service": "dashboard@internal",
"rule": "PathPrefix(`/`)", "rule": "PathPrefix(`/`)",
"priority": 2147483645 "priority": 9223372036854775805
}, },
"debug": { "debug": {
"entryPoints": [ "entryPoints": [
@ -27,7 +27,7 @@
], ],
"service": "api@internal", "service": "api@internal",
"rule": "PathPrefix(`/debug`)", "rule": "PathPrefix(`/debug`)",
"priority": 2147483646 "priority": 9223372036854775806
}, },
"ping": { "ping": {
"entryPoints": [ "entryPoints": [
@ -35,7 +35,7 @@
], ],
"service": "ping@internal", "service": "ping@internal",
"rule": "PathPrefix(`/ping`)", "rule": "PathPrefix(`/ping`)",
"priority": 2147483647 "priority": 9223372036854775807
}, },
"prometheus": { "prometheus": {
"entryPoints": [ "entryPoints": [
@ -43,7 +43,7 @@
], ],
"service": "prometheus@internal", "service": "prometheus@internal",
"rule": "PathPrefix(`/metrics`)", "rule": "PathPrefix(`/metrics`)",
"priority": 2147483647 "priority": 9223372036854775807
}, },
"rest": { "rest": {
"entryPoints": [ "entryPoints": [
@ -51,7 +51,7 @@
], ],
"service": "rest@internal", "service": "rest@internal",
"rule": "PathPrefix(`/api/providers`)", "rule": "PathPrefix(`/api/providers`)",
"priority": 2147483647 "priority": 9223372036854775807
} }
}, },
"services": { "services": {

View file

@ -7,7 +7,7 @@
], ],
"service": "ping@internal", "service": "ping@internal",
"rule": "PathPrefix(`/ping`)", "rule": "PathPrefix(`/ping`)",
"priority": 2147483647 "priority": 9223372036854775807
} }
}, },
"services": { "services": {

View file

@ -7,7 +7,7 @@
], ],
"service": "prometheus@internal", "service": "prometheus@internal",
"rule": "PathPrefix(`/metrics`)", "rule": "PathPrefix(`/metrics`)",
"priority": 2147483647 "priority": 9223372036854775807
} }
}, },
"services": { "services": {

View file

@ -7,7 +7,7 @@
], ],
"service": "rest@internal", "service": "rest@internal",
"rule": "PathPrefix(`/api/providers`)", "rule": "PathPrefix(`/api/providers`)",
"priority": 2147483647 "priority": 9223372036854775807
} }
}, },
"services": { "services": {

View file

@ -108,7 +108,7 @@ func (i *Provider) acme(cfg *dynamic.Configuration) {
Rule: "PathPrefix(`/.well-known/acme-challenge/`)", Rule: "PathPrefix(`/.well-known/acme-challenge/`)",
EntryPoints: eps, EntryPoints: eps,
Service: "acme-http@internal", Service: "acme-http@internal",
Priority: math.MaxInt32, Priority: math.MaxInt,
} }
cfg.HTTP.Routers["acme-http"] = rt cfg.HTTP.Routers["acme-http"] = rt
@ -239,7 +239,7 @@ func (i *Provider) apiConfiguration(cfg *dynamic.Configuration) {
cfg.HTTP.Routers["api"] = &dynamic.Router{ cfg.HTTP.Routers["api"] = &dynamic.Router{
EntryPoints: []string{defaultInternalEntryPointName}, EntryPoints: []string{defaultInternalEntryPointName},
Service: "api@internal", Service: "api@internal",
Priority: math.MaxInt32 - 1, Priority: math.MaxInt - 1,
Rule: "PathPrefix(`/api`)", Rule: "PathPrefix(`/api`)",
} }
@ -247,7 +247,7 @@ func (i *Provider) apiConfiguration(cfg *dynamic.Configuration) {
cfg.HTTP.Routers["dashboard"] = &dynamic.Router{ cfg.HTTP.Routers["dashboard"] = &dynamic.Router{
EntryPoints: []string{defaultInternalEntryPointName}, EntryPoints: []string{defaultInternalEntryPointName},
Service: "dashboard@internal", Service: "dashboard@internal",
Priority: math.MaxInt32 - 2, Priority: math.MaxInt - 2,
Rule: "PathPrefix(`/`)", Rule: "PathPrefix(`/`)",
Middlewares: []string{"dashboard_redirect@internal", "dashboard_stripprefix@internal"}, Middlewares: []string{"dashboard_redirect@internal", "dashboard_stripprefix@internal"},
} }
@ -268,7 +268,7 @@ func (i *Provider) apiConfiguration(cfg *dynamic.Configuration) {
cfg.HTTP.Routers["debug"] = &dynamic.Router{ cfg.HTTP.Routers["debug"] = &dynamic.Router{
EntryPoints: []string{defaultInternalEntryPointName}, EntryPoints: []string{defaultInternalEntryPointName},
Service: "api@internal", Service: "api@internal",
Priority: math.MaxInt32 - 1, Priority: math.MaxInt - 1,
Rule: "PathPrefix(`/debug`)", Rule: "PathPrefix(`/debug`)",
} }
} }
@ -290,7 +290,7 @@ func (i *Provider) pingConfiguration(cfg *dynamic.Configuration) {
cfg.HTTP.Routers["ping"] = &dynamic.Router{ cfg.HTTP.Routers["ping"] = &dynamic.Router{
EntryPoints: []string{i.staticCfg.Ping.EntryPoint}, EntryPoints: []string{i.staticCfg.Ping.EntryPoint},
Service: "ping@internal", Service: "ping@internal",
Priority: math.MaxInt32, Priority: math.MaxInt,
Rule: "PathPrefix(`/ping`)", Rule: "PathPrefix(`/ping`)",
} }
} }
@ -307,7 +307,7 @@ func (i *Provider) restConfiguration(cfg *dynamic.Configuration) {
cfg.HTTP.Routers["rest"] = &dynamic.Router{ cfg.HTTP.Routers["rest"] = &dynamic.Router{
EntryPoints: []string{defaultInternalEntryPointName}, EntryPoints: []string{defaultInternalEntryPointName},
Service: "rest@internal", Service: "rest@internal",
Priority: math.MaxInt32, Priority: math.MaxInt,
Rule: "PathPrefix(`/api/providers`)", Rule: "PathPrefix(`/api/providers`)",
} }
} }
@ -324,7 +324,7 @@ func (i *Provider) prometheusConfiguration(cfg *dynamic.Configuration) {
cfg.HTTP.Routers["prometheus"] = &dynamic.Router{ cfg.HTTP.Routers["prometheus"] = &dynamic.Router{
EntryPoints: []string{i.staticCfg.Metrics.Prometheus.EntryPoint}, EntryPoints: []string{i.staticCfg.Metrics.Prometheus.EntryPoint},
Service: "prometheus@internal", Service: "prometheus@internal",
Priority: math.MaxInt32, Priority: math.MaxInt,
Rule: "PathPrefix(`/metrics`)", Rule: "PathPrefix(`/metrics`)",
} }
} }

View file

@ -83,7 +83,7 @@ func doOnStruct(field reflect.Value, tag string, redactByDefault bool) error {
} }
} }
case reflect.Struct: case reflect.Struct:
for i := 0; i < field.NumField(); i++ { for i := range field.NumField() {
fld := field.Field(i) fld := field.Field(i)
stField := field.Type().Field(i) stField := field.Type().Field(i)
if !isExported(stField) { if !isExported(stField) {
@ -138,7 +138,7 @@ func doOnStruct(field reflect.Value, tag string, redactByDefault bool) error {
} }
} }
case reflect.Slice: case reflect.Slice:
for j := 0; j < field.Len(); j++ { for j := range field.Len() {
if err := doOnStruct(field.Index(j), tag, redactByDefault); err != nil { if err := doOnStruct(field.Index(j), tag, redactByDefault); err != nil {
return err return err
} }
@ -179,7 +179,7 @@ func reset(field reflect.Value, name string) error {
switch field.Type().Elem().Kind() { switch field.Type().Elem().Kind() {
case reflect.String: case reflect.String:
slice := reflect.MakeSlice(field.Type(), field.Len(), field.Len()) slice := reflect.MakeSlice(field.Type(), field.Len(), field.Len())
for j := 0; j < field.Len(); j++ { for j := range field.Len() {
slice.Index(j).SetString(maskShort) slice.Index(j).SetString(maskShort)
} }
field.Set(slice) field.Set(slice)

View file

@ -1,6 +1,8 @@
package server package server
import ( import (
"slices"
"github.com/go-acme/lego/v4/challenge/tlsalpn01" "github.com/go-acme/lego/v4/challenge/tlsalpn01"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
@ -98,7 +100,7 @@ func mergeConfiguration(configurations dynamic.Configurations, defaultEntryPoint
if configuration.TLS != nil { if configuration.TLS != nil {
for _, cert := range configuration.TLS.Certificates { for _, cert := range configuration.TLS.Certificates {
if containsACMETLS1(cert.Stores) && pvd != "tlsalpn.acme" { if slices.Contains(cert.Stores, tlsalpn01.ACMETLS1Protocol) && pvd != "tlsalpn.acme" {
continue continue
} }
@ -127,14 +129,14 @@ func mergeConfiguration(configurations dynamic.Configurations, defaultEntryPoint
} }
if len(defaultTLSStoreProviders) > 1 { if len(defaultTLSStoreProviders) > 1 {
log.Error().Msgf("Default TLS Stores defined multiple times in %v", defaultTLSOptionProviders) log.Error().Msgf("Default TLS Store defined in multiple providers: %v", defaultTLSStoreProviders)
delete(conf.TLS.Stores, tls.DefaultTLSStoreName) delete(conf.TLS.Stores, tls.DefaultTLSStoreName)
} }
if len(defaultTLSOptionProviders) == 0 { if len(defaultTLSOptionProviders) == 0 {
conf.TLS.Options[tls.DefaultTLSConfigName] = tls.DefaultTLSOptions conf.TLS.Options[tls.DefaultTLSConfigName] = tls.DefaultTLSOptions
} else if len(defaultTLSOptionProviders) > 1 { } else if len(defaultTLSOptionProviders) > 1 {
log.Error().Msgf("Default TLS Options defined multiple times in %v", defaultTLSOptionProviders) log.Error().Msgf("Default TLS Options defined in multiple providers %v", defaultTLSOptionProviders)
// We do not set an empty tls.TLS{} as above so that we actually get a "cascading failure" later on, // We do not set an empty tls.TLS{} as above so that we actually get a "cascading failure" later on,
// i.e. routers depending on this missing TLS option will fail to initialize as well. // i.e. routers depending on this missing TLS option will fail to initialize as well.
delete(conf.TLS.Options, tls.DefaultTLSConfigName) delete(conf.TLS.Options, tls.DefaultTLSConfigName)
@ -212,13 +214,3 @@ func applyModel(cfg dynamic.Configuration) dynamic.Configuration {
return cfg return cfg
} }
func containsACMETLS1(stores []string) bool {
for _, store := range stores {
if store == tlsalpn01.ACMETLS1Protocol {
return true
}
}
return false
}

View file

@ -311,7 +311,7 @@ func TestListenProvidersThrottleProviderConfigReload(t *testing.T) {
throttleDuration: 30 * time.Millisecond, throttleDuration: 30 * time.Millisecond,
} }
for i := 0; i < 5; i++ { for i := range 5 {
pvd.messages = append(pvd.messages, dynamic.Message{ pvd.messages = append(pvd.messages, dynamic.Message{
ProviderName: "mock", ProviderName: "mock",
Configuration: &dynamic.Configuration{ Configuration: &dynamic.Configuration{

View file

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"reflect" "reflect"
"slices"
"strings" "strings"
"github.com/containous/alice" "github.com/containous/alice"
@ -99,7 +100,7 @@ func checkRecursion(ctx context.Context, middlewareName string) (context.Context
if !ok { if !ok {
currentStack = []string{} currentStack = []string{}
} }
if inSlice(middlewareName, currentStack) { if slices.Contains(currentStack, middlewareName) {
return ctx, fmt.Errorf("could not instantiate middleware %s: recursion detected in %s", middlewareName, strings.Join(append(currentStack, middlewareName), "->")) return ctx, fmt.Errorf("could not instantiate middleware %s: recursion detected in %s", middlewareName, strings.Join(append(currentStack, middlewareName), "->"))
} }
return context.WithValue(ctx, middlewareStackKey, append(currentStack, middlewareName)), nil return context.WithValue(ctx, middlewareStackKey, append(currentStack, middlewareName)), nil
@ -392,12 +393,3 @@ func (b *Builder) buildConstructor(ctx context.Context, middlewareName string) (
// this would not enable tracing. // this would not enable tracing.
return observability.WrapMiddleware(ctx, middleware), nil return observability.WrapMiddleware(ctx, middleware), nil
} }
func inSlice(element string, stack []string) bool {
for _, value := range stack {
if value == element {
return true
}
}
return false
}

View file

@ -3,6 +3,7 @@ package tcpmiddleware
import ( import (
"context" "context"
"fmt" "fmt"
"slices"
"strings" "strings"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -74,7 +75,7 @@ func checkRecursion(ctx context.Context, middlewareName string) (context.Context
currentStack = []string{} currentStack = []string{}
} }
if inSlice(middlewareName, currentStack) { if slices.Contains(currentStack, middlewareName) {
return ctx, fmt.Errorf("could not instantiate middleware %s: recursion detected in %s", middlewareName, strings.Join(append(currentStack, middlewareName), "->")) return ctx, fmt.Errorf("could not instantiate middleware %s: recursion detected in %s", middlewareName, strings.Join(append(currentStack, middlewareName), "->"))
} }
@ -118,12 +119,3 @@ func (b *Builder) buildConstructor(ctx context.Context, middlewareName string) (
return middleware, nil return middleware, nil
} }
func inSlice(element string, stack []string) bool {
for _, value := range stack {
if value == element {
return true
}
}
return false
}

View file

@ -817,7 +817,7 @@ func BenchmarkRouterServe(b *testing.B) {
reqHost := requestdecorator.New(nil) reqHost := requestdecorator.New(nil)
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for range b.N {
reqHost.ServeHTTP(w, req, handlers["web"].ServeHTTP) reqHost.ServeHTTP(w, req, handlers["web"].ServeHTTP)
} }
} }
@ -852,7 +852,7 @@ func BenchmarkService(b *testing.B) {
handler, _ := serviceManager.BuildHTTP(context.Background(), "foo-service") handler, _ := serviceManager.BuildHTTP(context.Background(), "foo-service")
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for range b.N {
handler.ServeHTTP(w, req) handler.ServeHTTP(w, req)
} }
} }

View file

@ -112,7 +112,7 @@ func testShutdown(t *testing.T, router *tcprouter.Router) {
// but technically also as early as the Shutdown has closed the listener, // but technically also as early as the Shutdown has closed the listener,
// i.e. during the shutdown and before the gracetime is over. // i.e. during the shutdown and before the gracetime is over.
var testOk bool var testOk bool
for i := 0; i < 10; i++ { for range 10 {
loopConn, err := net.Dial("tcp", epAddr) loopConn, err := net.Dial("tcp", epAddr)
if err == nil { if err == nil {
loopConn.Close() loopConn.Close()
@ -141,7 +141,7 @@ func startEntrypoint(entryPoint *TCPEntryPoint, router *tcprouter.Router) (net.C
entryPoint.SwitchRouter(router) entryPoint.SwitchRouter(router)
for i := 0; i < 10; i++ { for range 10 {
conn, err := net.Dial("tcp", entryPoint.listener.Addr().String()) conn, err := net.Dial("tcp", entryPoint.listener.Addr().String())
if err != nil { if err != nil {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)

View file

@ -32,7 +32,7 @@ func TestMirroringOn100(t *testing.T) {
}), 50) }), 50)
assert.NoError(t, err) assert.NoError(t, err)
for i := 0; i < 100; i++ { for range 100 {
mirror.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest(http.MethodGet, "/", nil)) mirror.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest(http.MethodGet, "/", nil))
} }
@ -61,7 +61,7 @@ func TestMirroringOn10(t *testing.T) {
}), 50) }), 50)
assert.NoError(t, err) assert.NoError(t, err)
for i := 0; i < 10; i++ { for range 10 {
mirror.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest(http.MethodGet, "/", nil)) mirror.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest(http.MethodGet, "/", nil))
} }
@ -156,7 +156,7 @@ func TestMirroringWithBody(t *testing.T) {
mirror := New(handler, pool, defaultMaxBodySize, nil) mirror := New(handler, pool, defaultMaxBodySize, nil)
for i := 0; i < numMirrors; i++ { for range numMirrors {
err := mirror.AddMirror(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { err := mirror.AddMirror(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
assert.NotNil(t, r.Body) assert.NotNil(t, r.Body)
bb, err := io.ReadAll(r.Body) bb, err := io.ReadAll(r.Body)

View file

@ -24,7 +24,7 @@ func TestBalancer(t *testing.T) {
}), Int(1)) }), Int(1))
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 4; i++ { for range 4 {
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
@ -52,7 +52,7 @@ func TestBalancerOneServerZeroWeight(t *testing.T) {
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), Int(0)) balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), Int(0))
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 3; i++ { for range 3 {
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
@ -97,7 +97,7 @@ func TestBalancerOneServerDown(t *testing.T) {
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false)
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 3; i++ { for range 3 {
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
@ -119,14 +119,14 @@ func TestBalancerDownThenUp(t *testing.T) {
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false)
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 3; i++ { for range 3 {
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
assert.Equal(t, 3, recorder.save["first"]) assert.Equal(t, 3, recorder.save["first"])
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", true) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", true)
recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 2; i++ { for range 2 {
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
assert.Equal(t, 1, recorder.save["first"]) assert.Equal(t, 1, recorder.save["first"])
@ -168,7 +168,7 @@ func TestBalancerPropagate(t *testing.T) {
}) })
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 8; i++ { for range 8 {
topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
assert.Equal(t, 2, recorder.save["first"]) assert.Equal(t, 2, recorder.save["first"])
@ -181,7 +181,7 @@ func TestBalancerPropagate(t *testing.T) {
// fourth gets downed, but balancer2 still up since third is still up. // fourth gets downed, but balancer2 still up since third is still up.
balancer2.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "fourth", false) balancer2.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "fourth", false)
recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 8; i++ { for range 8 {
topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
assert.Equal(t, 2, recorder.save["first"]) assert.Equal(t, 2, recorder.save["first"])
@ -195,7 +195,7 @@ func TestBalancerPropagate(t *testing.T) {
// down as well for topBalancer. // down as well for topBalancer.
balancer2.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "third", false) balancer2.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "third", false)
recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 8; i++ { for range 8 {
topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }
assert.Equal(t, 4, recorder.save["first"]) assert.Equal(t, 4, recorder.save["first"])
@ -246,7 +246,7 @@ func TestSticky(t *testing.T) {
} }
req := httptest.NewRequest(http.MethodGet, "/", nil) req := httptest.NewRequest(http.MethodGet, "/", nil)
for i := 0; i < 3; i++ { for range 3 {
for _, cookie := range recorder.Result().Cookies() { for _, cookie := range recorder.Result().Cookies() {
assert.NotContains(t, "test=first", cookie.Value) assert.NotContains(t, "test=first", cookie.Value)
assert.NotContains(t, "test=second", cookie.Value) assert.NotContains(t, "test=second", cookie.Value)
@ -284,7 +284,7 @@ func TestSticky_FallBack(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/", nil) req := httptest.NewRequest(http.MethodGet, "/", nil)
req.AddCookie(&http.Cookie{Name: "test", Value: "second"}) req.AddCookie(&http.Cookie{Name: "test", Value: "second"})
for i := 0; i < 3; i++ { for range 3 {
recorder.ResponseRecorder = httptest.NewRecorder() recorder.ResponseRecorder = httptest.NewRecorder()
balancer.ServeHTTP(recorder, req) balancer.ServeHTTP(recorder, req)
@ -311,7 +311,7 @@ func TestBalancerBias(t *testing.T) {
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for i := 0; i < 14; i++ { for range 14 {
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
} }

View file

@ -31,7 +31,7 @@ func BenchmarkProxy(b *testing.B) {
handler := buildSingleHostProxy(req.URL, false, 0, &staticTransport{res}, pool) handler := buildSingleHostProxy(req.URL, false, 0, &staticTransport{res}, pool)
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for range b.N {
handler.ServeHTTP(w, req) handler.ServeHTTP(w, req)
} }
} }

View file

@ -9,6 +9,7 @@ import (
"net" "net"
"net/http" "net/http"
"reflect" "reflect"
"slices"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -241,12 +242,9 @@ func (k *KerberosRoundTripper) RoundTrip(request *http.Request) (*http.Response,
} }
func containsNTLMorNegotiate(h []string) bool { func containsNTLMorNegotiate(h []string) bool {
for _, s := range h { return slices.ContainsFunc(h, func(s string) bool {
if strings.HasPrefix(s, "NTLM") || strings.HasPrefix(s, "Negotiate") { return strings.HasPrefix(s, "NTLM") || strings.HasPrefix(s, "Negotiate")
return true })
}
}
return false
} }
func createRootCACertPool(rootCAs []types.FileOrContent) *x509.CertPool { func createRootCACertPool(rootCAs []types.FileOrContent) *x509.CertPool {

View file

@ -150,7 +150,7 @@ func TestKeepConnectionWhenSameConfiguration(t *testing.T) {
}, },
} }
for i := 0; i < 10; i++ { for range 10 {
rtManager.Update(dynamicConf) rtManager.Update(dynamicConf)
tr, err := rtManager.Get("test") tr, err := rtManager.Get("test")

View file

@ -89,7 +89,7 @@ func (m *Manager) BuildHTTP(rootCtx context.Context, serviceName string) (http.H
value := reflect.ValueOf(*conf.Service) value := reflect.ValueOf(*conf.Service)
var count int var count int
for i := 0; i < value.NumField(); i++ { for i := range value.NumField() {
if !value.Field(i).IsNil() { if !value.Field(i).IsNil() {
count++ count++
} }

View file

@ -135,7 +135,7 @@ func TestLoadBalancing(t *testing.T) {
} }
conn := &fakeConn{writeCall: make(map[string]int)} conn := &fakeConn{writeCall: make(map[string]int)}
for i := 0; i < test.totalCall; i++ { for range test.totalCall {
balancer.ServeTCP(conn) balancer.ServeTCP(conn)
} }

View file

@ -40,7 +40,7 @@ func (o *Options) SetDefaults() {
// Store holds the options for a given Store. // Store holds the options for a given Store.
type Store struct { type Store struct {
DefaultCertificate *Certificate `json:"defaultCertificate,omitempty" toml:"defaultCertificate,omitempty" yaml:"defaultCertificate,omitempty" export:"true"` DefaultCertificate *Certificate `json:"defaultCertificate,omitempty" toml:"defaultCertificate,omitempty" yaml:"defaultCertificate,omitempty" label:"-" export:"true"`
DefaultGeneratedCert *GeneratedCert `json:"defaultGeneratedCert,omitempty" toml:"defaultGeneratedCert,omitempty" yaml:"defaultGeneratedCert,omitempty" export:"true"` DefaultGeneratedCert *GeneratedCert `json:"defaultGeneratedCert,omitempty" toml:"defaultGeneratedCert,omitempty" yaml:"defaultGeneratedCert,omitempty" export:"true"`
} }

View file

@ -6,6 +6,7 @@ import (
"crypto/x509" "crypto/x509"
"errors" "errors"
"fmt" "fmt"
"slices"
"strings" "strings"
"sync" "sync"
@ -189,7 +190,7 @@ func (m *Manager) Get(storeName, configName string) (*tls.Config, error) {
tlsConfig.GetCertificate = func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) { tlsConfig.GetCertificate = func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
domainToCheck := types.CanonicalDomain(clientHello.ServerName) domainToCheck := types.CanonicalDomain(clientHello.ServerName)
if isACMETLS(clientHello) { if slices.Contains(clientHello.SupportedProtos, tlsalpn01.ACMETLS1Protocol) {
certificate := acmeTLSStore.GetBestCertificate(clientHello) certificate := acmeTLSStore.GetBestCertificate(clientHello)
if certificate == nil { if certificate == nil {
log.Debug().Msgf("TLS: no certificate for TLSALPN challenge: %s", domainToCheck) log.Debug().Msgf("TLS: no certificate for TLSALPN challenge: %s", domainToCheck)
@ -427,13 +428,3 @@ func buildDefaultCertificate(defaultCertificate *Certificate) (*tls.Certificate,
} }
return &cert, nil return &cert, nil
} }
func isACMETLS(clientHello *tls.ClientHelloInfo) bool {
for _, proto := range clientHello.SupportedProtos {
if proto == tlsalpn01.ACMETLS1Protocol {
return true
}
}
return false
}

View file

@ -1,6 +1,7 @@
package types package types
import ( import (
"slices"
"strconv" "strconv"
"strings" "strings"
) )
@ -34,10 +35,7 @@ func NewHTTPCodeRanges(strBlocks []string) (HTTPCodeRanges, error) {
// Contains tests whether the passed status code is within one of its HTTP code ranges. // Contains tests whether the passed status code is within one of its HTTP code ranges.
func (h HTTPCodeRanges) Contains(statusCode int) bool { func (h HTTPCodeRanges) Contains(statusCode int) bool {
for _, block := range h { return slices.ContainsFunc(h, func(block [2]int) bool {
if statusCode >= block[0] && statusCode <= block[1] { return statusCode >= block[0] && statusCode <= block[1]
return true })
}
}
return false
} }

View file

@ -197,7 +197,7 @@ func testTimeout(t *testing.T, withRead bool) {
} }
}() }()
for i := 0; i < 10; i++ { for range 10 {
udpConn2, err := net.Dial("udp", ln.Addr().String()) udpConn2, err := net.Dial("udp", ln.Addr().String())
require.NoError(t, err) require.NoError(t, err)

View file

@ -1 +1,7 @@
/dist /dist
/src-capacitor
/src-cordova
/.quasar
/node_modules
.eslintrc.cjs
/quasar.config.*.temporary.compiled*

View file

@ -2,21 +2,24 @@ module.exports = {
root: true, root: true,
parserOptions: { parserOptions: {
parser: 'babel-eslint', parser: '@babel/eslint-parser',
sourceType: 'module' ecmaVersion: 2021, // Allows for the parsing of modern ECMAScript features
}, },
env: { env: {
node: true,
browser: true, browser: true,
mocha: true mocha: true,
'vue/setup-compiler-macros': true
}, },
extends: [ extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential', 'plugin:vue/vue3-essential',
'@vue/standard', 'plugin:vue/vue3-recommended',
'plugin:mocha/recommended' 'plugin:mocha/recommended',
'standard'
], ],
// required to lint *.vue files // required to lint *.vue files
@ -26,10 +29,16 @@ module.exports = {
], ],
globals: { globals: {
'ga': true, // Google Analytics ga: 'readonly', // Google Analytics
'cordova': true, cordova: 'readonly',
'__statics': true, __statics: 'readonly',
'process': true __QUASAR_SSR__: 'readonly',
__QUASAR_SSR_SERVER__: 'readonly',
__QUASAR_SSR_CLIENT__: 'readonly',
__QUASAR_SSR_PWA__: 'readonly',
process: 'readonly',
Capacitor: 'readonly',
chrome: 'readonly'
}, },
// add your custom rules here // add your custom rules here
@ -39,6 +48,8 @@ module.exports = {
// allow paren-less arrow functions // allow paren-less arrow functions
'arrow-parens': 'off', 'arrow-parens': 'off',
'one-var': 'off', 'one-var': 'off',
'no-void': 'off',
'multiline-ternary': 'off',
'import/first': 'off', 'import/first': 'off',
'import/named': 'error', 'import/named': 'error',
@ -49,6 +60,7 @@ module.exports = {
'import/no-unresolved': 'off', 'import/no-unresolved': 'off',
'import/no-extraneous-dependencies': 'off', 'import/no-extraneous-dependencies': 'off',
'prefer-promise-reject-errors': 'off', 'prefer-promise-reject-errors': 'off',
'vue/multi-word-component-names': 'off',
// allow console.log during development only // allow console.log during development only
//'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', //'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
@ -56,3 +68,4 @@ module.exports = {
//'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' //'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
} }
} }

16
webui/babel.config.cjs Normal file
View file

@ -0,0 +1,16 @@
/* eslint-disable */
module.exports = api => {
return {
presets: [
[
'@quasar/babel-preset-app',
api.caller(caller => caller && caller.target === 'node')
? { targets: { node: 'current' } }
: {}
]
]
}
}

View file

@ -1,5 +0,0 @@
module.exports = {
presets: [
'@quasar/babel-preset-app'
]
}

View file

@ -20,7 +20,6 @@
<link rel="apple-touch-icon" sizes="180x180" href="icons/apple-icon-180x180.png"> <link rel="apple-touch-icon" sizes="180x180" href="icons/apple-icon-180x180.png">
</head> </head>
<body> <body>
<!-- DO NOT touch the following DIV --> <!-- quasar:entry-point -->
<div id="q-app"></div>
</body> </body>
</html> </html>

39
webui/jsconfig.json Normal file
View file

@ -0,0 +1,39 @@
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"src/*": [
"src/*"
],
"app/*": [
"*"
],
"components/*": [
"src/components/*"
],
"layouts/*": [
"src/layouts/*"
],
"pages/*": [
"src/pages/*"
],
"assets/*": [
"src/assets/*"
],
"boot/*": [
"src/boot/*"
],
"stores/*": [
"src/stores/*"
],
"vue$": [
"node_modules/vue/dist/vue.runtime.esm-bundler.js"
]
}
},
"exclude": [
"dist",
".quasar",
"node_modules"
]
}

View file

@ -16,42 +16,45 @@
"build:nc": "yarn build" "build:nc": "yarn build"
}, },
"dependencies": { "dependencies": {
"@quasar/extras": "^1.11.2", "@quasar/extras": "^1.16.9",
"axios": "^0.21.1", "axios": "^1.6.7",
"bowser": "^2.5.2", "bowser": "^2.11.0",
"chart.js": "^2.8.0", "chart.js": "^4.4.1",
"dot-prop": "^5.2.0",
"core-js": "^3.35.1", "core-js": "^3.35.1",
"iframe-resizer": "^4.2.11", "dot-prop": "^8.0.2",
"iframe-resizer": "^4.3.9",
"lodash.isequal": "4.5.0", "lodash.isequal": "4.5.0",
"moment": "^2.24.0", "moment": "^2.30.1",
"quasar": "^1.22.10", "quasar": "^2.14.3",
"query-string": "^6.13.1", "query-string": "^8.1.0",
"vh-check": "^2.0.5", "vh-check": "^2.0.5",
"vue-chartjs": "^3.4.2", "vue": "^3.0.0",
"vuex-map-fields": "^1.3.4" "vue-chartjs": "^5.3.0",
"vue-router": "^4.0.12",
"vuex": "^4.1.0",
"vuex-map-fields": "^1.4.1"
}, },
"devDependencies": { "devDependencies": {
"@quasar/app": "^2.4.3", "@babel/core": "^7.23.9",
"@vue/eslint-config-standard": "^4.0.0", "@babel/eslint-parser": "^7.23.10",
"@vue/test-utils": "^1.0.0-beta.29", "@quasar/app-vite": "^1.4.3",
"babel-eslint": "^10.0.1", "@quasar/babel-preset-app": "^2.0.2",
"chai": "4.2.0", "@vue/test-utils": "^2.4.4",
"eslint": "^5.10.0", "autoprefixer": "^10.4.2",
"eslint-loader": "^2.1.1", "chai": "5.0.3",
"eslint-plugin-prettier": "3.1.1", "eslint": "^8.11.0",
"eslint-plugin-mocha": "6.2.1", "eslint-config-standard": "^17.0.0",
"eslint-plugin-vue": "^5.0.0", "eslint-plugin-import": "^2.19.1",
"mocha": "^6.2.2", "eslint-plugin-mocha": "^10.2.0",
"mocha-webpack": "^2.0.0-beta.0", "eslint-plugin-n": "^16.6.2",
"prettier": "1.19.1" "eslint-plugin-promise": "^6.0.0",
"eslint-plugin-vue": "^9.0.0",
"mocha": "^10.2.0",
"postcss": "^8.4.14"
}, },
"engines": { "engines": {
"node": ">= 8.9.0", "node": "^20 || ^18 || ^16",
"npm": ">= 5.6.0", "npm": ">= 6.13.4",
"yarn": ">= 1.6.0" "yarn": ">= 1.21.1"
}, }
"browserslist": [
"last 1 version, not dead, ie >= 11"
]
} }

27
webui/postcss.config.cjs Normal file
View file

@ -0,0 +1,27 @@
/* eslint-disable */
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
plugins: [
// https://github.com/postcss/autoprefixer
require('autoprefixer')({
overrideBrowserslist: [
'last 4 Chrome versions',
'last 4 Firefox versions',
'last 4 Edge versions',
'last 4 Safari versions',
'last 4 Android versions',
'last 4 ChromeAndroid versions',
'last 4 FirefoxAndroid versions',
'last 4 iOS versions'
]
})
// https://github.com/elchininet/postcss-rtlcss
// If you want to support RTL css, then
// 1. yarn/npm install postcss-rtlcss
// 2. optionally set quasar.config.js > framework > lang to an RTL language
// 3. uncomment the following line:
// require('postcss-rtlcss')
]
}

View file

@ -1,12 +1,18 @@
// Configuration for your app // Configuration for your app
// https://quasar.dev/quasar-cli/quasar-conf-js // https://quasar.dev/quasar-cli/quasar-conf-js
module.exports = function (ctx) { const { configure } = require('quasar/wrappers')
module.exports = configure(function (ctx) {
return { return {
eslint: {
warnings: true,
errors: true
},
// app boot file (/src/boot) // app boot file (/src/boot)
// --> boot files are part of "main.js" // --> boot files are part of "main.js"
boot: [ boot: [
'_globals',
'api', 'api',
'_hacks', '_hacks',
'_init' '_init'
@ -114,6 +120,17 @@ module.exports = function (ctx) {
supportIE: false, supportIE: false,
build: { build: {
viteVuePluginOptions: {
template: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('hub-')
}
}
},
target: {
browser: ['edge88', 'firefox78', 'chrome87', 'safari13.1'],
node: 'node20'
},
publicPath: process.env.APP_PUBLIC_PATH || '', publicPath: process.env.APP_PUBLIC_PATH || '',
env: process.env.APP_ENV === 'development' env: process.env.APP_ENV === 'development'
? { // staging: ? { // staging:
@ -131,22 +148,7 @@ module.exports = function (ctx) {
} }
}, },
scopeHoisting: true, scopeHoisting: true,
// vueRouterMode: 'history', vueRouterMode: 'hash' // available values: 'hash', 'history'
// vueCompiler: true,
// gzip: true,
// analyze: true,
// extractCSS: false,
extendWebpack (cfg) {
cfg.module.rules.push({
enforce: 'pre',
test: /\.(js|vue)$/,
loader: 'eslint-loader',
exclude: /node_modules/,
options: {
formatter: require('eslint').CLIEngine.getFormatter('stylish')
}
})
}
}, },
devServer: { devServer: {
@ -166,16 +168,24 @@ module.exports = function (ctx) {
animations: [], animations: [],
ssr: { ssr: {
pwa: false pwa: false,
}, },
pwa: { pwa: {
workboxMode: 'injectManifest', // or 'generateSW'
// workboxPluginMode: 'InjectManifest', // workboxPluginMode: 'InjectManifest',
// workboxOptions: {}, // only for NON InjectManifest // workboxOptions: {}, // only for NON InjectManifest
workboxOptions: { workboxOptions: {
skipWaiting: true, skipWaiting: true,
clientsClaim: true clientsClaim: true
}, },
chainWebpackCustomSW (chain) {
chain.plugin('eslint-webpack-plugin')
.use(ESLintPlugin, [{ extensions: ['js'] }])
},
manifest: { manifest: {
// name: 'Traefik', // name: 'Traefik',
// short_name: 'Traefik', // short_name: 'Traefik',
@ -247,4 +257,4 @@ module.exports = function (ctx) {
} }
} }
} }
} })

Some files were not shown because too many files have changed in this diff Show more