Merge current v2.11 into v3.0
This commit is contained in:
commit
05be441027
156 changed files with 5826 additions and 8436 deletions
2
.github/workflows/validate.yaml
vendored
2
.github/workflows/validate.yaml
vendored
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -46,7 +46,7 @@ builds:
|
||||||
goarch: arm
|
goarch: arm
|
||||||
|
|
||||||
changelog:
|
changelog:
|
||||||
skip: true
|
disable: true
|
||||||
|
|
||||||
archives:
|
archives:
|
||||||
- id: traefik
|
- id: traefik
|
||||||
|
|
|
@ -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)
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -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')
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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 |
|
||||||
|
|
|
@ -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) |
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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```)
|
||||||
|
|
|
@ -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```)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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
14
go.mod
|
@ -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
53
go.sum
|
@ -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=
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
4
integration/testdata/rawdata-consul.json
vendored
4
integration/testdata/rawdata-consul.json
vendored
|
@ -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"
|
||||||
|
|
4
integration/testdata/rawdata-etcd.json
vendored
4
integration/testdata/rawdata-etcd.json
vendored
|
@ -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"
|
||||||
|
|
4
integration/testdata/rawdata-gateway.json
vendored
4
integration/testdata/rawdata-gateway.json
vendored
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
4
integration/testdata/rawdata-ingress.json
vendored
4
integration/testdata/rawdata-ingress.json
vendored
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
4
integration/testdata/rawdata-redis.json
vendored
4
integration/testdata/rawdata-redis.json
vendored
|
@ -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"
|
||||||
|
|
4
integration/testdata/rawdata-zk.json
vendored
4
integration/testdata/rawdata-zk.json
vendored
|
@ -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"
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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{}) {
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"},
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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 != "" {
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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{},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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] ||
|
||||||
|
|
|
@ -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"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
],
|
],
|
||||||
"service": "api@internal",
|
"service": "api@internal",
|
||||||
"rule": "PathPrefix(`/api`)",
|
"rule": "PathPrefix(`/api`)",
|
||||||
"priority": 2147483646
|
"priority": 9223372036854775806
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
],
|
],
|
||||||
"service": "ping@internal",
|
"service": "ping@internal",
|
||||||
"rule": "PathPrefix(`/ping`)",
|
"rule": "PathPrefix(`/ping`)",
|
||||||
"priority": 2147483647
|
"priority": 9223372036854775807
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
],
|
],
|
||||||
"service": "prometheus@internal",
|
"service": "prometheus@internal",
|
||||||
"rule": "PathPrefix(`/metrics`)",
|
"rule": "PathPrefix(`/metrics`)",
|
||||||
"priority": 2147483647
|
"priority": 9223372036854775807
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
],
|
],
|
||||||
"service": "rest@internal",
|
"service": "rest@internal",
|
||||||
"rule": "PathPrefix(`/api/providers`)",
|
"rule": "PathPrefix(`/api/providers`)",
|
||||||
"priority": 2147483647
|
"priority": 9223372036854775807
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"services": {
|
"services": {
|
||||||
|
|
|
@ -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`)",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
@ -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{
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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++
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -1 +1,7 @@
|
||||||
/dist
|
/dist
|
||||||
|
/src-capacitor
|
||||||
|
/src-cordova
|
||||||
|
/.quasar
|
||||||
|
/node_modules
|
||||||
|
.eslintrc.cjs
|
||||||
|
/quasar.config.*.temporary.compiled*
|
||||||
|
|
|
@ -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
16
webui/babel.config.cjs
Normal 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' } }
|
||||||
|
: {}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@quasar/babel-preset-app'
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -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
39
webui/jsconfig.json
Normal 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"
|
||||||
|
]
|
||||||
|
}
|
|
@ -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
27
webui/postcss.config.cjs
Normal 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')
|
||||||
|
]
|
||||||
|
}
|
|
@ -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
Loading…
Reference in a new issue