diff --git a/.ct.yaml b/.ct.yaml new file mode 100644 index 000000000..229030219 --- /dev/null +++ b/.ct.yaml @@ -0,0 +1,26 @@ +# Copyright 2024 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +remote: origin +target-branch: main + +validate-maintainers: false +check-version-increment: false + +chart-repos: + - ingress-nginx=https://kubernetes.github.io/ingress-nginx +helm-extra-args: --timeout 800s + +chart-dirs: + - charts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 469e00834..07770e47c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -37,7 +37,7 @@ This questions are the first thing we need to know to understand the context. -**NGINX Ingress controller version** (exec into the pod and run nginx-ingress-controller --version.): +**NGINX Ingress controller version** (exec into the pod and run `/nginx-ingress-controller --version`): + # - name: my-extra-configmap-2 + # labels: + # type: config-2 + # data: + # extra_file_2.html: | + # + autoscaling: annotations: {} enabled: false @@ -882,6 +1175,10 @@ defaultBackend: service: annotations: {} # clusterIP: "" + # -- Pre-defined cluster internal IP addresses of the default backend service. Take care of collisions with existing services. + # This value is immutable. Set once, it can not be changed without deleting and re-creating the service. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address + clusterIPs: [] # -- List of IP addresses at which the default backend service is available ## Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips @@ -898,10 +1195,6 @@ defaultBackend: rbac: create: true scope: false -## If true, create & use Pod Security Policy resources -## https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -podSecurityPolicy: - enabled: false serviceAccount: create: true name: "" @@ -917,13 +1210,13 @@ imagePullSecrets: [] ## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md ## tcp: {} -# 8080: "default/example-tcp-svc:9000" +# "8080": "default/example-tcp-svc:9000" # -- UDP service key-value pairs ## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md ## udp: {} -# 53: "kube-system/kube-dns:53" +# "53": "kube-system/kube-dns:53" # -- Prefix for TCP and UDP ports names in ingress controller service ## Some cloud providers, like Yandex Cloud may have a requirements for a port name regex to support cloud load balancer integration diff --git a/cloudbuild.yaml b/cloudbuild.yaml index d3f1eed62..0bb2b60a4 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,25 +1,14 @@ -# See https://cloud.google.com/cloud-build/docs/build-config - -timeout: 18000s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE steps: - - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90' - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx - REPO_INFO=https://github.com/kubernetes/ingress-nginx - - COMMIT_SHA=$_PULL_BASE_SHA - - BUILD_ID=$BUILD_ID - - HOME=/root - - USER=root + - COMMIT_SHA=${_PULL_BASE_SHA} + - BUILD_ID=${BUILD_ID} + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && make release -substitutions: - _GIT_TAG: "12345" - _PULL_BASE_REF: "main" - _PULL_BASE_SHA: '12345' + - -c + - gcloud auth configure-docker && make release diff --git a/cmd/annotations/annotations.tmpl b/cmd/annotations/annotations.tmpl new file mode 100644 index 000000000..91dd21de8 --- /dev/null +++ b/cmd/annotations/annotations.tmpl @@ -0,0 +1,7 @@ +# Annotations Scope and Risk + +|Group |Annotation | Risk | Scope | +|--------|------------------|------|-------| +{{- range $doc := . }} +| {{ $doc.Group }} | {{ $doc.Annotation }} | {{ $doc.Risk }} | {{ $doc.Scope }} | +{{- end }} diff --git a/cmd/annotations/main.go b/cmd/annotations/main.go new file mode 100644 index 000000000..78f26099c --- /dev/null +++ b/cmd/annotations/main.go @@ -0,0 +1,91 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "bytes" + "embed" + "flag" + "fmt" + "os" + "slices" + "strings" + "text/template" + + anns "k8s.io/ingress-nginx/internal/ingress/annotations" +) + +type Documentation struct { + Group string + Annotation string + Risk string + Scope string +} + +var output string + +//go:embed annotations.tmpl +var content embed.FS + +func main() { + flag.StringVar(&output, "output", "", "where to write documentation") + flag.Parse() + if output == "" { + panic(fmt.Errorf("output field is required")) + } + docEntries := make([]Documentation, 0) + annotationFactory := anns.NewAnnotationFactory(nil) + for group, val := range annotationFactory { + annotations := val.GetDocumentation() + intermediateDocs := make([]Documentation, len(annotations)) + i := 0 + for annotation, values := range annotations { + doc := Documentation{ + Group: group, + Annotation: annotation, + Scope: string(values.Scope), + Risk: values.Risk.ToString(), + } + intermediateDocs[i] = doc + i++ + } + slices.SortStableFunc(intermediateDocs, func(a, b Documentation) int { + return strings.Compare(a.Annotation, b.Annotation) + }) + docEntries = append(docEntries, intermediateDocs...) + } + slices.SortStableFunc(docEntries, func(a, b Documentation) int { + return strings.Compare(a.Group, b.Group) + }) + + tmpl, err := template.New("annotations.tmpl").ParseFS(content, "annotations.tmpl") + if err != nil { + panic(fmt.Errorf("error parsing template: %s", err)) + } + + tplBuffer := new(bytes.Buffer) + err = tmpl.Execute(tplBuffer, docEntries) + if err != nil { + panic(err) + } + tplBuffer.WriteString("\n") + + //nolint:gosec // no need to check file permission here + if err := os.WriteFile(output, tplBuffer.Bytes(), 0o755); err != nil { + panic(err) + } +} diff --git a/cmd/dataplane/main.go b/cmd/dataplane/main.go index 65f898df6..e7e4dc38f 100644 --- a/cmd/dataplane/main.go +++ b/cmd/dataplane/main.go @@ -66,7 +66,7 @@ func main() { mc := metric.NewDummyCollector() if conf.EnableMetrics { // TODO: Ingress class is not a part of dataplane anymore - mc, err = metric.NewCollector(conf.MetricsPerHost, conf.ReportStatusClasses, reg, conf.IngressClassConfiguration.Controller, *conf.MetricsBuckets, conf.ExcludeSocketMetrics) + mc, err = metric.NewCollector(conf.MetricsPerHost, conf.MetricsPerUndefinedHost, conf.ReportStatusClasses, reg, conf.IngressClassConfiguration.Controller, *conf.MetricsBuckets, conf.MetricsBucketFactor, conf.MetricsMaxBuckets, conf.ExcludeSocketMetrics) if err != nil { klog.Fatalf("Error creating prometheus collector: %v", err) } diff --git a/cmd/dbg/main.go b/cmd/dbg/main.go index b63bcf5fe..ab68001c9 100644 --- a/cmd/dbg/main.go +++ b/cmd/dbg/main.go @@ -47,7 +47,7 @@ func main() { backendsAllCmd := &cobra.Command{ Use: "all", Short: "Output the all dynamic backend information as a JSON array", - Run: func(cmd *cobra.Command, args []string) { + Run: func(_ *cobra.Command, _ []string) { backendsAll() }, } @@ -56,7 +56,7 @@ func main() { backendsListCmd := &cobra.Command{ Use: "list", Short: "Output a newline-separated list of the backend names", - Run: func(cmd *cobra.Command, args []string) { + Run: func(_ *cobra.Command, _ []string) { backendsList() }, } @@ -66,7 +66,7 @@ func main() { Use: "get [backend name]", Short: "Output the backend information only for the backend that has this name", Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { + Run: func(_ *cobra.Command, args []string) { backendsGet(args[0]) }, } @@ -81,7 +81,7 @@ func main() { Use: "get [hostname]", Short: "Get the dynamically-loaded certificate information for the given hostname", Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, args []string) error { certGet(args[0]) return nil }, @@ -93,7 +93,7 @@ func main() { generalCmd := &cobra.Command{ Use: "general", Short: "Output the general dynamic lua state", - Run: func(cmd *cobra.Command, args []string) { + Run: func(_ *cobra.Command, _ []string) { general() }, } @@ -102,7 +102,7 @@ func main() { confCmd := &cobra.Command{ Use: "conf", Short: "Dump the contents of /etc/nginx/nginx.conf", - Run: func(cmd *cobra.Command, args []string) { + Run: func(_ *cobra.Command, _ []string) { readNginxConf() }, } diff --git a/cmd/nginx/logger.go b/cmd/nginx/logger.go index 323085c83..8f0db0257 100644 --- a/cmd/nginx/logger.go +++ b/cmd/nginx/logger.go @@ -33,11 +33,11 @@ func logger(address string) { server.SetFormat(syslog.RFC3164) server.SetHandler(handler) if err := server.ListenUDP(address); err != nil { - klog.Fatalf("failed bind internal syslog: %w", err) + klog.Fatalf("failed bind internal syslog: %s", err.Error()) } if err := server.Boot(); err != nil { - klog.Fatalf("failed to boot internal syslog: %w", err) + klog.Fatalf("failed to boot internal syslog: %s", err.Error()) } klog.Infof("Is Chrooted, starting logger") diff --git a/cmd/nginx/main.go b/cmd/nginx/main.go index 1d30091ef..781f3a8eb 100644 --- a/cmd/nginx/main.go +++ b/cmd/nginx/main.go @@ -74,7 +74,7 @@ func main() { handleFatalInitError(err) } - if len(conf.DefaultService) > 0 { + if conf.DefaultService != "" { err := checkService(conf.DefaultService, kubeClient) if err != nil { klog.Fatal(err) @@ -83,7 +83,7 @@ func main() { klog.InfoS("Valid default backend", "service", conf.DefaultService) } - if len(conf.PublishService) > 0 { + if conf.PublishService != "" { err := checkService(conf.PublishService, kubeClient) if err != nil { klog.Fatal(err) @@ -130,7 +130,7 @@ func main() { mc := metric.NewDummyCollector() if conf.EnableMetrics { - mc, err = metric.NewCollector(conf.MetricsPerHost, conf.ReportStatusClasses, reg, conf.IngressClassConfiguration.Controller, *conf.MetricsBuckets, conf.ExcludeSocketMetrics) + mc, err = metric.NewCollector(conf.MetricsPerHost, conf.MetricsPerUndefinedHost, conf.ReportStatusClasses, reg, conf.IngressClassConfiguration.Controller, *conf.MetricsBuckets, conf.MetricsBucketFactor, conf.MetricsMaxBuckets, conf.ExcludeSocketMetrics) if err != nil { klog.Fatalf("Error creating prometheus collector: %v", err) } @@ -235,7 +235,6 @@ func createApiserverClient(apiserverHost, rootCAFile, kubeConfig string) (*kuber retries++ return false, nil }) - // err is returned in case of timeout in the exponential backoff (ErrWaitTimeout) if err != nil { return nil, lastErr diff --git a/cmd/plugin/commands/backends/backends.go b/cmd/plugin/commands/backends/backends.go index ff44fd9c2..e7bd42147 100644 --- a/cmd/plugin/commands/backends/backends.go +++ b/cmd/plugin/commands/backends/backends.go @@ -34,7 +34,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "backends", Short: "Inspect the dynamic backend information of an ingress-nginx instance", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { backend, err := cmd.Flags().GetString("backend") if err != nil { return err diff --git a/cmd/plugin/commands/certs/certs.go b/cmd/plugin/commands/certs/certs.go index ee27cf1b1..4a7fee1cf 100644 --- a/cmd/plugin/commands/certs/certs.go +++ b/cmd/plugin/commands/certs/certs.go @@ -35,7 +35,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "certs", Short: "Output the certificate data stored in an ingress-nginx pod", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { host, err := cmd.Flags().GetString("host") if err != nil { return err diff --git a/cmd/plugin/commands/conf/conf.go b/cmd/plugin/commands/conf/conf.go index 090fb40bb..5821b11f1 100644 --- a/cmd/plugin/commands/conf/conf.go +++ b/cmd/plugin/commands/conf/conf.go @@ -36,7 +36,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "conf", Short: "Inspect the generated nginx.conf", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { host, err := cmd.Flags().GetString("host") if err != nil { return err diff --git a/cmd/plugin/commands/exec/exec.go b/cmd/plugin/commands/exec/exec.go index 8e853c534..a91bdb594 100644 --- a/cmd/plugin/commands/exec/exec.go +++ b/cmd/plugin/commands/exec/exec.go @@ -34,7 +34,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "exec", Short: "Execute a command inside an ingress-nginx pod", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, args []string) error { util.PrintError(exec(flags, *pod, *deployment, *selector, *container, args, opts)) return nil }, diff --git a/cmd/plugin/commands/general/general.go b/cmd/plugin/commands/general/general.go index cea403562..d7b3b34f9 100644 --- a/cmd/plugin/commands/general/general.go +++ b/cmd/plugin/commands/general/general.go @@ -34,7 +34,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "general", Short: "Inspect the other dynamic ingress-nginx information", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, _ []string) error { util.PrintError(general(flags, *pod, *deployment, *selector, *container)) return nil }, diff --git a/cmd/plugin/commands/info/info.go b/cmd/plugin/commands/info/info.go index 246046c3a..e0fd3aaec 100644 --- a/cmd/plugin/commands/info/info.go +++ b/cmd/plugin/commands/info/info.go @@ -32,7 +32,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "info", Short: "Show information about the ingress-nginx service", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { service, err := cmd.Flags().GetString("service") if err != nil { return err diff --git a/cmd/plugin/commands/ingresses/ingresses.go b/cmd/plugin/commands/ingresses/ingresses.go index 8a25418db..7cb90a570 100644 --- a/cmd/plugin/commands/ingresses/ingresses.go +++ b/cmd/plugin/commands/ingresses/ingresses.go @@ -36,7 +36,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { Use: "ingresses", Aliases: []string{"ingress", "ing"}, Short: "Provide a short summary of all of the ingress definitions", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { host, err := cmd.Flags().GetString("host") if err != nil { return err @@ -139,14 +139,14 @@ func getIngressRows(ingresses *[]networking.Ingress) []ingressRow { ing := &(*ingresses)[i] address := "" for _, lbIng := range ing.Status.LoadBalancer.Ingress { - if len(lbIng.IP) > 0 { + if lbIng.IP != "" { address = address + lbIng.IP + "," } - if len(lbIng.Hostname) > 0 { + if lbIng.Hostname != "" { address = address + lbIng.Hostname + "," } } - if len(address) > 0 { + if address != "" { address = address[:len(address)-1] } @@ -166,7 +166,7 @@ func getIngressRows(ingresses *[]networking.Ingress) []ingressRow { } // Handle catch-all ingress - if len(ing.Spec.Rules) == 0 && len(defaultBackendService) > 0 { + if len(ing.Spec.Rules) == 0 && defaultBackendService != "" { row := ingressRow{ Namespace: ing.Namespace, IngressName: ing.Name, diff --git a/cmd/plugin/commands/lint/main.go b/cmd/plugin/commands/lint/main.go index 847fe86c9..69ab984f5 100644 --- a/cmd/plugin/commands/lint/main.go +++ b/cmd/plugin/commands/lint/main.go @@ -38,7 +38,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "lint", Short: "Inspect kubernetes resources for possible issues", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, _ []string) error { err := opts.Validate() if err != nil { return err @@ -73,7 +73,7 @@ func createSubcommand(flags *genericclioptions.ConfigFlags, names []string, shor Use: names[0], Aliases: names[1:], Short: short, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, _ []string) error { err := opts.Validate() if err != nil { return err diff --git a/cmd/plugin/commands/logs/logs.go b/cmd/plugin/commands/logs/logs.go index 22068d469..d9f6e7bd8 100644 --- a/cmd/plugin/commands/logs/logs.go +++ b/cmd/plugin/commands/logs/logs.go @@ -36,7 +36,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "logs", Short: "Get the kubernetes logs for an ingress-nginx pod", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, _ []string) error { util.PrintError(logs(flags, *pod, *deployment, *selector, *container, o)) return nil }, diff --git a/cmd/plugin/commands/ssh/ssh.go b/cmd/plugin/commands/ssh/ssh.go index a4762d781..c9631d10b 100644 --- a/cmd/plugin/commands/ssh/ssh.go +++ b/cmd/plugin/commands/ssh/ssh.go @@ -32,7 +32,7 @@ func CreateCommand(flags *genericclioptions.ConfigFlags) *cobra.Command { cmd := &cobra.Command{ Use: "ssh", Short: "ssh into a running ingress-nginx pod", - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, _ []string) error { util.PrintError(ssh(flags, *pod, *deployment, *selector, *container)) return nil }, diff --git a/cmd/plugin/krew.yaml b/cmd/plugin/krew.yaml index e68b09f9a..0ef537d34 100644 --- a/cmd/plugin/krew.yaml +++ b/cmd/plugin/krew.yaml @@ -21,7 +21,7 @@ spec: arch: amd64 {{addURIAndSha "https://github.com/kubernetes/ingress-nginx/releases/download/{{ .TagName }}/kubectl-ingress-nginx_darwin_amd64.tar.gz" .TagName }} bin: kubectl-ingress-nginx - selector: + - selector: matchLabels: os: linux arch: amd64 diff --git a/cmd/plugin/request/request.go b/cmd/plugin/request/request.go index 55df85d5e..57b02827e 100644 --- a/cmd/plugin/request/request.go +++ b/cmd/plugin/request/request.go @@ -131,7 +131,7 @@ func GetIngressDefinitions(flags *genericclioptions.ConfigFlags, namespace strin return pods.Items, nil } -// GetNumEndpoints counts the number of endpointslices adresses for the service with the given name +// GetNumEndpoints counts the number of endpointslices addresses for the service with the given name func GetNumEndpoints(flags *genericclioptions.ConfigFlags, namespace, serviceName string) (*int, error) { epss, err := GetEndpointSlicesByName(flags, namespace, serviceName) if err != nil { diff --git a/deploy/grafana/dashboards/README.md b/deploy/grafana/dashboards/README.md index e16180c3b..fc1e35406 100644 --- a/deploy/grafana/dashboards/README.md +++ b/deploy/grafana/dashboards/README.md @@ -19,7 +19,7 @@ This folder contains two dashboards that you can import. ### Requirements -- **Grafana v5.2.0** (or newer) +- **Grafana v10.4.3** (or newer) ## 2. Request Handling Performance @@ -36,4 +36,4 @@ This folder contains two dashboards that you can import. ### Requirements -- **Grafana v6.6.0** (or newer) +- **Grafana v10.4.3** (or newer) diff --git a/deploy/grafana/dashboards/nginx.json b/deploy/grafana/dashboards/nginx.json index 3c3205b4a..5ebc4ae6c 100644 --- a/deploy/grafana/dashboards/nginx.json +++ b/deploy/grafana/dashboards/nginx.json @@ -9,31 +9,53 @@ "pluginName": "Prometheus" } ], + "__elements": {}, "__requires": [ { "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "5.2.1" + "version": "10.4.3" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" }, { "type": "datasource", "id": "prometheus", "name": "Prometheus", - "version": "5.0.0" + "version": "1.0.0" }, { "type": "panel", - "id": "singlestat", - "name": "Singlestat", - "version": "5.0.0" + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" } ], "annotations": { "list": [ { "builtIn": 1, - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", @@ -41,7 +63,10 @@ "type": "dashboard" }, { - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "enable": true, "expr": "sum(changes(nginx_ingress_controller_config_last_reload_successful_timestamp_seconds{instance!=\"unknown\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[30s])) by (controller_class)", "hide": false, @@ -58,72 +83,75 @@ ] }, "editable": true, - "gnetId": null, + "fiscalYearStartMonth": 0, "graphTooltip": 0, - "iteration": 1534359654832, + "id": null, "links": [], "panels": [ { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "${DS_PROMETHEUS}", - "format": "ops", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "gridPos": { - "h": 3, - "w": 6, - "x": 0, - "y": 0 + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ops" + }, + "overrides": [] }, "id": 20, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "tableColumn": "", + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[2m])), 0.001)", "format": "time_series", "intervalFactor": 1, @@ -131,37 +159,47 @@ "step": 4 } ], - "thresholds": "", "title": "Controller Request Volume", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" + "type": "stat" }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "${DS_PROMETHEUS}", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] }, "gridPos": { "h": 3, @@ -170,42 +208,30 @@ "y": 0 }, "id": 82, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "tableColumn": "", + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "sum(avg_over_time(nginx_ingress_controller_nginx_process_connections{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",state=\"active\"}[2m]))", "format": "time_series", "instant": false, @@ -214,37 +240,51 @@ "step": 4 } ], - "thresholds": "", "title": "Controller Connections", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" + "type": "stat" }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "${DS_PROMETHEUS}", - "format": "percentunit", - "gauge": { - "maxValue": 100, - "minValue": 80, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": false + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 95 + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 99 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] }, "gridPos": { "h": 3, @@ -253,42 +293,30 @@ "y": 0 }, "id": 21, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "tableColumn": "", + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",status!~\"[4-5].*\"}[2m])) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\"}[2m]))", "format": "time_series", "intervalFactor": 1, @@ -296,38 +324,48 @@ "step": 4 } ], - "thresholds": "95, 99, 99.5", "title": "Controller Success Rate (non-4|5xx responses)", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" + "type": "stat" }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 0, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] }, "gridPos": { "h": 3, @@ -336,42 +374,30 @@ "y": 0 }, "id": 81, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "tableColumn": "", + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "avg(irate(nginx_ingress_controller_success{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[1m])) * 60", "format": "time_series", "instant": false, @@ -380,38 +406,48 @@ "step": 4 } ], - "thresholds": "", "title": "Config Reloads", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "total" + "type": "stat" }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 0, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] }, "gridPos": { "h": 3, @@ -420,42 +456,30 @@ "y": 0 }, "id": 83, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "tableColumn": "", + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "count(nginx_ingress_controller_config_last_reload_successful{controller_pod=~\"$controller\",controller_namespace=~\"$namespace\"} == 0)", "format": "time_series", "instant": true, @@ -464,784 +488,148 @@ "step": 4 } ], - "thresholds": "", "title": "Last Config Failed", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" + "type": "stat" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 3 + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "height": "200px", - "id": 86, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "hideEmpty": false, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 300, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress), 0.001)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "metric": "network", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Ingress Request Volume", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "reqps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "max - istio-proxy": "#890f02", - "max - master": "#bf1b00", - "max - prometheus": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": false, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 3 - }, - "id": 87, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "hideEmpty": true, - "hideZero": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 300, - "sort": "avg", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",ingress=~\"$ingress\",status!~\"[4-5].*\"}[2m])) by (ingress) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", - "format": "time_series", - "instant": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "metric": "container_memory_usage:sort_desc", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Ingress Success Rate (non-4|5xx responses)", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 1, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percentunit", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 10 - }, - "height": "200px", - "id": 32, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": 200, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (irate (nginx_ingress_controller_request_size_sum{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m]))", - "format": "time_series", - "instant": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "Received", - "metric": "network", - "refId": "A", - "step": 10 - }, - { - "expr": "- sum (irate (nginx_ingress_controller_response_size_sum{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m]))", - "format": "time_series", - "hide": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "Sent", - "metric": "network", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Network I/O pressure", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "max - istio-proxy": "#890f02", - "max - master": "#bf1b00", - "max - prometheus": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": false, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 10 - }, - "id": 77, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sideWidth": 200, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg(nginx_ingress_controller_nginx_process_resident_memory_bytes{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}) ", - "format": "time_series", - "instant": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "nginx", - "metric": "container_memory_usage:sort_desc", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Average Memory Usage", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "max - istio-proxy": "#890f02", - "max - master": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 3, - "editable": false, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 10 - }, - "height": "", - "id": 79, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": false, - "sort": null, - "sortDesc": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg (rate (nginx_ingress_controller_nginx_process_cpu_seconds_total{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m])) ", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "nginx", - "metric": "container_cpu", - "refId": "A", - "step": 10 - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Average CPU Usage", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": "cores", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "columns": [], - "datasource": "${DS_PROMETHEUS}", - "description": "This data is real time, independent of dashboard time range", - "fontSize": "100%", - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 16 - }, - "hideTimeOverride": false, - "id": 75, - "links": [], - "pageSize": 7, - "repeat": null, - "repeatDirection": "h", - "scroll": true, - "showHeader": true, - "sort": { - "col": 1, - "desc": true - }, - "styles": [ - { - "alias": "Ingress", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "ingress", - "preserveFormat": false, - "sanitize": false, - "thresholds": [], - "type": "string", - "unit": "short" - }, - { - "alias": "Requests", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "Value #A", - "thresholds": [ - "" - ], - "type": "number", - "unit": "ops" - }, - { - "alias": "Errors", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "ops" - }, - { - "alias": "P50 Latency", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "link": false, - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "P90 Latency", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "P99 Latency", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "pattern": "Value #E", - "thresholds": [], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "IN", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "Value #F", - "thresholds": [ - "" - ], - "type": "number", - "unit": "Bps" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "Time", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "OUT", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #G", - "thresholds": [], - "type": "number", - "unit": "Bps" - } - ], - "targets": [ - { - "expr": "histogram_quantile(0.50, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le, ingress))", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "C" - }, - { - "expr": "histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le, ingress))", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "D" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le, ingress))", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ destination_service }}", - "refId": "E" - }, - { - "expr": "sum(irate(nginx_ingress_controller_request_size_sum{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "F" - }, - { - "expr": "sum(irate(nginx_ingress_controller_response_size_sum{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "legendFormat": "{{ ingress }}", - "refId": "G" - } - ], - "timeFrom": null, - "title": "Ingress Percentile Response Times and Transfer Rates", - "transform": "table", - "transparent": false, - "type": "table" - }, - { - "datasource": "${DS_PROMETHEUS}", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [ + { + "matcher": { + "id": "byValue", + "options": { + "op": "gte", + "reducer": "allIsZero", + "value": 0 + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 3 + }, + "id": 86, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.4.3", + "repeatDirection": "h", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "round(sum(irate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",exported_namespace=~\"$exported_namespace\",ingress=~\"$ingress\"}[2m])) by (ingress), 0.001)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ ingress }}", + "metric": "network", + "refId": "A", + "step": 10 + } + ], + "title": "Ingress Request Volume", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, @@ -1253,6 +641,842 @@ "tooltip": false, "viz": false }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max - istio-proxy" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890f02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max - master" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#bf1b00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max - prometheus" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#bf1b00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byValue", + "options": { + "op": "gte", + "reducer": "allIsNull", + "value": 0 + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 3 + }, + "id": 87, + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "asc" + } + }, + "pluginVersion": "10.4.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",exported_namespace=~\"$exported_namespace\",ingress=~\"$ingress\",status!~\"[4-5].*\"}[2m])) by (ingress) / sum(rate(nginx_ingress_controller_requests{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",namespace=~\"$namespace\",exported_namespace=~\"$exported_namespace\",ingress=~\"$ingress\"}[2m])) by (ingress)", + "format": "time_series", + "instant": false, + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "{{ ingress }}", + "metric": "container_memory_usage:sort_desc", + "refId": "A", + "step": 10 + } + ], + "title": "Ingress Success Rate (non-4|5xx responses)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 32, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": false, + "width": 200 + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.4.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "sum (irate (nginx_ingress_controller_request_size_sum{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m]))", + "format": "time_series", + "instant": false, + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "Received", + "metric": "network", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "- sum (irate (nginx_ingress_controller_response_size_sum{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m]))", + "format": "time_series", + "hide": false, + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "Sent", + "metric": "network", + "refId": "B", + "step": 10 + } + ], + "title": "Network I/O pressure", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "max - istio-proxy" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890f02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max - master" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#bf1b00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "max - prometheus" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#bf1b00", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 10 + }, + "id": 77, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": false, + "width": 200 + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "avg(nginx_ingress_controller_nginx_process_resident_memory_bytes{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}) ", + "format": "time_series", + "instant": false, + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "nginx", + "metric": "container_memory_usage:sort_desc", + "refId": "A", + "step": 10 + } + ], + "title": "Average Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "cores", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "line+area" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 10 + }, + "id": 79, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.4.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "avg (rate (nginx_ingress_controller_nginx_process_cpu_seconds_total{controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\"}[2m])) ", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "nginx", + "metric": "container_cpu", + "refId": "A", + "step": 10 + } + ], + "title": "Average CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "This data is real time, independent of dashboard time range", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "ingress" + }, + "properties": [ + { + "id": "displayName", + "value": "Ingress" + }, + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #A" + }, + "properties": [ + { + "id": "displayName", + "value": "P50 Latency" + }, + { + "id": "unit", + "value": "dtdurations" + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #B" + }, + "properties": [ + { + "id": "displayName", + "value": "P90 Latency" + }, + { + "id": "unit", + "value": "dtdurations" + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #C" + }, + "properties": [ + { + "id": "displayName", + "value": "P99 Latency" + }, + { + "id": "unit", + "value": "dtdurations" + }, + { + "id": "custom.align" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #D" + }, + "properties": [ + { + "id": "displayName", + "value": "IN" + }, + { + "id": "unit", + "value": "Bps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)" + } + ] + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "unit", + "value": "short" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + }, + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value #E" + }, + "properties": [ + { + "id": "displayName", + "value": "OUT" + }, + { + "id": "unit", + "value": "Bps" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.align" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 16 + }, + "hideTimeOverride": false, + "id": 75, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.3", + "repeatDirection": "h", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "histogram_quantile(0.50, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le, ingress))", + "format": "table", + "hide": false, + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ ingress }}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le, ingress))", + "format": "table", + "hide": false, + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ ingress }}", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le, ingress))", + "format": "table", + "hide": false, + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ destination_service }}", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "sum(irate(nginx_ingress_controller_request_size_sum{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (ingress)", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ ingress }}", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "sum(irate(nginx_ingress_controller_response_size_sum{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (ingress)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ ingress }}", + "refId": "E" + } + ], + "title": "Ingress Percentile Response Times and Transfer Rates", + "transformations": [ + { + "id": "merge", + "options": { + "reducers": [] + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -1295,12 +1519,12 @@ }, "hideTimeOverride": false, "id": 91, - "links": [], "options": { "legend": { "calcs": [], "displayMode": "list", - "placement": "bottom" + "placement": "bottom", + "showLegend": true }, "tooltip": { "mode": "multi", @@ -1311,8 +1535,12 @@ "repeatDirection": "h", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": true, - "expr": "histogram_quantile(0.80, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le))", "format": "time_series", "hide": false, "instant": false, @@ -1322,8 +1550,12 @@ "refId": "C" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": true, - "expr": "histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le))", "format": "time_series", "hide": false, "instant": false, @@ -1333,9 +1565,13 @@ "refId": "D" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "editorMode": "code", "exemplar": true, - "expr": "histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le))", "format": "time_series", "hide": false, "instant": false, @@ -1345,7 +1581,7 @@ "refId": "E" } ], - "title": "Ingress Percentile Response Times", + "title": "Ingress Percentile Response Times (Ingress Namespaces)", "type": "timeseries" }, { @@ -1358,8 +1594,26 @@ "mode": "spectrum" }, "dataFormat": "tsbuckets", - "datasource": "${DS_PROMETHEUS}", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, "gridPos": { "h": 7, "w": 12, @@ -1373,18 +1627,61 @@ "legend": { "show": true }, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": {}, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Warm", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": true + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.4.3", "reverseYBuckets": false, "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "exemplar": true, - "expr": "sum(increase(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\"}[2m])) by (le)", + "expr": "sum(increase(nginx_ingress_controller_request_duration_seconds_bucket{ingress!=\"\",controller_pod=~\"$controller\",controller_class=~\"$controller_class\",controller_namespace=~\"$namespace\",ingress=~\"$ingress\",exported_namespace=~\"$exported_namespace\"}[2m])) by (le)", "format": "heatmap", "interval": "", "legendFormat": "{{le}}", "refId": "A" } ], - "title": "Ingress Request Latency Heatmap", + "title": "Ingress Request Latency Heatmap (Ingress Namespaces)", "tooltip": { "show": true, "showHistogram": true @@ -1401,72 +1698,124 @@ "yBucketBound": "auto" }, { - "columns": [ - { - "text": "Current", - "value": "current" - } - ], - "datasource": "${DS_PROMETHEUS}", - "fontSize": "100%", + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "displayName": "", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Last *" + }, + "properties": [ + { + "id": "displayName", + "value": "TTL" + }, + { + "id": "unit", + "value": "s" + }, + { + "id": "custom.cellOptions", + "value": { + "type": "color-background" + } + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 0 + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 691200 + } + ] + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Field" + }, + "properties": [ + { + "id": "displayName", + "value": "Host" + } + ] + } + ] + }, "gridPos": { "h": 8, "w": 24, "x": 0, "y": 31 }, - "height": "1024", "id": 85, - "links": [], - "pageSize": 7, - "scroll": true, - "showHeader": true, - "sort": { - "col": 1, - "desc": false + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true }, - "styles": [ - { - "alias": "Time", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "date" - }, - { - "alias": "TTL", - "colorMode": "cell", - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 0, - "pattern": "Current", - "thresholds": [ - "0", - "691200" - ], - "type": "number", - "unit": "s" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "number", - "unit": "short" - } - ], + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "avg(nginx_ingress_controller_ssl_expire_time_seconds{kubernetes_pod_name=~\"$controller\",namespace=~\"$namespace\",ingress=~\"$ingress\"}) by (host) - time()", "format": "time_series", "intervalFactor": 1, @@ -1477,35 +1826,55 @@ } ], "title": "Ingress Certificate Expiry", - "transform": "timeseries_aggregations", + "transformations": [ + { + "id": "reduce", + "options": { + "includeTimeField": false, + "labelsToFields": false, + "reducers": [ + "lastNotNull" + ] + } + } + ], "type": "table" } ], "refresh": "5s", - "schemaVersion": 16, - "style": "dark", + "schemaVersion": 39, "tags": [ "nginx" ], "templating": { "list": [ { + "current": { + "selected": false, + "text": "Prometheus", + "value": "${DS_PROMETHEUS}" + }, "hide": 0, + "includeAll": false, "label": "datasource", + "multi": false, "name": "DS_PROMETHEUS", "options": [], "query": "prometheus", + "queryValue": "", "refresh": 1, "regex": "", + "skipUrlSync": false, "type": "datasource" }, { "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "datasource": "${DS_PROMETHEUS}", + "definition": "", "hide": 0, "includeAll": true, "label": "Namespace", @@ -1515,20 +1884,21 @@ "query": "label_values(nginx_ingress_controller_config_hash, controller_namespace)", "refresh": 1, "regex": "", + "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", - "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "datasource": "${DS_PROMETHEUS}", + "definition": "", "hide": 0, "includeAll": true, "label": "Controller Class", @@ -1538,20 +1908,21 @@ "query": "label_values(nginx_ingress_controller_config_hash{namespace=~\"$namespace\"}, controller_class) ", "refresh": 1, "regex": "", + "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", - "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "datasource": "${DS_PROMETHEUS}", + "definition": "", "hide": 0, "includeAll": true, "label": "Controller", @@ -1561,33 +1932,57 @@ "query": "label_values(nginx_ingress_controller_config_hash{namespace=~\"$namespace\",controller_class=~\"$controller_class\"}, controller_pod) ", "refresh": 1, "regex": "", - "sort": 0, + "skipUrlSync": false, + "sort": 1, "tagValuesQuery": "", - "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": ".*", - "current": { - "tags": [], - "text": "All", - "value": "$__all" + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" }, - "datasource": "${DS_PROMETHEUS}", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "Ingress Namespace", + "multi": false, + "name": "exported_namespace", + "options": [], + "query": "label_values(nginx_ingress_controller_requests{namespace=~\"$namespace\",controller_class=~\"$controller_class\",controller_pod=~\"$controller\"}, exported_namespace) ", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "", "hide": 0, "includeAll": true, "label": "Ingress", "multi": false, "name": "ingress", "options": [], - "query": "label_values(nginx_ingress_controller_requests{namespace=~\"$namespace\",controller_class=~\"$controller_class\",controller_pod=~\"$controller\"}, ingress) ", + "query": "label_values(nginx_ingress_controller_requests{namespace=~\"$namespace\",controller_class=~\"$controller_class\",controller_pod=~\"$controller\",exported_namespace=~\"$exported_namespace\"}, ingress) ", "refresh": 1, "regex": "", - "sort": 2, + "skipUrlSync": false, + "sort": 1, "tagValuesQuery": "", - "tags": [], "tagsQuery": "", "type": "query", "useTags": false @@ -1626,5 +2021,6 @@ "timezone": "browser", "title": "NGINX Ingress controller", "uid": "nginx", - "version": 1 -} + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/deploy/grafana/dashboards/request-handling-performance.json b/deploy/grafana/dashboards/request-handling-performance.json index 1422336ae..cde796384 100644 --- a/deploy/grafana/dashboards/request-handling-performance.json +++ b/deploy/grafana/dashboards/request-handling-performance.json @@ -9,32 +9,35 @@ "pluginName": "Prometheus" } ], - "__elements": [], + "__elements": {}, "__requires": [ { "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "8.3.4" - }, - { - "type": "panel", - "id": "graph", - "name": "Graph (old)", - "version": "" + "version": "10.4.3" }, { "type": "datasource", "id": "prometheus", "name": "Prometheus", "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" } ], "annotations": { "list": [ { "builtIn": 1, - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", @@ -55,160 +58,214 @@ "gnetId": 9614, "graphTooltip": 1, "id": null, - "iteration": 1646929474557, "links": [], "liveNow": false, "panels": [ { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "description": "Total time for NGINX and upstream servers to process a request and send a response", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }, - "hiddenSeries": false, "id": 91, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n 0.5,\n sum by (le)(\n rate(\n nginx_ingress_controller_request_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "interval": "", "legendFormat": ".5", "refId": "D" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n 0.95,\n sum by (le)(\n rate(\n nginx_ingress_controller_request_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "interval": "", "legendFormat": ".95", "refId": "B" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n 0.99,\n sum by (le)(\n rate(\n nginx_ingress_controller_request_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "interval": "", "legendFormat": ".99", "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Request Latency Percentiles", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "description": "The time spent on receiving the response from the upstream server", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 }, - "hiddenSeries": false, "id": 94, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n 0.5,\n sum by (le)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "instant": false, "interval": "", @@ -217,100 +274,116 @@ "refId": "D" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n 0.95,\n sum by (le)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "interval": "", "legendFormat": ".95", "refId": "B" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n 0.99,\n sum by (le)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "interval": "", "legendFormat": ".99", "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Upstream Response Latency Percentiles", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 }, - "hiddenSeries": false, "id": 93, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": " sum by (method, host, path)(\n rate(\n nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n", "interval": "", "intervalFactor": 1, @@ -318,89 +391,97 @@ "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Request Rate by Method and Path", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "reqps", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "description": "For each path observed, its median upstream response time", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 }, - "hiddenSeries": false, "id": 98, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "histogram_quantile(\n .5,\n sum by (le, method, host, path)(\n rate(\n nginx_ingress_controller_response_duration_seconds_bucket{\n ingress =~ \"$ingress\"\n }[5m]\n )\n )\n)", "interval": "", "intervalFactor": 1, @@ -408,89 +489,97 @@ "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Median Upstream Response Time by Method and Path", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "description": "Percentage of 4xx and 5xx responses among all responses.", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 16 }, - "hiddenSeries": false, "id": 100, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null as zero", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "sum by (method, host, path) (rate(nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\",\n status =~ \"[4-5].*\"\n}[5m])) / sum by (method, host, path) (rate(nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\",\n}[5m]))", "interval": "", "intervalFactor": 1, @@ -498,89 +587,97 @@ "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Response Error Rate by Method and Path", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percentunit", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "description": "For each path observed, the sum of upstream request time", "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 16 }, - "hiddenSeries": false, "id": 102, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "sum by (method, host, path) (rate(nginx_ingress_controller_response_duration_seconds_sum{ingress =~ \"$ingress\"}[5m]))", "interval": "", "intervalFactor": 1, @@ -588,88 +685,96 @@ "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Upstream Response Time by Method and Path", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 24 }, - "hiddenSeries": false, "id": 101, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": " sum (\n rate(\n nginx_ingress_controller_request_duration_seconds_count{\n ingress =~ \"$ingress\",\n status =~\"[4-5].*\",\n }[5m]\n )\n ) by(method, host, path, status)\n", "interval": "", "intervalFactor": 1, @@ -677,88 +782,96 @@ "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Response Error Rate by Method and Path", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "reqps", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "fieldConfig": { "defaults": { - "links": [] + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" }, "overrides": [] }, - "fill": 1, - "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 24 }, - "hiddenSeries": false, "id": 99, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, + "pluginVersion": "10.4.3", "targets": [ { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": "sum (\n rate (\n nginx_ingress_controller_response_size_sum {\n ingress =~ \"$ingress\",\n }[5m]\n )\n) by (method, host, path) / sum (\n rate(\n nginx_ingress_controller_response_size_count {\n ingress =~ \"$ingress\",\n }[5m]\n )\n) by (method, host, path)\n", "hide": false, "instant": false, @@ -768,135 +881,22 @@ "refId": "D" }, { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, "expr": " sum (rate(nginx_ingress_controller_response_size_bucket{\n ingress =~ \"$ingress\",\n }[5m])) by (le)\n", "hide": true, "legendFormat": "{{le}}", "refId": "A" } ], - "thresholds": [], - "timeRegions": [], "title": "Average Response Size by Method and Path", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "uid": "${DS_PROMETHEUS}" - }, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "hiddenSeries": false, - "id": 96, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.3.4", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (\n rate(\n nginx_ingress_controller_ingress_upstream_latency_seconds_sum {\n ingress =~ \"$ingress\",\n }[5m]\n)) / sum (\n rate(\n nginx_ingress_controller_ingress_upstream_latency_seconds_count {\n ingress =~ \"$ingress\",\n }[5m]\n )\n)\n", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "average", - "refId": "B" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Upstream Service Latency", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } + "type": "timeseries" } ], "refresh": "30s", - "schemaVersion": 34, - "style": "dark", + "schemaVersion": 39, "tags": [ "nginx" ], @@ -906,7 +906,7 @@ "current": { "selected": false, "text": "Prometheus", - "value": "Prometheus" + "value": "${DS_PROMETHEUS}" }, "hide": 0, "includeAll": false, @@ -924,6 +924,7 @@ "allValue": ".*", "current": {}, "datasource": { + "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "definition": "label_values(nginx_ingress_controller_requests, ingress) ", diff --git a/deploy/static/provider/aws/deploy.yaml b/deploy/static/provider/aws/deploy.yaml index 6bfeeefcb..1ed9b7471 100644 --- a/deploy/static/provider/aws/deploy.yaml +++ b/deploy/static/provider/aws/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -319,8 +320,7 @@ subjects: namespace: ingress-nginx --- apiVersion: v1 -data: - allow-snippet-annotations: "false" +data: null kind: ConfigMap metadata: labels: @@ -328,7 +328,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -344,7 +344,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -377,7 +377,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -400,7 +400,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -422,7 +422,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -446,7 +446,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,13 +489,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -518,7 +523,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -529,7 +534,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -543,18 +548,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -565,7 +575,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -576,7 +586,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -592,18 +602,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -614,34 +629,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -650,7 +642,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -660,6 +652,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml b/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml index a132f38e1..d048683d9 100644 --- a/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml +++ b/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -320,7 +321,6 @@ subjects: --- apiVersion: v1 data: - allow-snippet-annotations: "false" http-snippet: | server { listen 2443; @@ -335,7 +335,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -353,7 +353,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -386,7 +386,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -409,7 +409,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -431,7 +431,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -455,7 +455,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -501,13 +501,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -530,7 +535,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -541,7 +546,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -555,18 +560,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -577,7 +587,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -588,7 +598,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -604,18 +614,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -626,34 +641,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -662,7 +654,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -672,6 +664,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/baremetal/deploy.yaml b/deploy/static/provider/baremetal/deploy.yaml index b35870f51..7248dfd9b 100644 --- a/deploy/static/provider/baremetal/deploy.yaml +++ b/deploy/static/provider/baremetal/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -319,8 +320,7 @@ subjects: namespace: ingress-nginx --- apiVersion: v1 -data: - allow-snippet-annotations: "false" +data: null kind: ConfigMap metadata: labels: @@ -328,7 +328,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -340,7 +340,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -372,7 +372,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -395,7 +395,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -417,7 +417,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -440,7 +440,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -483,13 +483,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -512,7 +517,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -523,7 +528,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -537,18 +542,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -559,7 +569,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -570,7 +580,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -586,18 +596,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -608,34 +623,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -644,7 +636,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -654,6 +646,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/cloud/deploy.yaml b/deploy/static/provider/cloud/deploy.yaml index f1a023d23..08bc7e4bf 100644 --- a/deploy/static/provider/cloud/deploy.yaml +++ b/deploy/static/provider/cloud/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -319,8 +320,7 @@ subjects: namespace: ingress-nginx --- apiVersion: v1 -data: - allow-snippet-annotations: "false" +data: null kind: ConfigMap metadata: labels: @@ -328,7 +328,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -340,7 +340,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -373,7 +373,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -396,7 +396,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -418,7 +418,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -442,7 +442,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -485,13 +485,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -514,7 +519,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -525,7 +530,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -539,18 +544,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -561,7 +571,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -572,7 +582,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -588,18 +598,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -610,34 +625,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -646,7 +638,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -656,6 +648,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/do/deploy.yaml b/deploy/static/provider/do/deploy.yaml index 21d9e7d79..4745c64fc 100644 --- a/deploy/static/provider/do/deploy.yaml +++ b/deploy/static/provider/do/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -320,7 +321,6 @@ subjects: --- apiVersion: v1 data: - allow-snippet-annotations: "false" use-proxy-protocol: "true" kind: ConfigMap metadata: @@ -329,7 +329,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -343,7 +343,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -376,7 +376,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -399,7 +399,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -421,7 +421,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -445,7 +445,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -488,13 +488,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -517,7 +522,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -528,7 +533,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -542,18 +547,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -564,7 +574,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -575,7 +585,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -591,18 +601,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -613,34 +628,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -649,7 +641,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -659,6 +651,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/exoscale/deploy.yaml b/deploy/static/provider/exoscale/deploy.yaml index 720d6a855..8ed5d002c 100644 --- a/deploy/static/provider/exoscale/deploy.yaml +++ b/deploy/static/provider/exoscale/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -319,8 +320,7 @@ subjects: namespace: ingress-nginx --- apiVersion: v1 -data: - allow-snippet-annotations: "false" +data: null kind: ConfigMap metadata: labels: @@ -328,7 +328,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -349,7 +349,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -382,7 +382,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -405,7 +405,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -423,7 +423,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -447,7 +447,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -490,13 +490,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -523,7 +528,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -534,7 +539,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -548,18 +553,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -570,7 +580,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -581,7 +591,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -597,18 +607,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -619,34 +634,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -655,7 +647,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -665,6 +657,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/kind/deploy.yaml b/deploy/static/provider/kind/deploy.yaml index f162a4ce0..b7488f046 100644 --- a/deploy/static/provider/kind/deploy.yaml +++ b/deploy/static/provider/kind/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -319,8 +320,7 @@ subjects: namespace: ingress-nginx --- apiVersion: v1 -data: - allow-snippet-annotations: "false" +data: null kind: ConfigMap metadata: labels: @@ -328,7 +328,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -340,7 +340,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -372,7 +372,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -395,7 +395,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -417,7 +417,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -442,7 +442,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -487,13 +487,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -524,7 +529,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -535,7 +540,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -549,18 +554,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -571,7 +581,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -582,7 +592,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -598,18 +608,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -620,34 +635,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -656,7 +648,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -666,6 +658,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/oracle/deploy.yaml b/deploy/static/provider/oracle/deploy.yaml index 8aa6a4c55..02d18b1bf 100644 --- a/deploy/static/provider/oracle/deploy.yaml +++ b/deploy/static/provider/oracle/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -319,8 +320,7 @@ subjects: namespace: ingress-nginx --- apiVersion: v1 -data: - allow-snippet-annotations: "false" +data: null kind: ConfigMap metadata: labels: @@ -328,7 +328,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -344,7 +344,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -377,7 +377,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -400,7 +400,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -422,7 +422,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -446,7 +446,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,13 +489,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -518,7 +523,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -529,7 +534,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -543,18 +548,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -565,7 +575,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -576,7 +586,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -592,18 +602,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -614,34 +629,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -650,7 +642,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -660,6 +652,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/deploy/static/provider/scw/deploy.yaml b/deploy/static/provider/scw/deploy.yaml index 2ffcd28f8..8ed37d062 100644 --- a/deploy/static/provider/scw/deploy.yaml +++ b/deploy/static/provider/scw/deploy.yaml @@ -15,11 +15,12 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx --- apiVersion: v1 +automountServiceAccountToken: true kind: ServiceAccount metadata: labels: @@ -27,7 +28,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx --- @@ -39,7 +40,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx rules: @@ -129,7 +130,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx rules: @@ -148,7 +149,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx rules: - apiGroups: @@ -230,7 +231,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission rules: - apiGroups: @@ -249,7 +250,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx namespace: ingress-nginx roleRef: @@ -269,7 +270,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission namespace: ingress-nginx roleRef: @@ -288,7 +289,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io @@ -307,7 +308,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission roleRef: apiGroup: rbac.authorization.k8s.io @@ -320,7 +321,6 @@ subjects: --- apiVersion: v1 data: - allow-snippet-annotations: "false" use-proxy-protocol: "true" kind: ConfigMap metadata: @@ -329,7 +329,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx --- @@ -343,7 +343,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -376,7 +376,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller-admission namespace: ingress-nginx spec: @@ -399,7 +399,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-controller namespace: ingress-nginx spec: @@ -421,7 +421,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 spec: containers: - args: @@ -445,7 +445,7 @@ spec: fieldPath: metadata.namespace - name: LD_PRELOAD value: /usr/local/lib/libmimalloc.so - image: registry.k8s.io/ingress-nginx/controller:v1.9.1@sha256:605a737877de78969493a4b1213b21de4ee425d2926906857b98050f57a95b25 + image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -488,13 +488,18 @@ spec: cpu: 100m memory: 90Mi securityContext: - allowPrivilegeEscalation: true + allowPrivilegeEscalation: false capabilities: add: - NET_BIND_SERVICE drop: - ALL + readOnlyRootFilesystem: false + runAsGroup: 82 + runAsNonRoot: true runAsUser: 101 + seccompProfile: + type: RuntimeDefault volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert @@ -517,7 +522,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create namespace: ingress-nginx spec: @@ -528,7 +533,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-create spec: containers: @@ -542,18 +547,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: create securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: batch/v1 @@ -564,7 +574,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch namespace: ingress-nginx spec: @@ -575,7 +585,7 @@ spec: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission-patch spec: containers: @@ -591,18 +601,23 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230407@sha256:543c40fd093964bc9ab509d3e791f9989963021f1e9e4c9c7b6700b02bfb227b + image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4 imagePullPolicy: IfNotPresent name: patch securityContext: allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault nodeSelector: kubernetes.io/os: linux restartPolicy: OnFailure - securityContext: - fsGroup: 2000 - runAsNonRoot: true - runAsUser: 2000 serviceAccountName: ingress-nginx-admission --- apiVersion: networking.k8s.io/v1 @@ -613,34 +628,11 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: nginx spec: controller: k8s.io/ingress-nginx --- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 - name: ingress-nginx-admission - namespace: ingress-nginx -spec: - egress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/component: admission-webhook - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - policyTypes: - - Ingress - - Egress ---- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -649,7 +641,7 @@ metadata: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx - app.kubernetes.io/version: 1.9.1 + app.kubernetes.io/version: 1.12.0 name: ingress-nginx-admission webhooks: - admissionReviewVersions: @@ -659,6 +651,7 @@ webhooks: name: ingress-nginx-controller-admission namespace: ingress-nginx path: /networking/v1/ingresses + port: 443 failurePolicy: Fail matchPolicy: Equivalent name: validate.nginx.ingress.kubernetes.io diff --git a/docs/OWNERS b/docs/OWNERS index e8b886e5b..245cb8688 100644 --- a/docs/OWNERS +++ b/docs/OWNERS @@ -1,7 +1,7 @@ -# See the OWNERS docs: https://github.com/kubernetes/community/blob/master/contributors/guide/owners.md +# See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners approvers: - ingress-nginx-docs-maintainers labels: -- area/docs \ No newline at end of file +- area/docs diff --git a/docs/deploy/baremetal.md b/docs/deploy/baremetal.md index f5ff54174..077d1e758 100644 --- a/docs/deploy/baremetal.md +++ b/docs/deploy/baremetal.md @@ -118,6 +118,8 @@ requests. ![NodePort request flow](../images/baremetal/nodeport.jpg) +You can **customize the exposed node port numbers** by setting the `controller.service.nodePorts.*` Helm values, but they still have to be in the 30000-32767 range. + !!! example Given the NodePort `30100` allocated to the `ingress-nginx` Service @@ -152,7 +154,7 @@ requests. This approach has a few other limitations one ought to be aware of: -* **Source IP address** +### Source IP address Services of type NodePort perform [source address translation][nodeport-nat] by default. This means the source IP of a HTTP request is always **the IP address of the Kubernetes node that received the request** from the perspective of @@ -191,7 +193,9 @@ field of the `ingress-nginx` Service spec to `Local` ([example][preserve-ip]). Requests sent to `host-2` and `host-3` would be forwarded to NGINX and original client's IP would be preserved, while requests to `host-1` would get dropped because there is no NGINX replica running on that node. -* **Ingress status** +Other ways to preserve the source IP in a NodePort setup are described here: [Source IP address](https://kubernetes.github.io/ingress-nginx/user-guide/miscellaneous/#source-ip-address). + +### Ingress status Because NodePort Services do not get a LoadBalancerIP assigned by definition, the Ingress-Nginx Controller **does not update the status of Ingress objects it manages**. @@ -241,7 +245,7 @@ Service. test-ingress myapp.example.com 203.0.113.1,203.0.113.2,203.0.113.3 80 ``` -* **Redirects** +### Redirects As NGINX is **not aware of the port translation operated by the NodePort Service**, backend applications are responsible for generating redirect URLs that take into account the URL used by external clients, including the NodePort. @@ -262,7 +266,7 @@ for generating redirect URLs that take into account the URL used by external cli [nodeport-def]: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport [nodeport-nat]: https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-nodeport [pod-assign]: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ -[preserve-ip]: https://github.com/kubernetes/ingress-nginx/blob/nginx-0.19.0/deploy/provider/aws/service-nlb.yaml#L12-L14 +[preserve-ip]: https://github.com/kubernetes/ingress-nginx/blob/ingress-nginx-3.15.2/deploy/static/provider/aws/deploy.yaml#L290 ## Via the host network @@ -326,13 +330,13 @@ configuration of the corresponding manifest at the user's discretion. Like with NodePorts, this approach has a few quirks it is important to be aware of. -* **DNS resolution** +### DNS resolution Pods configured with `hostNetwork: true` do not use the internal DNS resolver (i.e. *kube-dns* or *CoreDNS*), unless their `dnsPolicy` spec field is set to [`ClusterFirstWithHostNet`][dnspolicy]. Consider using this setting if NGINX is expected to resolve internal names for any reason. -* **Ingress status** +### Ingress status Because there is no Service exposing the Ingress-Nginx Controller in a configuration using the host network, the default `--publish-service` flag used in standard cloud setups **does not apply** and the status of all Ingress objects remains diff --git a/docs/deploy/hardening-guide.md b/docs/deploy/hardening-guide.md index cfbdb1466..2726b1a07 100644 --- a/docs/deploy/hardening-guide.md +++ b/docs/deploy/hardening-guide.md @@ -1,6 +1,8 @@ # Hardening Guide +Do not use in multi-tenant Kubernetes production installations. This project assumes that users that can create Ingress objects are administrators of the cluster. + ## Overview There are several ways to do hardening and securing of nginx. In this documentation two guides are used, the guides are overlapping in some points: diff --git a/docs/deploy/index.md b/docs/deploy/index.md index ae28c2502..717c479ac 100644 --- a/docs/deploy/index.md +++ b/docs/deploy/index.md @@ -6,10 +6,10 @@ There are multiple ways to install the Ingress-Nginx Controller: - with `kubectl apply`, using YAML manifests; - with specific addons (e.g. for [minikube](#minikube) or [MicroK8s](#microk8s)). -On most Kubernetes clusters, the ingress controller will work without requiring any extra configuration. If you want to -get started as fast as possible, you can check the [quick start](#quick-start) instructions. However, in many -environments, you can improve the performance or get better logs by enabling extra features. We recommend that you -check the [environment-specific instructions](#environment-specific-instructions) for details about optimizing the +On most Kubernetes clusters, the ingress controller will work without requiring any extra configuration. If you want to +get started as fast as possible, you can check the [quick start](#quick-start) instructions. However, in many +environments, you can improve the performance or get better logs by enabling extra features. We recommend that you +check the [environment-specific instructions](#environment-specific-instructions) for details about optimizing the ingress controller for your particular environment or cloud provider. ## Contents @@ -34,11 +34,11 @@ ingress controller for your particular environment or cloud provider. - ... [Bare-metal](#bare-metal-clusters) - [Miscellaneous](#miscellaneous) - ## Quick start @@ -65,14 +65,38 @@ It will install the controller in the `ingress-nginx` namespace, creating that n helm show values ingress-nginx --repo https://kubernetes.github.io/ingress-nginx ``` +!!! attention "Helm install on AWS/GCP/Azure/Other providers" + The *ingress-nginx-controller helm-chart is a generic install out of the box*. The default set of helm values is **not** configured for installation on any infra provider. The annotations that are applicable to the cloud provider must be customized by the users.
+ See [AWS LB Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/annotations/).
+ Examples of some annotations recommended (healthecheck ones are required for target-type IP) for the service resource of `--type LoadBalancer` on AWS are below: + ```yaml + annotations: + service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: deregistration_delay.timeout_seconds=270 + service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip + service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: /healthz + service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "10254" + service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: http + service.beta.kubernetes.io/aws-load-balancer-healthcheck-success-codes: 200-299 + service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing" + service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp + service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true" + service.beta.kubernetes.io/aws-load-balancer-type: nlb + service.beta.kubernetes.io/aws-load-balancer-manage-backend-security-group-rules: "true" + service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true" + service.beta.kubernetes.io/aws-load-balancer-security-groups: "sg-something1 sg-something2" + service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "somebucket" + service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "ingress-nginx" + service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "5" + ``` + **If you don't have Helm** or if you prefer to use a YAML manifest, you can run the following command instead: ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml ``` !!! info - The YAML manifest in the command above was generated with `helm template`, so you will end up with almost the same + The YAML manifest in the command above was generated with `helm template`, so you will end up with almost the same resources as if you had used Helm to install the controller. !!! attention @@ -83,6 +107,7 @@ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/cont ### Firewall configuration To check which ports are used by your installation of ingress-nginx, look at the output of `kubectl -n ingress-nginx get pod -o yaml`. In general, you need: + - Port 8443 open between all hosts on which the kubernetes nodes are running. This is used for the ingress-nginx [admission controller](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/). - Port 80 (for HTTP) and/or 443 (for HTTPS) open to the public on the kubernetes nodes to which the DNS of your apps are pointing. @@ -94,7 +119,7 @@ A few pods should start in the `ingress-nginx` namespace: kubectl get pods --namespace=ingress-nginx ``` -After a while, they should all be running. The following command will wait for the ingress controller pod to be up, +After a while, they should all be running. The following command will wait for the ingress controller pod to be up, running, and ready: ```console @@ -104,7 +129,6 @@ kubectl wait --namespace ingress-nginx \ --timeout=120s ``` - ### Local testing Let's create a simple web server and the associated service: @@ -135,6 +159,7 @@ kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller [This issue](https://github.com/kubernetes/ingress-nginx/issues/10014#issuecomment-1567791549described) shows a typical DNS problem and its solution. At this point, you can access your deployment using curl ; + ```console curl --resolve demo.localdev.me:8080:127.0.0.1 http://demo.localdev.me:8080 ``` @@ -143,7 +168,7 @@ You should see a HTML response containing text like **"It works!"**. ### Online testing -If your Kubernetes cluster is a "real" cluster that supports services of type `LoadBalancer`, it will have allocated an +If your Kubernetes cluster is a "real" cluster that supports services of type `LoadBalancer`, it will have allocated an external IP address or FQDN to the ingress controller. You can see that IP address or FQDN with the following command: @@ -152,10 +177,10 @@ You can see that IP address or FQDN with the following command: kubectl get service ingress-nginx-controller --namespace=ingress-nginx ``` -It will be the `EXTERNAL-IP` field. If that field shows ``, this means that your Kubernetes cluster wasn't +It will be the `EXTERNAL-IP` field. If that field shows ``, this means that your Kubernetes cluster wasn't able to provision the load balancer (generally, this is because it doesn't support services of type `LoadBalancer`). -Once you have the external IP address (or FQDN), set up a DNS record pointing to it. Then you can create an ingress +Once you have the external IP address (or FQDN), set up a DNS record pointing to it. Then you can create an ingress resource. The following example assumes that you have set up a DNS record for `www.demo.io`: ```console @@ -164,13 +189,13 @@ kubectl create ingress demo --class=nginx \ ``` Alternatively, the above command can be rewritten as follows for the ```--rule``` command and below. + ```console kubectl create ingress demo --class=nginx \ --rule www.demo.io/=demo:80 ``` - -You should then be able to see the "It works!" page when you connect to http://www.demo.io/. Congratulations, +You should then be able to see the "It works!" page when you connect to . Congratulations, you are serving a public website hosted on a Kubernetes cluster! 🎉 ## Environment-specific instructions @@ -202,19 +227,19 @@ Kubernetes is available in Docker Desktop: - Mac, from [version 18.06.0-ce](https://docs.docker.com/docker-for-mac/release-notes/#stable-releases-of-2018) - Windows, from [version 18.06.0-ce](https://docs.docker.com/docker-for-windows/release-notes/#docker-community-edition-18060-ce-win70-2018-07-25) -First, make sure that Kubernetes is enabled in the Docker settings. The command `kubectl get nodes` should show a +First, make sure that Kubernetes is enabled in the Docker settings. The command `kubectl get nodes` should show a single node called `docker-desktop`. The ingress controller can be installed on Docker Desktop using the default [quick start](#quick-start) instructions. -On most systems, if you don't have any other service of type `LoadBalancer` bound to port 80, the ingress controller -will be assigned the `EXTERNAL-IP` of `localhost`, which means that it will be reachable on localhost:80. If that -doesn't work, you might have to fall back to the `kubectl port-forward` method described in the +On most systems, if you don't have any other service of type `LoadBalancer` bound to port 80, the ingress controller +will be assigned the `EXTERNAL-IP` of `localhost`, which means that it will be reachable on localhost:80. If that +doesn't work, you might have to fall back to the `kubectl port-forward` method described in the [local testing section](#local-testing). #### Rancher Desktop -Rancher Desktop provides Kubernetes and Container Management on the desktop. Kubernetes is enabled by default in Rancher Desktop. +Rancher Desktop provides Kubernetes and Container Management on the desktop. Kubernetes is enabled by default in Rancher Desktop. Rancher Desktop uses K3s under the hood, which in turn uses Traefik as the default ingress controller for the Kubernetes cluster. To use Ingress-Nginx Controller in place of the default Traefik, disable Traefik from Preference > Kubernetes menu. @@ -222,18 +247,18 @@ Once traefik is disabled, the Ingress-Nginx Controller can be installed on Ranch ### Cloud deployments -If the load balancers of your cloud provider do active healthchecks on their backends (most do), you can change the -`externalTrafficPolicy` of the ingress controller Service to `Local` (instead of the default `Cluster`) to save an -extra hop in some cases. If you're installing with Helm, this can be done by adding +If the load balancers of your cloud provider do active healthchecks on their backends (most do), you can change the +`externalTrafficPolicy` of the ingress controller Service to `Local` (instead of the default `Cluster`) to save an +extra hop in some cases. If you're installing with Helm, this can be done by adding `--set controller.service.externalTrafficPolicy=Local` to the `helm install` or `helm upgrade` command. -Furthermore, if the load balancers of your cloud provider support the PROXY protocol, you can enable it, and it will -let the ingress controller see the real IP address of the clients. Otherwise, it will generally see the IP address of -the upstream load balancer. This must be done both in the ingress controller -(with e.g. `--set controller.config.use-proxy-protocol=true`) and in the cloud provider's load balancer configuration +Furthermore, if the load balancers of your cloud provider support the PROXY protocol, you can enable it, and it will +let the ingress controller see the real IP address of the clients. Otherwise, it will generally see the IP address of +the upstream load balancer. This must be done both in the ingress controller +(with e.g. `--set controller.config.use-proxy-protocol=true`) and in the cloud provider's load balancer configuration to function correctly. -In the following sections, we provide YAML manifests that enable these options when possible, using the specific +In the following sections, we provide YAML manifests that enable these options when possible, using the specific options of various cloud providers. #### AWS @@ -242,54 +267,57 @@ In AWS, we use a Network load balancer (NLB) to expose the Ingress-Nginx Control !!! info The provided templates illustrate the setup for legacy in-tree service load balancer for AWS NLB. - AWS provides the documentation on how to use - [Network load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/network-load-balancing.html) + AWS provides the documentation on how to use + [Network load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/network-load-balancing.html) with [AWS Load Balancer Controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller). ##### Network Load Balancer (NLB) ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/aws/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/aws/deploy.yaml ``` ##### TLS termination in AWS Load Balancer (NLB) -By default, TLS is terminated in the ingress controller. But it is also possible to terminate TLS in the Load Balancer. +By default, TLS is terminated in the ingress controller. But it is also possible to terminate TLS in the Load Balancer. This section explains how to do that on AWS using an NLB. -1. Download the [deploy.yaml](https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml) template +1. Download the [deploy.yaml](https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml) template ```console - wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml + wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml ``` 2. Edit the file and change the VPC CIDR in use for the Kubernetes cluster: + ``` proxy-real-ip-cidr: XXX.XXX.XXX/XX ``` 3. Change the AWS Certificate Manager (ACM) ID as well: + ``` arn:aws:acm:us-west-2:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX ``` 4. Deploy the manifest: + ```console kubectl apply -f deploy.yaml ``` ##### NLB Idle Timeouts -Idle timeout value for TCP flows is 350 seconds and +Idle timeout value for TCP flows is 350 seconds and [cannot be modified](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#connection-idle-timeout). -For this reason, you need to ensure the -[keepalive_timeout](https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout) +For this reason, you need to ensure the +[keepalive_timeout](https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout) value is configured less than 350 seconds to work as expected. By default, NGINX `keepalive_timeout` is set to `75s`. -More information with regard to timeouts can be found in the +More information with regard to timeouts can be found in the [official AWS documentation](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#connection-idle-timeout) #### GCE-GKE @@ -304,18 +332,17 @@ kubectl create clusterrolebinding cluster-admin-binding \ Then, the ingress controller can be installed like this: - ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml ``` !!! warning - For private clusters, you will need to either add a firewall rule that allows master nodes access to - port `8443/tcp` on worker nodes, or change the existing rule that allows access to port `80/tcp`, `443/tcp` and - `10254/tcp` to also allow access to port `8443/tcp`. More information can be found in the + For private clusters, you will need to either add a firewall rule that allows master nodes access to + port `8443/tcp` on worker nodes, or change the existing rule that allows access to port `80/tcp`, `443/tcp` and + `10254/tcp` to also allow access to port `8443/tcp`. More information can be found in the [Official GCP Documentation](https://cloud.google.com/load-balancing/docs/tcp/setting-up-tcp#config-hc-firewall). - See the [GKE documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#add_firewall_rules) + See the [GKE documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#add_firewall_rules) on adding rules and the [Kubernetes issue](https://github.com/kubernetes/kubernetes/issues/79739) for more detail. Proxy-protocol is supported in GCE check the [Official Documentations on how to enable.](https://cloud.google.com/load-balancing/docs/tcp/setting-up-tcp#proxy-protocol) @@ -323,7 +350,7 @@ Proxy-protocol is supported in GCE check the [Official Documentations on how to #### Azure ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml ``` More information with regard to Azure annotations for ingress controller can be found in the [official AKS documentation](https://docs.microsoft.com/en-us/azure/aks/ingress-internal-ip#create-an-ingress-controller). @@ -331,34 +358,36 @@ More information with regard to Azure annotations for ingress controller can be #### Digital Ocean ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/do/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/do/deploy.yaml ``` -- By default the service object of the ingress-nginx-controller for Digital-Ocean, only configures one annotation. Its this one `service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "true"`. While this makes the service functional, it was reported that the Digital-Ocean LoadBalancer graphs shows `no data`, unless a few other annotations are also configured. Some of these other annotations require values that can not be generic and hence not forced in a out-of-the-box installation. These annotations and a discussion on them is well documented in [this issue](https://github.com/kubernetes/ingress-nginx/issues/8965). Please refer to the issue to add annotations, with values specific to user, to get graphs of the DO-LB populated with data. +- By default the service object of the ingress-nginx-controller for Digital-Ocean, only configures one annotation. Its this one `service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "true"`. While this makes the service functional, it was reported that the Digital-Ocean LoadBalancer graphs shows `no data`, unless a few other annotations are also configured. Some of these other annotations require values that can not be generic and hence not forced in a out-of-the-box installation. These annotations and a discussion on them is well documented in [this issue](https://github.com/kubernetes/ingress-nginx/issues/8965). Please refer to the issue to add annotations, with values specific to user, to get graphs of the DO-LB populated with data. #### Scaleway ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/scw/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/scw/deploy.yaml ``` +Refer to the [dedicated tutorial](https://www.scaleway.com/en/docs/tutorials/proxy-protocol-v2-load-balancer/#configuring-proxy-protocol-for-ingress-nginx) in the Scaleway documentation for configuring the proxy protocol for ingress-nginx with the Scaleway load balancer. + #### Exoscale ```console kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/exoscale/deploy.yaml ``` -The full list of annotations supported by Exoscale is available in the Exoscale Cloud Controller Manager +The full list of annotations supported by Exoscale is available in the Exoscale Cloud Controller Manager [documentation](https://github.com/exoscale/exoscale-cloud-controller-manager/blob/master/docs/service-loadbalancer.md). #### Oracle Cloud Infrastructure ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml ``` -A -[complete list of available annotations for Oracle Cloud Infrastructure](https://github.com/oracle/oci-cloud-controller-manager/blob/master/docs/load-balancer-annotations.md) +A +[complete list of available annotations for Oracle Cloud Infrastructure](https://github.com/oracle/oci-cloud-controller-manager/blob/master/docs/load-balancer-annotations.md) can be found in the [OCI Cloud Controller Manager](https://github.com/oracle/oci-cloud-controller-manager) documentation. #### OVHcloud @@ -373,15 +402,15 @@ You can find the [complete tutorial](https://docs.ovh.com/gb/en/kubernetes/insta ### Bare metal clusters -This section is applicable to Kubernetes clusters deployed on bare metal servers, as well as "raw" VMs where Kubernetes +This section is applicable to Kubernetes clusters deployed on bare metal servers, as well as "raw" VMs where Kubernetes was installed manually, using generic Linux distros (like CentOS, Ubuntu...) -For quick testing, you can use a -[NodePort](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport). +For quick testing, you can use a +[NodePort](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport). This should work on almost every cluster, but it will typically use a port in the range 30000-32767. ```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/baremetal/deploy.yaml ``` For more information about bare metal deployments (and how to use port 80 instead of a random port in the 30000-32767 range), @@ -401,20 +430,20 @@ kubectl exec $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version ### Scope -By default, the controller watches Ingress objects from all namespaces. If you want to change this behavior, -use the flag `--watch-namespace` or check the Helm chart value `controller.scope` to limit the controller to a single -namespace. +By default, the controller watches Ingress objects from all namespaces. If you want to change this behavior, +use the flag `--watch-namespace` or check the Helm chart value `controller.scope` to limit the controller to a single +namespace. Although the use of this flag is not popular, one important fact to note is that the secret containing the default-ssl-certificate needs to also be present in the watched namespace(s). -See also -[“How to easily install multiple instances of the Ingress NGINX controller in the same cluster”](https://kubernetes.github.io/ingress-nginx/#how-to-easily-install-multiple-instances-of-the-ingress-nginx-controller-in-the-same-cluster) +See also +[“How to easily install multiple instances of the Ingress NGINX controller in the same cluster”](https://kubernetes.github.io/ingress-nginx/#how-to-easily-install-multiple-instances-of-the-ingress-nginx-controller-in-the-same-cluster) for more details. ### Webhook network access !!! warning The controller uses an [admission webhook](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) - to validate Ingress definitions. Make sure that you don't have - [Network policies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) + to validate Ingress definitions. Make sure that you don't have + [Network policies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) or additional firewalls preventing connections from the API server to the `ingress-nginx-controller-admission` service. ### Certificate generation @@ -435,22 +464,24 @@ You can wait until it is ready to run the next command: ### Running on Kubernetes versions older than 1.19 -Ingress resources evolved over time. They started with `apiVersion: extensions/v1beta1`, +Ingress resources evolved over time. They started with `apiVersion: extensions/v1beta1`, then moved to `apiVersion: networking.k8s.io/v1beta1` and more recently to `apiVersion: networking.k8s.io/v1`. Here is how these Ingress versions are supported in Kubernetes: + - before Kubernetes 1.19, only `v1beta1` Ingress resources are supported - from Kubernetes 1.19 to 1.21, both `v1beta1` and `v1` Ingress resources are supported - in Kubernetes 1.22 and above, only `v1` Ingress resources are supported And here is how these Ingress versions are supported in Ingress-Nginx Controller: + - before version 1.0, only `v1beta1` Ingress resources are supported - in version 1.0 and above, only `v1` Ingress resources are -As a result, if you're running Kubernetes 1.19 or later, you should be able to use the latest version of the NGINX -Ingress Controller; but if you're using an old version of Kubernetes (1.18 or earlier) you will have to use version 0.X +As a result, if you're running Kubernetes 1.19 or later, you should be able to use the latest version of the NGINX +Ingress Controller; but if you're using an old version of Kubernetes (1.18 or earlier) you will have to use version 0.X of the Ingress-Nginx Controller (e.g. version 0.49). -The Helm chart of the Ingress-Nginx Controller switched to version 1 in version 4 of the chart. In other words, if -you're running Kubernetes 1.19 or earlier, you should use version 3.X of the chart (this can be done by adding +The Helm chart of the Ingress-Nginx Controller switched to version 1 in version 4 of the chart. In other words, if +you're running Kubernetes 1.19 or earlier, you should use version 3.X of the chart (this can be done by adding `--version='<4'` to the `helm install` command ). diff --git a/docs/developer-guide/getting-started.md b/docs/developer-guide/getting-started.md index 4b7ed46f0..e4bb661d4 100644 --- a/docs/developer-guide/getting-started.md +++ b/docs/developer-guide/getting-started.md @@ -19,6 +19,10 @@ Install [Go 1.14](https://golang.org/dl/) or later. Install [Docker](https://docs.docker.com/engine/install/) (v19.03.0 or later with experimental feature on) +Install [kubectl](https://kubernetes.io/docs/tasks/tools/) (1.24.0 or higher) + +Install [Kind](https://kind.sigs.k8s.io/) + !!! important The majority of make tasks run as docker containers diff --git a/docs/e2e-tests.md b/docs/e2e-tests.md index 0a6ca0a7d..43726f5a1 100644 --- a/docs/e2e-tests.md +++ b/docs/e2e-tests.md @@ -7,18 +7,17 @@ Do not try to edit it manually. ### [[Admission] admission controller](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L39) -- [reject ingress with global-rate-limit annotations when memcached is not configured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L47) -- [should not allow overlaps of host and paths without canary annotations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L74) -- [should allow overlaps of host and paths with canary annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L91) -- [should block ingress with invalid path](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L112) -- [should return an error if there is an error validating the ingress definition](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L129) -- [should return an error if there is an invalid value in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L149) -- [should return an error if there is a forbidden value in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L163) -- [should return an error if there is an invalid path and wrong pathType is set](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L177) -- [should not return an error if the Ingress V1 definition is valid with Ingress Class](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L211) -- [should not return an error if the Ingress V1 definition is valid with IngressClass annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L227) -- [should return an error if the Ingress V1 definition contains invalid annotations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L243) -- [should not return an error for an invalid Ingress when it has unknown class](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L263) +- [should not allow overlaps of host and paths without canary annotations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L47) +- [should allow overlaps of host and paths with canary annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L64) +- [should block ingress with invalid path](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L85) +- [should return an error if there is an error validating the ingress definition](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L102) +- [should return an error if there is an invalid value in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L116) +- [should return an error if there is a forbidden value in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L130) +- [should return an error if there is an invalid path and wrong pathType is set](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L144) +- [should not return an error if the Ingress V1 definition is valid with Ingress Class](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L178) +- [should not return an error if the Ingress V1 definition is valid with IngressClass annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L194) +- [should return an error if the Ingress V1 definition contains invalid annotations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L210) +- [should not return an error for an invalid Ingress when it has unknown class](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/admission/admission.go#L224) ### [affinity session-cookie-name](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/affinity.go#L43) - [should set sticky cookie SERVERID](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/affinity.go#L50) - [should change cookie name on ingress definition change](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/affinity.go#L72) @@ -54,24 +53,24 @@ Do not try to edit it manually. - [should return status code 200 when authentication is configured with a map and Authorization header is sent](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L205) - [should return status code 401 when authentication is configured with invalid content and Authorization header is sent](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L233) - [proxy_set_header My-Custom-Header 42;](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L272) -- [proxy_set_header My-Custom-Header 42;](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L298) -- [proxy_set_header 'My-Custom-Header' '42';](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L324) -- [user retains cookie by default](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L432) -- [user does not retain cookie if upstream returns error status code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L443) -- [user with annotated ingress retains cookie if upstream returns error status code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L454) -- [should return status code 200 when signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L493) -- [should redirect to signin url when not signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L502) -- [keeps processing new ingresses even if one of the existing ingresses is misconfigured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L513) -- [should overwrite Foo header with auth response](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L537) -- [should return status code 200 when signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L713) -- [should redirect to signin url when not signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L722) -- [keeps processing new ingresses even if one of the existing ingresses is misconfigured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L733) -- [should return status code 200 when signed in after auth backend is deleted ](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L792) -- [should deny login for different location on same server](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L812) -- [should deny login for different servers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L840) -- [should redirect to signin url when not signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L869) -- [should return 503 (location was denied)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L899) -- [should add error to the config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L907) +- [proxy_set_header My-Custom-Header 42;](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L292) +- [proxy_set_header 'My-Custom-Header' '42';](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L311) +- [user retains cookie by default](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L420) +- [user does not retain cookie if upstream returns error status code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L431) +- [user with annotated ingress retains cookie if upstream returns error status code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L442) +- [should return status code 200 when signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L481) +- [should redirect to signin url when not signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L490) +- [keeps processing new ingresses even if one of the existing ingresses is misconfigured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L501) +- [should overwrite Foo header with auth response](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L525) +- [should return status code 200 when signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L701) +- [should redirect to signin url when not signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L710) +- [keeps processing new ingresses even if one of the existing ingresses is misconfigured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L721) +- [should return status code 200 when signed in after auth backend is deleted ](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L780) +- [should deny login for different location on same server](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L800) +- [should deny login for different servers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L828) +- [should redirect to signin url when not signed in](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L857) +- [should return 503 (location was denied)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L887) +- [should add error to the config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/auth.go#L895) ### [auth-tls-*](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L31) - [should set sslClientCertificate, sslVerifyClient and sslVerifyDepth with auth-tls-secret](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L38) - [should set valid auth-tls-secret, sslVerify to off, and sslVerifyDepth to 2](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L86) @@ -80,7 +79,8 @@ Do not try to edit it manually. - [should validate auth-tls-verify-client](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L208) - [should return 403 using auth-tls-match-cn with no matching CN from client](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L267) - [should return 200 using auth-tls-match-cn with matching CN from client](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L296) -- [should return 200 using auth-tls-match-cn where atleast one of the regex options matches CN from client](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L325) +- [should reload the nginx config when auth-tls-match-cn is updated](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L325) +- [should return 200 using auth-tls-match-cn where atleast one of the regex options matches CN from client](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/authtls.go#L368) ### [backend-protocol](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/backendprotocol.go#L29) - [should set backend protocol to https:// and use proxy_pass](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/backendprotocol.go#L36) - [should set backend protocol to https:// and use proxy_pass with lowercase annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/backendprotocol.go#L51) @@ -147,6 +147,12 @@ Do not try to edit it manually. - [should not allow - portless origin with wildcard origin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/cors.go#L520) - [should allow correct origins - missing subdomain + origin with wildcard origin and correct origin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/cors.go#L540) - [should allow - missing origins (should allow all origins)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/cors.go#L576) +- [should allow correct origin but not others - cors allow origin annotations contain trailing comma](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/cors.go#L636) +- [should allow - origins with non-http[s] protocols](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/cors.go#L673) +### [custom-headers-*](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/customheaders.go#L33) +- [should return status code 200 when no custom-headers is configured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/customheaders.go#L40) +- [should return status code 503 when custom-headers is configured with an invalid secret](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/customheaders.go#L57) +- [more_set_headers 'My-Custom-Header' '42';](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/customheaders.go#L78) ### [custom-http-errors](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/customhttperrors.go#L34) - [configures Nginx correctly](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/customhttperrors.go#L41) ### [default-backend](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/default_backend.go#L29) @@ -155,6 +161,8 @@ Do not try to edit it manually. - [disable-access-log set access_log off](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/disableaccesslog.go#L35) - [disable-http-access-log set access_log off](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/disableaccesslog.go#L53) - [disable-stream-access-log set access_log off](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/disableaccesslog.go#L71) +### [disable-proxy-intercept-errors](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/disableproxyintercepterrors.go#L31) +- [configures Nginx correctly](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/disableproxyintercepterrors.go#L39) ### [backend-protocol - FastCGI](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/fastcgi.go#L30) - [should use fastcgi_pass in the configuration file](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/fastcgi.go#L37) - [should add fastcgi_index in the configuration file](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/fastcgi.go#L54) @@ -165,13 +173,13 @@ Do not try to edit it manually. ### [from-to-www-redirect](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/fromtowwwredirect.go#L31) - [should redirect from www HTTP to HTTP](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/fromtowwwredirect.go#L38) - [should redirect from www HTTPS to HTTPS](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/fromtowwwredirect.go#L64) -### [annotation-global-rate-limit](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/globalratelimit.go#L30) -- [generates correct configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/globalratelimit.go#L38) -### [backend-protocol - GRPC](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L40) -- [should use grpc_pass in the configuration file](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L43) -- [should return OK for service with backend protocol GRPC](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L68) -- [authorization metadata should be overwritten by external auth response headers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L128) -- [should return OK for service with backend protocol GRPCS](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L189) +### [backend-protocol - GRPC](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L45) +- [should use grpc_pass in the configuration file](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L48) +- [should return OK for service with backend protocol GRPC](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L71) +- [authorization metadata should be overwritten by external auth response headers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L132) +- [should return OK for service with backend protocol GRPCS](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L193) +- [should return OK when request not exceed timeout](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L260) +- [should return Error when request exceed timeout](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/grpc.go#L303) ### [http2-push-preload](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/http2pushpreload.go#L27) - [enable the http2-push-preload directive](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/http2pushpreload.go#L34) ### [allowlist-source-range](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/ipallowlist.go#L27) @@ -195,14 +203,14 @@ Do not try to edit it manually. - [should enable modsecurity with transaction ID and OWASP rules](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L64) - [should disable modsecurity](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L85) - [should enable modsecurity with snippet](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L102) -- [should enable modsecurity without using 'modsecurity on;'](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L130) -- [should disable modsecurity using 'modsecurity off;'](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L153) -- [should enable modsecurity with snippet and block requests](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L175) -- [should enable modsecurity globally and with modsecurity-snippet block requests](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L214) -- [should enable modsecurity when enable-owasp-modsecurity-crs is set to true](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L253) -- [should enable modsecurity through the config map](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L292) -- [should enable modsecurity through the config map but ignore snippet as disabled by admin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L338) -- [should disable default modsecurity conf setting when modsecurity-snippet is specified](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L380) +- [should enable modsecurity without using 'modsecurity on;'](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L124) +- [should disable modsecurity using 'modsecurity off;'](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L147) +- [should enable modsecurity with snippet and block requests](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L169) +- [should enable modsecurity globally and with modsecurity-snippet block requests](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L202) +- [should enable modsecurity when enable-owasp-modsecurity-crs is set to true](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L235) +- [should enable modsecurity through the config map](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L269) +- [should enable modsecurity through the config map but ignore snippet as disabled by admin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L309) +- [should disable default modsecurity conf setting when modsecurity-snippet is specified](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/modsecurity/modsecurity.go#L354) ### [preserve-trailing-slash](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/preservetrailingslash.go#L27) - [should allow preservation of trailing slashes](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/preservetrailingslash.go#L34) ### [proxy-*](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L30) @@ -214,10 +222,10 @@ Do not try to edit it manually. - [should set valid proxy timeouts](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L117) - [should not set invalid proxy timeouts](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L138) - [should turn on proxy-buffering](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L159) -- [should turn off proxy-request-buffering](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L181) -- [should build proxy next upstream](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L196) -- [should setup proxy cookies](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L217) -- [should change the default proxy HTTP version](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L235) +- [should turn off proxy-request-buffering](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L184) +- [should build proxy next upstream](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L199) +- [should setup proxy cookies](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L220) +- [should change the default proxy HTTP version](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxy.go#L238) ### [proxy-ssl-*](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxyssl.go#L32) - [should set valid proxy-ssl-secret](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxyssl.go#L39) - [should set valid proxy-ssl-secret, proxy-ssl-verify to on, proxy-ssl-verify-depth to 2, and proxy-ssl-server-name to on](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/proxyssl.go#L66) @@ -227,6 +235,10 @@ Do not try to edit it manually. ### [permanent-redirect permanent-redirect-code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/redirect.go#L30) - [should respond with a standard redirect code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/redirect.go#L33) - [should respond with a custom redirect code](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/redirect.go#L61) +### [relative-redirects](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/relativeredirects.go#L35) +- [configures Nginx correctly](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/relativeredirects.go#L43) +- [should respond with absolute URL in Location](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/relativeredirects.go#L61) +- [should respond with relative URL in Location](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/relativeredirects.go#L85) ### [rewrite-target use-regex enable-rewrite-log](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/rewrite.go#L32) - [should write rewrite logs](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/rewrite.go#L39) - [should use correct longest path match](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/rewrite.go#L68) @@ -243,12 +255,13 @@ Do not try to edit it manually. - [should not use the Service Cluster IP and Port](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/serviceupstream.go#L97) ### [configuration-snippet](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/snippet.go#L28) - [set snippet more_set_headers in all locations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/snippet.go#L34) -- [drops snippet more_set_header in all locations if disabled by admin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/snippet.go#L73) +- [drops snippet more_set_header in all locations if disabled by admin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/snippet.go#L66) ### [ssl-ciphers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/sslciphers.go#L28) - [should change ssl ciphers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/sslciphers.go#L35) +- [should keep ssl ciphers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/sslciphers.go#L58) ### [stream-snippet](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/streamsnippet.go#L34) - [should add value of stream-snippet to nginx config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/streamsnippet.go#L41) -- [should add stream-snippet and drop annotations per admin config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/streamsnippet.go#L94) +- [should add stream-snippet and drop annotations per admin config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/streamsnippet.go#L88) ### [upstream-hash-by-*](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/upstreamhashby.go#L79) - [should connect to the same pod](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/upstreamhashby.go#L86) - [should connect to the same subset of pods](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/upstreamhashby.go#L95) @@ -257,6 +270,9 @@ Do not try to edit it manually. ### [x-forwarded-prefix](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/xforwardedprefix.go#L28) - [should set the X-Forwarded-Prefix to the annotation value](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/xforwardedprefix.go#L35) - [should not add X-Forwarded-Prefix if the annotation value is empty](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/annotations/xforwardedprefix.go#L57) +### [[CGroups] cgroups](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/cgroups/cgroups.go#L32) +- [detects cgroups version v1](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/cgroups/cgroups.go#L40) +- [detect cgroups version v2](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/cgroups/cgroups.go#L83) ### [Debug CLI](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/dbg/main.go#L29) - [should list the backend servers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/dbg/main.go#L37) - [should get information for a specific backend server](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/dbg/main.go#L56) @@ -271,6 +287,8 @@ Do not try to edit it manually. - [should return a self generated SSL certificate](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/defaultbackend/ssl.go#L29) ### [[Default Backend] change default settings](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/defaultbackend/with_hosts.go#L30) - [should apply the annotation to the default backend](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/defaultbackend/with_hosts.go#L38) +### [[Disable Leader] Routing works when leader election was disabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/disableleaderelection/disable_leader.go#L28) +- [should create multiple ingress routings rules when leader election has disabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/disableleaderelection/disable_leader.go#L35) ### [[Endpointslices] long service name](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/endpointslices/longname.go#L29) - [should return 200 when service name has max allowed number of characters 63](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/endpointslices/longname.go#L38) ### [[TopologyHints] topology aware routing](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/endpointslices/topology.go#L34) @@ -278,7 +296,7 @@ Do not try to edit it manually. ### [[Shutdown] Grace period shutdown](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/grace_period.go#L32) - [/healthz should return status code 500 during shutdown grace period](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/grace_period.go#L35) ### [[Shutdown] ingress controller](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/shutdown.go#L30) -- [should shutdown in less than 60 secons without pending connections](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/shutdown.go#L40) +- [should shutdown in less than 60 seconds without pending connections](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/shutdown.go#L40) ### [[Shutdown] Graceful shutdown with pending request](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/slow_requests.go#L25) - [should let slow requests finish before shutting down](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/gracefulshutdown/slow_requests.go#L33) ### [[Ingress] DeepInspection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/deep_inspection.go#L27) @@ -291,6 +309,10 @@ Do not try to edit it manually. - [should choose the correct location](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_mixed.go#L39) ### [[Ingress] [PathType] prefix checks](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_prefix.go#L28) - [should return 404 when prefix /aaa does not match request /aaaccc](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_prefix.go#L35) +- [should test prefix path using simple regex pattern for /id/{int}](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_prefix.go#L72) +- [should test prefix path using regex pattern for /id/{int} ignoring non-digits characters at end of string](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_prefix.go#L113) +- [should test prefix path using fixed path size regex pattern /id/{int}{3}](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_prefix.go#L142) +- [should correctly route multi-segment path patterns](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/pathtype_prefix.go#L177) ### [[Ingress] definition without host](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/without_host.go#L31) - [should set ingress details variables for ingresses without a host](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/without_host.go#L34) - [should set ingress details variables for ingresses with host without IngressRuleValue, only Backend](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/ingress/without_host.go#L55) @@ -312,13 +334,15 @@ Do not try to edit it manually. - [removes HTTPS configuration when we delete TLS spec](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_certificates.go#L233) ### [[Lua] dynamic configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L41) - [configures balancer Lua middleware correctly](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L49) -- [handles endpoints only changes](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L61) -- [handles endpoints only changes (down scaling of replicas)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L86) -- [handles endpoints only changes consistently (down scaling of replicas vs. empty service)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L124) -- [handles an annotation change](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L170) +- [handles endpoints only changes](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L56) +- [handles endpoints only changes (down scaling of replicas)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L81) +- [handles endpoints only changes consistently (down scaling of replicas vs. empty service)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L119) +- [handles an annotation change](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/lua/dynamic_configuration.go#L165) ### [[metrics] exported prometheus metrics](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L36) -- [exclude socket request metrics are absent](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L50) -- [exclude socket request metrics are present](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L72) +- [exclude socket request metrics are absent](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L51) +- [exclude socket request metrics are present](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L73) +- [request metrics per undefined host are present when flag is set](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L95) +- [request metrics per undefined host are not present when flag is not set](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/metrics/metrics.go#L128) ### [nginx-configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/nginx/nginx.go#L99) - [start nginx with default configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/nginx/nginx.go#L102) - [fails when using alias directive](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/nginx/nginx.go#L114) @@ -351,9 +375,9 @@ Do not try to edit it manually. - [should be disabled when setting is false](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/aio_write.go#L46) ### [Bad annotation values](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L29) - [[BAD_ANNOTATIONS] should drop an ingress if there is an invalid character in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L36) -- [[BAD_ANNOTATIONS] should drop an ingress if there is a forbidden word in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L75) -- [[BAD_ANNOTATIONS] should allow an ingress if there is a default blocklist config in place](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L119) -- [[BAD_ANNOTATIONS] should drop an ingress if there is a custom blocklist config in place and allow others to pass](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L157) +- [[BAD_ANNOTATIONS] should drop an ingress if there is a forbidden word in some annotation](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L68) +- [[BAD_ANNOTATIONS] should allow an ingress if there is a default blocklist config in place](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L105) +- [[BAD_ANNOTATIONS] should drop an ingress if there is a custom blocklist config in place and allow others to pass](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/badannotationvalues.go#L138) ### [brotli](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/brotli.go#L30) - [should only compress responses that meet the `brotli-min-length` condition](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/brotli.go#L38) ### [Configmap change](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/configmap_change.go#L29) @@ -373,17 +397,18 @@ Do not try to edit it manually. - [should ignore services of external-name type](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_service_external_name.go#L55) ### [[Flag] disable-sync-events](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_sync_events.go#L32) - [should create sync events (default)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_sync_events.go#L35) -- [should create sync events](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_sync_events.go#L54) -- [should not create sync events](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_sync_events.go#L82) +- [should create sync events](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_sync_events.go#L55) +- [should not create sync events](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/disable_sync_events.go#L83) ### [enable-real-ip](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/enable_real_ip.go#L30) - [trusts X-Forwarded-For header only when setting is true](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/enable_real_ip.go#L40) -- [should not trust X-Forwarded-For header when setting is false](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/enable_real_ip.go#L78) +- [should not trust X-Forwarded-For header when setting is false](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/enable_real_ip.go#L79) ### [use-forwarded-headers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/forwarded_headers.go#L31) - [should trust X-Forwarded headers when setting is true](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/forwarded_headers.go#L41) - [should not trust X-Forwarded headers when setting is false](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/forwarded_headers.go#L93) ### [Geoip2](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/geoip2.go#L36) - [should include geoip2 line in config when enabled and db file exists](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/geoip2.go#L45) - [should only allow requests from specific countries](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/geoip2.go#L69) +- [should up and running nginx controller using autoreload flag](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/geoip2.go#L122) ### [[Security] block-*](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/global_access_block.go#L28) - [should block CIDRs defined in the ConfigMap](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/global_access_block.go#L38) - [should block User-Agents defined in the ConfigMap](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/global_access_block.go#L55) @@ -399,15 +424,15 @@ Do not try to edit it manually. ### [global-options](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/global_options.go#L28) - [should have worker_rlimit_nofile option](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/global_options.go#L31) - [should have worker_rlimit_nofile option and be independent on amount of worker processes](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/global_options.go#L37) -### [settings-global-rate-limit](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/globalratelimit.go#L30) -- [generates correct NGINX configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/globalratelimit.go#L38) -### [gzip](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L29) -- [should be disabled by default](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L32) -- [should be enabled with default settings](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L39) -- [should set gzip_comp_level to 4](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L56) -- [should set gzip_disable to msie6](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L67) -- [should set gzip_min_length to 100](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L78) -- [should set gzip_types to application/javascript](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L89) +### [GRPC](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/grpc.go#L39) +- [should set the correct GRPC Buffer Size](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/grpc.go#L42) +### [gzip](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L30) +- [should be disabled by default](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L40) +- [should be enabled with default settings](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L56) +- [should set gzip_comp_level to 4](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L82) +- [should set gzip_disable to msie6](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L102) +- [should set gzip_min_length to 100](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L132) +- [should set gzip_types to text/html](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/gzip.go#L164) ### [hash size](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/hash-size.go#L27) - [should set server_names_hash_bucket_size](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/hash-size.go#L39) - [should set server_names_hash_max_size](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/hash-size.go#L47) @@ -469,40 +494,20 @@ Do not try to edit it manually. - [should return status code 200 when accessing '/noauth' unauthenticated](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/no_auth_locations.go#L82) ### [Add no tls redirect locations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/no_tls_redirect_locations.go#L27) - [Check no tls redirect locations config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/no_tls_redirect_locations.go#L30) -### [OCSP](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/ocsp/ocsp.go#L42) -- [should enable OCSP and contain stapling information in the connection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/ocsp/ocsp.go#L49) +### [OCSP](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/ocsp/ocsp.go#L43) +- [should enable OCSP and contain stapling information in the connection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/ocsp/ocsp.go#L50) ### [Configure Opentelemetry](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentelemetry.go#L39) - [should not exists opentelemetry directive](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentelemetry.go#L49) - [should exists opentelemetry directive when is enabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentelemetry.go#L62) - [should include opentelemetry_trust_incoming_spans on directive when enabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentelemetry.go#L76) - [should not exists opentelemetry_operation_name directive when is empty](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentelemetry.go#L91) - [should exists opentelemetry_operation_name directive when is configured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentelemetry.go#L106) -### [Configure OpenTracing](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L52) -- [should not exists opentracing directive](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L62) -- [should exists opentracing directive when is enabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L75) -- [should include opentracing_trust_incoming_span off directive when disabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L89) -- [should not exists opentracing_operation_name directive when is empty](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L104) -- [should exists opentracing_operation_name directive when is configured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L119) -- [should not exists opentracing_location_operation_name directive when is empty](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L134) -- [should exists opentracing_location_operation_name directive when is configured](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L149) -- [should enable opentracing using zipkin](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L164) -- [should enable opentracing using jaeger](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L176) -- [should enable opentracing using jaeger with sampler host](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L188) -- [should propagate the w3c header when configured with jaeger](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L201) -- [should enable opentracing using jaeger with an HTTP endpoint](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L232) -- [should enable opentracing using datadog](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/opentracing.go#L245) -### [plugins](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/plugins.go#L28) -- [should exist a x-hello-world header](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/plugins.go#L35) -### [[Security] Pod Security Policies](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/pod_security_policy.go#L41) -- [should be running with a Pod Security Policy](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/pod_security_policy.go#L44) -### [[Security] Pod Security Policies with volumes](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/pod_security_policy_volumes.go#L37) -- [should be running with a Pod Security Policy](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/pod_security_policy_volumes.go#L40) ### [proxy-connect-timeout](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_connect_timeout.go#L29) - [should set valid proxy timeouts using configmap values](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_connect_timeout.go#L37) - [should not set invalid proxy timeouts using configmap values](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_connect_timeout.go#L53) ### [Dynamic $proxy_host](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_host.go#L28) - [should exist a proxy_host](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_host.go#L36) -- [should exist a proxy_host using the upstream-vhost annotation value](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_host.go#L65) +- [should exist a proxy_host using the upstream-vhost annotation value](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_host.go#L60) ### [proxy-next-upstream](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_next_upstream.go#L28) - [should build proxy next upstream using configmap values](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_next_upstream.go#L36) ### [use-proxy-protocol](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/proxy_protocol.go#L38) @@ -522,7 +527,7 @@ Do not try to edit it manually. - [reuse port should be enabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/reuse-port.go#L52) ### [configmap server-snippet](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_snippet.go#L28) - [should add value of server-snippet setting to all ingress config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_snippet.go#L35) -- [should add global server-snippet and drop annotations per admin config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_snippet.go#L98) +- [should add global server-snippet and drop annotations per admin config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_snippet.go#L100) ### [server-tokens](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_tokens.go#L29) - [should not exists Server header in the response](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_tokens.go#L38) - [should exists Server header in the response when is enabled](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/server_tokens.go#L50) @@ -534,14 +539,14 @@ Do not try to edit it manually. - [should pass unknown traffic to default backend and handle known traffic](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/ssl_passthrough.go#L78) ### [configmap stream-snippet](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/stream_snippet.go#L35) - [should add value of stream-snippet via config map to nginx config](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/stream_snippet.go#L42) -### [[SSL] TLS protocols, ciphers and headers)](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L31) -- [setting cipher suite](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L65) -- [setting max-age parameter](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L109) -- [setting includeSubDomains parameter](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L125) -- [setting preload parameter](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L144) -- [overriding what's set from the upstream](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L164) -- [should not use ports during the HTTP to HTTPS redirection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L186) -- [should not use ports or X-Forwarded-Host during the HTTP to HTTPS redirection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L204) +### [[SSL] TLS protocols, ciphers and headers](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L32) +- [setting cipher suite](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L66) +- [setting max-age parameter](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L110) +- [setting includeSubDomains parameter](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L127) +- [setting preload parameter](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L147) +- [overriding what's set from the upstream](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L168) +- [should not use ports during the HTTP to HTTPS redirection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L190) +- [should not use ports or X-Forwarded-Host during the HTTP to HTTPS redirection](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/tls.go#L208) ### [annotation validations](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/validations/validations.go#L30) - [should allow ingress based on their risk on webhooks](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/validations/validations.go#L33) - [should allow ingress based on their risk on webhooks](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/settings/validations/validations.go#L68) @@ -555,4 +560,4 @@ Do not try to edit it manually. ### [[TCP] tcp-services](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/tcpudp/tcp.go#L38) - [should expose a TCP service](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/tcpudp/tcp.go#L46) - [should expose an ExternalName TCP service](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/tcpudp/tcp.go#L80) -- [should reload after an update in the configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/tcpudp/tcp.go#L169) +- [should reload after an update in the configuration](https://github.com/kubernetes/ingress-nginx/tree/main//test/e2e/tcpudp/tcp.go#L169) \ No newline at end of file diff --git a/docs/enhancements/20231001-split-containers.md b/docs/enhancements/20231001-split-containers.md new file mode 100644 index 000000000..3c2e85094 --- /dev/null +++ b/docs/enhancements/20231001-split-containers.md @@ -0,0 +1,110 @@ +# Proposal to split containers + +* All the NGINX files should live on one container + * No file other than NGINX files should exist on this container + * This includes not mounting the service account +* All the controller files should live on a different container + * Controller container should have bare minimum to work (just go program) + * ServiceAccount should be mounted just on controller + +* Inside nginx container, there should be a really small http listener just able +to start, stop and reload NGINX + +## Roadmap (what needs to be done) +* Map what needs to be done to mount the SA just on controller container +* Map all the required files for NGINX to work +* Map all the required network calls between controller and NGINX + * eg.: Dynamic lua reconfiguration +* Map problematic features that will need attention + * SSLPassthrough today happens on controller process and needs to happen on NGINX + +### Ports and endpoints on NGINX container +* Public HTTP/HTTPs port - 80 and 443 +* Lua configuration port - 10246 (HTTP) and 10247 (Stream) +* 3333 (temp) - Dataplane controller http server + * /reload - (POST) Reloads the configuration. + * "config" argument is the location of temporary file that should be used / moved to nginx.conf + * /test - (POST) Test the configuration of a given file location + * "config" argument is the location of temporary file that should be tested + +### Mounting empty SA on controller container + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: test +spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 + - name: othernginx + image: alpine:latest + command: ["/bin/sh"] + args: ["-c", "while true; do date; sleep 3; done"] + volumeMounts: + - mountPath: /var/run/secrets/kubernetes.io/serviceaccount + name: emptysecret + volumes: + - name: emptysecret + emptyDir: + sizeLimit: 1Mi +``` + +### Mapped folders on NGINX configuration +**WARNING** We need to be aware of inter mount containers and inode problems. If we +mount a file instead of a directory, it may take time to reflect the file value on +the target container + +* "/etc/nginx/lua/?.lua;/etc/nginx/lua/vendor/?.lua;;"; - Lua scripts +* "/var/log/nginx" - NGINX logs +* "/tmp/nginx (nginx.pid)" - NGINX pid directory / file, fcgi socket, etc +* " /etc/nginx/geoip" - GeoIP database directory - OK - /etc/ingress-controller/geoip +* /etc/nginx/mime.types - Mime types +* /etc/ingress-controller/ssl - SSL directory (fake cert, auth cert) +* /etc/ingress-controller/auth - Authentication files +* /etc/nginx/modsecurity - Modsecurity configuration +* /etc/nginx/owasp-modsecurity-crs - Modsecurity rules +* /etc/nginx/tickets.key - SSL tickets - OK - /etc/ingress-controller/tickets.key +* /etc/nginx/opentelemetry.toml - OTEL config - OK - /etc/ingress-controller/telemetry +* /etc/nginx/opentracing.json - Opentracing config - OK - /etc/ingress-controller/telemetry +* /etc/nginx/modules - NGINX modules +* /etc/nginx/fastcgi_params (maybe) - fcgi params +* /etc/nginx/template - Template, may be used by controller only + +##### List of modules +``` +ngx_http_auth_digest_module.so ngx_http_modsecurity_module.so +ngx_http_brotli_filter_module.so ngx_http_opentracing_module.so +ngx_http_brotli_static_module.so ngx_stream_geoip2_module.so +ngx_http_geoip2_module.so +``` + +##### List of files that may be removed +``` +-rw-r--r-- 1 www-data www-data 1077 Jun 23 19:44 fastcgi.conf +-rw-r--r-- 1 www-data www-data 1077 Jun 23 19:44 fastcgi.conf.default +-rw-r--r-- 1 www-data www-data 1007 Jun 23 19:44 fastcgi_params +-rw-r--r-- 1 www-data www-data 1007 Jun 23 19:44 fastcgi_params.default +drwxr-xr-x 2 www-data www-data 4096 Jun 23 19:34 geoip +-rw-r--r-- 1 www-data www-data 2837 Jun 23 19:44 koi-utf +-rw-r--r-- 1 www-data www-data 2223 Jun 23 19:44 koi-win +drwxr-xr-x 6 www-data www-data 4096 Sep 19 14:13 lua +-rw-r--r-- 1 www-data www-data 5349 Jun 23 19:44 mime.types +-rw-r--r-- 1 www-data www-data 5349 Jun 23 19:44 mime.types.default +drwxr-xr-x 2 www-data www-data 4096 Jun 23 19:44 modsecurity +drwxr-xr-x 2 www-data www-data 4096 Jun 23 19:44 modules +-rw-r--r-- 1 www-data www-data 18275 Oct 1 21:28 nginx.conf +-rw-r--r-- 1 www-data www-data 2656 Jun 23 19:44 nginx.conf.default +-rwx------ 1 www-data www-data 420 Oct 1 21:28 opentelemetry.toml +-rw-r--r-- 1 www-data www-data 2 Oct 1 21:28 opentracing.json +drwxr-xr-x 7 www-data www-data 4096 Jun 23 19:44 owasp-modsecurity-crs +-rw-r--r-- 1 www-data www-data 636 Jun 23 19:44 scgi_params +-rw-r--r-- 1 www-data www-data 636 Jun 23 19:44 scgi_params.default +drwxr-xr-x 2 www-data www-data 4096 Sep 19 14:13 template +-rw-r--r-- 1 www-data www-data 664 Jun 23 19:44 uwsgi_params +-rw-r--r-- 1 www-data www-data 664 Jun 23 19:44 uwsgi_params.default +-rw-r--r-- 1 www-data www-data 3610 Jun 23 19:44 win-utf +``` diff --git a/docs/examples/auth/oauth-external-auth/README.md b/docs/examples/auth/oauth-external-auth/README.md index a08928720..b64b0e70a 100644 --- a/docs/examples/auth/oauth-external-auth/README.md +++ b/docs/examples/auth/oauth-external-auth/README.md @@ -51,25 +51,72 @@ into a Kubernetes cluster and use it to protect the Kubernetes Dashboard using G ![Register OAuth2 Application](images/register-oauth-app-2.png) -3. Configure oauth2_proxy values in the file [`oauth2-proxy.yaml`](https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/docs/examples/auth/oauth-external-auth/oauth2-proxy.yaml) with the values: +3. Configure values in the file [`oauth2-proxy.yaml`](https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/docs/examples/auth/oauth-external-auth/oauth2-proxy.yaml) with the values: - OAUTH2_PROXY_CLIENT_ID with the github `` - OAUTH2_PROXY_CLIENT_SECRET with the github `` - OAUTH2_PROXY_COOKIE_SECRET with value of `python -c 'import os,base64; print(base64.b64encode(os.urandom(16)).decode("ascii"))'` + - (optional, but recommended) OAUTH2_PROXY_GITHUB_USERS with GitHub usernames to allow to login + - `__INGRESS_HOST__` with a valid FQDN (e.g. `foo.bar.com`) + - `__INGRESS_SECRET__` with a Secret with a valid SSL certificate -4. Customize the contents of the file [`dashboard-ingress.yaml`](https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/docs/examples/auth/oauth-external-auth/dashboard-ingress.yaml): - - Replace `__INGRESS_HOST__` with a valid FQDN and `__INGRESS_SECRET__` with a Secret with a valid SSL certificate. - -5. Deploy the oauth2 proxy and the ingress rules running: +4. Deploy the oauth2 proxy and the ingress rules by running: ```console - $ kubectl create -f oauth2-proxy.yaml,dashboard-ingress.yaml + $ kubectl create -f oauth2-proxy.yaml ``` -### Test +#### Test -Test the oauth integration accessing the configured URL, e.g. `https://foo.bar.com` +Test the integration by accessing the configured URL, e.g. `https://foo.bar.com` + +![Register OAuth2 Application](images/github-auth.png) + +![GitHub authentication](images/oauth-login.png) + +![Kubernetes dashboard](images/dashboard.png) + + +### Example: Vouch Proxy + Kubernetes-Dashboard + +This example will show you how to deploy [`Vouch Proxy`](https://github.com/vouch/vouch-proxy) +into a Kubernetes cluster and use it to protect the Kubernetes Dashboard using GitHub as the OAuth2 provider. + +#### Prepare + +1. Install the kubernetes dashboard + + ```console + kubectl create -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/kubernetes-dashboard/v1.10.1.yaml + ``` + +2. Create a [custom GitHub OAuth application](https://github.com/settings/applications/new) + + ![Register OAuth2 Application](images/register-oauth-app.png) + + - Homepage URL is the FQDN in the Ingress rule, like `https://foo.bar.com` + - Authorization callback URL is the same as the base FQDN plus `/oauth2/auth`, like `https://foo.bar.com/oauth2/auth` + + ![Register OAuth2 Application](images/register-oauth-app-2.png) + +3. Configure Vouch Proxy values in the file [`vouch-proxy.yaml`](https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/docs/examples/auth/oauth-external-auth/vouch-proxy.yaml) with the values: + + - VOUCH_COOKIE_DOMAIN with value of `` + - OAUTH_CLIENT_ID with the github `` + - OAUTH_CLIENT_SECRET with the github `` + - (optional, but recommended) VOUCH_WHITELIST with GitHub usernames to allow to login + - `__INGRESS_HOST__` with a valid FQDN (e.g. `foo.bar.com`) + - `__INGRESS_SECRET__` with a Secret with a valid SSL certificate + +4. Deploy Vouch Proxy and the ingress rules by running: + + ```console + $ kubectl create -f vouch-proxy.yaml + ``` + +#### Test + +Test the integration by accessing the configured URL, e.g. `https://foo.bar.com` ![Register OAuth2 Application](images/github-auth.png) diff --git a/docs/examples/auth/oauth-external-auth/dashboard-ingress.yaml b/docs/examples/auth/oauth-external-auth/dashboard-ingress.yaml deleted file mode 100644 index 198a165f4..000000000 --- a/docs/examples/auth/oauth-external-auth/dashboard-ingress.yaml +++ /dev/null @@ -1,45 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth" - nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri" - name: external-auth-oauth2 - namespace: kube-system -spec: - ingressClassName: nginx - rules: - - host: __INGRESS_HOST__ - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: kubernetes-dashboard - port: - number: 80 ---- - -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: oauth2-proxy - namespace: kube-system -spec: - ingressClassName: nginx - rules: - - host: __INGRESS_HOST__ - http: - paths: - - path: /oauth2 - pathType: Prefix - backend: - service: - name: oauth2-proxy - port: - number: 4180 - tls: - - hosts: - - __INGRESS_HOST__ - secretName: __INGRESS_SECRET__ diff --git a/docs/examples/auth/oauth-external-auth/oauth2-proxy.yaml b/docs/examples/auth/oauth-external-auth/oauth2-proxy.yaml index b383ab95e..3d6d41297 100644 --- a/docs/examples/auth/oauth-external-auth/oauth2-proxy.yaml +++ b/docs/examples/auth/oauth-external-auth/oauth2-proxy.yaml @@ -31,6 +31,9 @@ spec: # docker run -ti --rm python:3-alpine python -c 'import secrets,base64; print(base64.b64encode(base64.b64encode(secrets.token_bytes(16))));' - name: OAUTH2_PROXY_COOKIE_SECRET value: SECRET + # Recommended: remove email-domain=* in args and set an allowlist + # - name: OAUTH2_PROXY_GITHUB_USERS + # value: alice,bob image: quay.io/oauth2-proxy/oauth2-proxy:latest imagePullPolicy: Always name: oauth2-proxy @@ -55,3 +58,52 @@ spec: targetPort: 4180 selector: k8s-app: oauth2-proxy + +--- + +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: oauth2-proxy + namespace: kube-system +spec: + ingressClassName: nginx + rules: + - host: __INGRESS_HOST__ + http: + paths: + - path: /oauth2 + pathType: Prefix + backend: + service: + name: oauth2-proxy + port: + number: 4180 + tls: + - hosts: + - __INGRESS_HOST__ + secretName: __INGRESS_SECRET__ + +--- + +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth" + nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri" + name: external-auth-oauth2 + namespace: kube-system +spec: + ingressClassName: nginx + rules: + - host: __INGRESS_HOST__ + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: kubernetes-dashboard + port: + number: 80 diff --git a/docs/examples/auth/oauth-external-auth/vouch-proxy.yaml b/docs/examples/auth/oauth-external-auth/vouch-proxy.yaml new file mode 100644 index 000000000..05eae6d11 --- /dev/null +++ b/docs/examples/auth/oauth-external-auth/vouch-proxy.yaml @@ -0,0 +1,110 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + k8s-app: vouch-proxy + name: vouch-proxy + namespace: kube-system +spec: + replicas: 1 + selector: + matchLabels: + k8s-app: vouch-proxy + template: + metadata: + labels: + k8s-app: vouch-proxy + spec: + containers: + - env: + - name: VOUCH_ALLOWALLUSERS + value: true + # Recommended: remove VOUCH_ALLOWALLUSERS and set an allowlist + # - name: VOUCH_WHITELIST + # value: alice,bob + - name: VOUCH_COOKIE_DOMAIN + value: + - name: VOUCH_LISTEN + value: 0.0.0.0 + - name: VOUCH_DOCUMENT_ROOT + value: oauth2 + # See https://github.com/vouch/vouch-proxy/tree/master/config for different provider examples + - name: OAUTH_PROVIDER + value: github + - name: OAUTH_CLIENT_ID + value: + - name: OAUTH_CLIENT_SECRET + value: + image: quay.io/vouch/vouch-proxy:latest + imagePullPolicy: Always + name: vouch-proxy + ports: + - containerPort: 9090 + protocol: TCP + +--- + +apiVersion: v1 +kind: Service +metadata: + labels: + k8s-app: vouch-proxy + name: vouch-proxy + namespace: kube-system +spec: + ports: + - name: http + port: 9090 + protocol: TCP + targetPort: 9090 + selector: + k8s-app: vouch-proxy + +--- + +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: vouch-proxy + namespace: kube-system +spec: + ingressClassName: nginx + rules: + - host: __INGRESS_HOST__ + http: + paths: + - path: /oauth2 + pathType: Prefix + backend: + service: + name: vouch-proxy + port: + number: 9090 + tls: + - hosts: + - __INGRESS_HOST__ + secretName: __INGRESS_SECRET__ + +--- + +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/validate" + nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/login?url=$scheme://$http_host$request_uri" + name: external-auth-oauth2 + namespace: kube-system +spec: + ingressClassName: nginx + rules: + - host: __INGRESS_HOST__ + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: kubernetes-dashboard + port: + number: 80 diff --git a/docs/examples/canary/README.md b/docs/examples/canary/README.md index 4124faf6f..885991a3b 100644 --- a/docs/examples/canary/README.md +++ b/docs/examples/canary/README.md @@ -31,7 +31,7 @@ spec: spec: containers: - name: production - image: registry.k8s.io/ingress-nginx/e2e-test-echo@sha256:6fc5aa2994c86575975bb20a5203651207029a0d28e3f491d8a127d08baadab4 + image: registry.k8s.io/ingress-nginx/e2e-test-echo:v1.1.1@sha256:a1e0152e2eeab26e3f6fd3986f3d82b17bc7711717cae5392dcd18dd447ba6ef ports: - containerPort: 80 env: @@ -97,7 +97,7 @@ spec: spec: containers: - name: canary - image: registry.k8s.io/ingress-nginx/e2e-test-echo@sha256:6fc5aa2994c86575975bb20a5203651207029a0d28e3f491d8a127d08baadab4 + image: registry.k8s.io/ingress-nginx/e2e-test-echo:v1.1.1@sha256:a1e0152e2eeab26e3f6fd3986f3d82b17bc7711717cae5392dcd18dd447ba6ef ports: - containerPort: 80 env: diff --git a/docs/examples/customization/custom-errors/README.md b/docs/examples/customization/custom-errors/README.md index a7c9545b0..2d6e124bb 100644 --- a/docs/examples/customization/custom-errors/README.md +++ b/docs/examples/customization/custom-errors/README.md @@ -2,11 +2,12 @@ This example demonstrates how to use a custom backend to render custom error pages. -If you are using Helm Chart, look at [example values](https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/customization/custom-errors/custom-default-backend.helm.values.yaml) and don't forget to add [configMap](https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/customization/custom-errors/custom-default-backend-error_pages.configMap.yaml) to your deployment, otherwise continue with [Customized default backend](#customized-default-backend) manual deployment. +If you are using the Helm Chart, look at [example values](https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/customization/custom-errors/custom-default-backend.helm.values.yaml) and don't forget to add the [ConfigMap](https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/customization/custom-errors/custom-default-backend-error_pages.configMap.yaml) to your deployment. Otherwise, continue with [Customized default backend](#customized-default-backend) manual deployment. ## Customized default backend -First, create the custom `default-backend`. It will be used by the Ingress controller later on. +First, create the custom `default-backend`. It will be used by the Ingress controller later on. + To do that, you can take a look at the [example manifest](https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/customization/custom-errors/custom-default-backend.yaml) in this project's GitHub repository. @@ -38,11 +39,11 @@ If you do not already have an instance of the Ingress-Nginx Controller running, 2. Edit the `ingress-nginx-controller` ConfigMap and create the key `custom-http-errors` with a value of `404,503`. 3. Take note of the IP address assigned to the Ingress-Nginx Controller Service. - ``` - $ kubectl get svc ingress-nginx - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - ingress-nginx ClusterIP 10.0.0.13 80/TCP,443/TCP 10m - ``` + ``` + $ kubectl get svc ingress-nginx + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + ingress-nginx ClusterIP 10.0.0.13 80/TCP,443/TCP 10m + ``` !!! note The `ingress-nginx` Service is of type `ClusterIP` in this example. This may vary depending on your environment. @@ -85,3 +86,16 @@ Vary: Accept-Encoding To go further with this example, feel free to deploy your own applications and Ingress objects, and validate that the responses are still in the correct format when a backend returns 503 (eg. if you scale a Deployment down to 0 replica). + +## Maintenance page + +You can also leverage custom error pages to set a **"_Service under maintenance_" page** for the whole cluster, useful to prevent users from accessing your services while you are performing planned scheduled maintenance. + +When enabled, the maintenance page is served to the clients with an HTTP [**503 Service Unavailable**](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503) response **status code**. + +To do that: + +- Enable a **custom error page for the 503 HTTP error**, by following the guide above +- Set the value of the `--watch-namespace-selector` flag to the name of some non-existent namespace, e.g. `nonexistent-namespace` + - This effectively prevents the NGINX Ingress Controller from reading `Ingress` resources from any namespace in the Kubernetes cluster +- Set your `location-snippet` to `return 503;`, to make the NGINX Ingress Controller always return the 503 HTTP error page for all the requests diff --git a/docs/examples/customization/custom-errors/custom-default-backend.helm.values.yaml b/docs/examples/customization/custom-errors/custom-default-backend.helm.values.yaml index 708a93831..d72001d58 100644 --- a/docs/examples/customization/custom-errors/custom-default-backend.helm.values.yaml +++ b/docs/examples/customization/custom-errors/custom-default-backend.helm.values.yaml @@ -5,8 +5,8 @@ defaultBackend: enabled: true image: registry: registry.k8s.io - image: ingress-nginx/nginx-errors - tag: "v20230505@sha256:3600dcd1bbd0d05959bb01af4b272714e94d22d24a64e91838e7183c80e53f7f" + image: ingress-nginx/custom-error-pages + tag: v1.1.1@sha256:8c10776191ae44b5c387b8c7696d8bc17ceec90d7184a3a38b89ac8434b6c56b extraVolumes: - name: custom-error-pages configMap: diff --git a/docs/examples/customization/custom-errors/custom-default-backend.yaml b/docs/examples/customization/custom-errors/custom-default-backend.yaml index e606c5b62..088ca1374 100644 --- a/docs/examples/customization/custom-errors/custom-default-backend.yaml +++ b/docs/examples/customization/custom-errors/custom-default-backend.yaml @@ -36,7 +36,7 @@ spec: spec: containers: - name: nginx-error-server - image: registry.k8s.io/ingress-nginx/nginx-errors:v20230505@sha256:3600dcd1bbd0d05959bb01af4b272714e94d22d24a64e91838e7183c80e53f7f + image: registry.k8s.io/ingress-nginx/custom-error-pages:v1.1.1@sha256:8c10776191ae44b5c387b8c7696d8bc17ceec90d7184a3a38b89ac8434b6c56b ports: - containerPort: 8080 # Setting the environment variable DEBUG we can see the headers sent diff --git a/docs/examples/customization/external-auth-headers/echo-service.yaml b/docs/examples/customization/external-auth-headers/echo-service.yaml index fc4461cd8..10244458d 100644 --- a/docs/examples/customization/external-auth-headers/echo-service.yaml +++ b/docs/examples/customization/external-auth-headers/echo-service.yaml @@ -18,7 +18,7 @@ spec: terminationGracePeriodSeconds: 60 containers: - name: echo-service - image: registry.k8s.io/ingress-nginx/e2e-test-echo:v20230527@sha256:6fc5aa2994c86575975bb20a5203651207029a0d28e3f491d8a127d08baadab4 + image: registry.k8s.io/ingress-nginx/e2e-test-echo:v1.1.1@sha256:a1e0152e2eeab26e3f6fd3986f3d82b17bc7711717cae5392dcd18dd447ba6ef ports: - containerPort: 8080 resources: diff --git a/docs/examples/customization/sysctl/patch.json b/docs/examples/customization/sysctl/patch.json index e87c9affa..69482c7be 100644 --- a/docs/examples/customization/sysctl/patch.json +++ b/docs/examples/customization/sysctl/patch.json @@ -4,7 +4,7 @@ "spec": { "initContainers": [{ "name": "sysctl", - "image": "alpine:3.18", + "image": "alpine:3.21", "securityContext": { "privileged": true }, diff --git a/docs/examples/grpc/README.md b/docs/examples/grpc/README.md index 508b23fb8..23126c345 100644 --- a/docs/examples/grpc/README.md +++ b/docs/examples/grpc/README.md @@ -166,11 +166,9 @@ This example demonstrates how to route traffic to a gRPC service through the Ing ### Notes on using response/request streams +> `grpc_read_timeout` and `grpc_send_timeout` will be set as `proxy_read_timeout` and `proxy_send_timeout` when you set backend protocol to `GRPC` or `GRPCS`. + 1. If your server only does response streaming and you expect a stream to be open longer than 60 seconds, you will have to change the `grpc_read_timeout` to accommodate this. 2. If your service only does request streaming and you expect a stream to be open longer than 60 seconds, you have to change the `grpc_send_timeout` and the `client_body_timeout`. 3. If you do both response and request streaming with an open stream longer than 60 seconds, you have to change all three timeouts: `grpc_read_timeout`, `grpc_send_timeout` and `client_body_timeout`. - -Values for the timeouts must be specified as e.g. `"1200s"`. - -> On the most recent versions of ingress-nginx, changing these timeouts requires using the `nginx.ingress.kubernetes.io/server-snippet` annotation. There are plans for future releases to allow using the Kubernetes annotations to define each timeout separately. diff --git a/docs/examples/index.md b/docs/examples/index.md index 59745e014..4efdae39f 100644 --- a/docs/examples/index.md +++ b/docs/examples/index.md @@ -23,7 +23,7 @@ Customization | [External authentication with response header propagation](custo Customization | [Sysctl tuning](customization/sysctl/README.md) | TODO | TODO Features | [Rewrite](rewrite/README.md) | TODO | TODO Features | [Session stickiness](affinity/cookie/README.md) | route requests consistently to the same endpoint | Advanced -Features | [Canary Deployments](canary/README.md) | weighted canary routing to a seperate deployment | Intermediate +Features | [Canary Deployments](canary/README.md) | weighted canary routing to a separate deployment | Intermediate Scaling | [Static IP](static-ip/README.md) | a single ingress gets a single static IP | Intermediate TLS | [Multi TLS certificate termination](multi-tls/README.md) | TODO | TODO TLS | [TLS termination](tls-termination/README.md) | TODO | TODO diff --git a/docs/examples/openpolicyagent/README.md b/docs/examples/openpolicyagent/README.md index 2d653a90c..8d6337a38 100644 --- a/docs/examples/openpolicyagent/README.md +++ b/docs/examples/openpolicyagent/README.md @@ -1,25 +1,25 @@ # OpenPolicyAgent and pathType enforcing -Ingress API allows users to specify different [pathType](https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types) -on Ingress object. +Ingress API allows users to specify different [pathType](https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types) +on Ingress object. While pathType `Exact` and `Prefix` should allow only a small set of characters, pathType `ImplementationSpecific` -allows any characters, as it may contain regexes, variables and other features that may be specific of the Ingress +allows any characters, as it may contain regexes, variables and other features that may be specific of the Ingress Controller being used. -This means that the Ingress Admins (the persona who deployed the Ingress Controller) should trust the users -allowed to use `pathType: ImplementationSpecific`, as this may allow arbitrary configuration, and this +This means that the Ingress Admins (the persona who deployed the Ingress Controller) should trust the users +allowed to use `pathType: ImplementationSpecific`, as this may allow arbitrary configuration, and this configuration may end on the proxy (aka Nginx) configuration. ## Example -The example in this repo uses [Gatekeeper](https://open-policy-agent.github.io/gatekeeper/website/) to block the usage of `pathType: ImplementationSpecific`, +The example in this repo uses [Gatekeeper](https://open-policy-agent.github.io/gatekeeper/website/) to block the usage of `pathType: ImplementationSpecific`, allowing just a specific list of namespaces to use it. It is recommended that the admin modifies this rules to enforce a specific set of characters when the usage of ImplementationSpecific is allowed, or in ways that best suits their needs. -First, the `ConstraintTemplate` from [template.yaml](template.yaml) will define a rule that validates if the Ingress object -is being created on an excempted namespace, and case not, will validate its pathType. +First, the `ConstraintTemplate` from [template.yaml](template.yaml) will define a rule that validates if the Ingress object +is being created on an exempted namespace, and case not, will validate its pathType. -Then, the rule `K8sBlockIngressPathType` contained in [rule.yaml](rule.yaml) will define the parameters: what kind of -object should be verified (Ingress), what are the excempted namespaces, and what kinds of pathType are blocked. +Then, the rule `K8sBlockIngressPathType` contained in [rule.yaml](rule.yaml) will define the parameters: what kind of +object should be verified (Ingress), what are the exempted namespaces, and what kinds of pathType are blocked. diff --git a/docs/examples/openpolicyagent/template.yaml b/docs/examples/openpolicyagent/template.yaml index ed2a6ba1c..4302415a2 100644 --- a/docs/examples/openpolicyagent/template.yaml +++ b/docs/examples/openpolicyagent/template.yaml @@ -17,11 +17,11 @@ spec: properties: blockedTypes: type: array - items: - type: string + items: + type: string namespacesExceptions: type: array - items: + items: type: string targets: - target: admission.k8s.gatekeeper.sh @@ -31,8 +31,8 @@ spec: violation[{"msg": msg}] { input.review.kind.kind == "Ingress" ns := input.review.object.metadata.namespace - excemptNS := [good | excempts = input.parameters.namespacesExceptions[_] ; good = excempts == ns] - not any(excemptNS) + exemptNS := [good | exempts = input.parameters.namespacesExceptions[_] ; good = exempts == ns] + not any(exemptNS) pathType := object.get(input.review.object.spec.rules[_].http.paths[_], "pathType", "") blockedPath := [blocked | blockedTypes = input.parameters.blockedTypes[_] ; blocked = blockedTypes == pathType] any(blockedPath) diff --git a/docs/examples/psp/README.md b/docs/examples/psp/README.md deleted file mode 100644 index f8426baf2..000000000 --- a/docs/examples/psp/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Pod Security Policy (PSP) - -In most clusters today, by default, all resources (e.g. `Deployments` and `ReplicatSets`) -have permissions to create pods. -Kubernetes however provides a more fine-grained authorization policy called -[Pod Security Policy (PSP)](https://kubernetes.io/docs/concepts/policy/pod-security-policy/). - -PSP allows the cluster owner to define the permission of each object, for example creating a pod. -If you have PSP enabled on the cluster, and you deploy ingress-nginx, -you will need to provide the `Deployment` with the permissions to create pods. - -Before applying any objects, first apply the PSP permissions by running: -```console -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/docs/examples/psp/psp.yaml -``` - -Note: PSP permissions must be granted before the creation of the `Deployment` and the `ReplicaSet`. diff --git a/docs/examples/psp/psp.yaml b/docs/examples/psp/psp.yaml deleted file mode 100644 index 0f859dece..000000000 --- a/docs/examples/psp/psp.yaml +++ /dev/null @@ -1,75 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: ingress-nginx - ---- - -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: ingress-nginx - namespace: ingress-nginx -spec: - allowedCapabilities: - - NET_BIND_SERVICE - privileged: false - allowPrivilegeEscalation: true - # Allow core volume types. - volumes: - - configMap - - secret - hostIPC: false - hostPID: false - runAsUser: - # Require the container to run without root privileges. - rule: MustRunAsNonRoot - supplementalGroups: - rule: MustRunAs - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: MustRunAs - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - seLinux: - rule: RunAsAny - ---- - -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: ingress-nginx-psp - namespace: ingress-nginx -rules: -- apiGroups: [policy] - resources: [podsecuritypolicies] - verbs: [use] - resourceNames: [ingress-nginx] - ---- - -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: ingress-nginx-psp - namespace: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx-psp -subjects: -- kind: ServiceAccount - name: default -- kind: ServiceAccount - name: ingress-nginx - namespace: ingress-nginx -- kind: ServiceAccount - name: ingress-nginx-admission - namespace: ingress-nginx diff --git a/docs/faq.md b/docs/faq.md index 253378c65..ea1e4d308 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,33 +1,200 @@ # FAQ +## Multi-tenant Kubernetes + +Do not use in multi-tenant Kubernetes production installations. This project assumes that users that can create Ingress objects are administrators of the cluster. + +For example, the Ingress NGINX control plane has global and per Ingress configuration options that make it insecure, if enabled, in a multi-tenant environment. + +For example, enabling snippets, a global configuration, allows any Ingress object to run arbitrary Lua code that could affect the security of all Ingress objects that a controller is running. + +We changed the default to allow snippets to `false` in https://github.com/kubernetes/ingress-nginx/pull/10393. + +## Multiple controller in one cluster + +Question - How can I easily install multiple instances of the ingress-nginx controller in the same cluster? + +You can install them in different namespaces. + +- Create a new namespace + + ``` + kubectl create namespace ingress-nginx-2 + ``` + +- Use Helm to install the additional instance of the ingress controller +- Ensure you have Helm working (refer to the [Helm documentation](https://helm.sh/docs/)) +- We have to assume that you have the helm repo for the ingress-nginx controller already added to your Helm config. + But, if you have not added the helm repo then you can do this to add the repo to your helm config; + + ``` + helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx + ``` + +- Make sure you have updated the helm repo data; + + ``` + helm repo update + ``` + +- Now, install an additional instance of the ingress-nginx controller like this: + + ``` + helm install ingress-nginx-2 ingress-nginx/ingress-nginx \ + --namespace ingress-nginx-2 \ + --set controller.ingressClassResource.name=nginx-two \ + --set controller.ingressClass=nginx-two \ + --set controller.ingressClassResource.controllerValue="example.com/ingress-nginx-2" \ + --set controller.ingressClassResource.enabled=true \ + --set controller.ingressClassByName=true + ``` + +If you need to install yet another instance, then repeat the procedure to create a new namespace, +change the values such as names & namespaces (for example from "-2" to "-3"), or anything else that meets your needs. + +Note that `controller.ingressClassResource.name` and `controller.ingressClass` have to be set correctly. +The first is to create the IngressClass object and the other is to modify the deployment of the actual ingress controller pod. + +### I can't use multiple namespaces, what should I do? + +If you need to install all instances in the same namespace, then you need to specify a different **election id**, like this: + +``` +helm install ingress-nginx-2 ingress-nginx/ingress-nginx \ +--namespace kube-system \ +--set controller.electionID=nginx-two-leader \ +--set controller.ingressClassResource.name=nginx-two \ +--set controller.ingressClass=nginx-two \ +--set controller.ingressClassResource.controllerValue="example.com/ingress-nginx-2" \ +--set controller.ingressClassResource.enabled=true \ +--set controller.ingressClassByName=true +``` + ## Retaining Client IPAddress -Please read [Retain Client IPAddress Guide here](./user-guide/retaining-client-ipaddress.md). +Question - How to obtain the real-client-ipaddress ? + +The goto solution for retaining the real-client IPaddress is to enable PROXY protocol. + +Enabling PROXY protocol has to be done on both, the Ingress NGINX controller, as well as the L4 load balancer, in front of the controller. + +The real-client IP address is lost by default, when traffic is forwarded over the network. But enabling PROXY protocol ensures that the connection details are retained and hence the real-client IP address doesn't get lost. + +Enabling proxy-protocol on the controller is documented [here](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#use-proxy-protocol) . + +For enabling proxy-protocol on the LoadBalancer, please refer to the documentation of your infrastructure provider because that is where the LB is provisioned. + +Some more info available [here](https://kubernetes.github.io/ingress-nginx/user-guide/miscellaneous/#source-ip-address) + +Some more info on proxy-protocol is [here](https://kubernetes.github.io/ingress-nginx/user-guide/miscellaneous/#proxy-protocol) + +### client-ipaddress on single-node cluster + +Single node clusters are created for dev & test uses with tools like "kind" or "minikube". A trick to simulate a real use network with these clusters (kind or minikube) is to install Metallb and configure the ipaddress of the kind container or the minikube vm/container, as the starting and ending of the pool for Metallb in L2 mode. Then the host ip becomes a real client ipaddress, for curl requests sent from the host. + +After installing ingress-nginx controller on a kind or a minikube cluster with helm, you can configure it for real-client-ip with a simple change to the service that ingress-nginx controller creates. The service object of --type LoadBalancer has a field service.spec.externalTrafficPolicy. If you set the value of this field to "Local" then the real-ipaddress of a client is visible to the controller. + +``` +% kubectl explain service.spec.externalTrafficPolicy +KIND: Service +VERSION: v1 + +FIELD: externalTrafficPolicy + +DESCRIPTION: + externalTrafficPolicy describes how nodes distribute service traffic they + receive on one of the Service's "externally-facing" addresses (NodePorts, + ExternalIPs, and LoadBalancer IPs). If set to "Local", the proxy will + configure the service in a way that assumes that external load balancers + will take care of balancing the service traffic between nodes, and so each + node will deliver traffic only to the node-local endpoints of the service, + without masquerading the client source IP. (Traffic mistakenly sent to a + node with no endpoints will be dropped.) The default value, "Cluster", uses + the standard behavior of routing to all endpoints evenly (possibly modified + by topology and other features). Note that traffic sent to an External IP or + LoadBalancer IP from within the cluster will always get "Cluster" semantics, + but clients sending to a NodePort from within the cluster may need to take + traffic policy into account when picking a node. + + Possible enum values: + - `"Cluster"` routes traffic to all endpoints. + - `"Local"` preserves the source IP of the traffic by routing only to + endpoints on the same node as the traffic was received on (dropping the + traffic if there are no local endpoints). +``` + +### client-ipaddress L7 + +The solution is to get the real client IPaddress from the ["X-Forward-For" HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) + +Example : If your application pod behind Ingress NGINX controller, uses the NGINX webserver and the reverseproxy inside it, then you can do the following to preserve the remote client IP. + +- First you need to make sure that the X-Forwarded-For header reaches the backend pod. This is done by using a Ingress NGINX conftroller ConfigMap key. Its documented [here](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#use-forwarded-headers) + +- Next, edit `nginx.conf` file inside your app pod, to contain the directives shown below: + +``` +set_real_ip_from 0.0.0.0/0; # Trust all IPs (use your VPC CIDR block in production) +real_ip_header X-Forwarded-For; +real_ip_recursive on; + +log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" ' + 'host=$host x-forwarded-for=$http_x_forwarded_for'; + +access_log /var/log/nginx/access.log main; + +``` ## Kubernetes v1.22 Migration -If you are using Ingress objects in your cluster (running Kubernetes older than v1.22), and you plan to upgrade your Kubernetes version to K8S 1.22 or above, then please read [the migration guide here](./user-guide/k8s-122-migration.md). +If you are using Ingress objects in your cluster (running Kubernetes older than +version 1.22), and you plan to upgrade your Kubernetes version to K8S 1.22 or +above, then please read [the migration guide here](./user-guide/k8s-122-migration.md). -## Validation Of __`path`__ +## Validation Of **`path`** -- For improving security and also following desired standards on Kubernetes API spec, the next release, scheduled for v1.8.0, will include a new & optional feature of validating the value for the key `ingress.spec.rules.http.paths.path` . +- For improving security and also following desired standards on Kubernetes API +spec, the next release, scheduled for v1.8.0, will include a new & optional +feature of validating the value for the key `ingress.spec.rules.http.paths.path`. -- This behavior will be disabled by default on the 1.8.0 release and enabled by default on the next breaking change release, set for 2.0.0. +- This behavior will be disabled by default on the 1.8.0 release and enabled by +default on the next breaking change release, set for 2.0.0. -- When "`ingress.spec.rules.http.pathType=Exact`" or "`pathType=Prefix`", this validation will limit the characters accepted on the field "`ingress.spec.rules.http.paths.path`", to "`alphanumeric characters`", and `"/," "_," "-."` Also, in this case, the path should start with `"/."` +- When "`ingress.spec.rules.http.pathType=Exact`" or "`pathType=Prefix`", this +validation will limit the characters accepted on the field "`ingress.spec.rules.http.paths.path`", +to "`alphanumeric characters`", and "`/`", "`_`", "`-`". Also, in this case, +the path should start with "`/`". -- When the ingress resource path contains other characters (like on rewrite configurations), the pathType value should be "`ImplementationSpecific`". +- When the ingress resource path contains other characters (like on rewrite +configurations), the pathType value should be "`ImplementationSpecific`". - API Spec on pathType is documented [here](https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types) -- When this option is enabled, the validation will happen on the Admission Webhook. So if any new ingress object contains characters other than "`alphanumeric characters`", and `"/," "_," "-."` , in the `path` field, but is not using `pathType` value as `ImplementationSpecific`, then the ingress object will be denied admission. +- When this option is enabled, the validation will happen on the Admission +Webhook. So if any new ingress object contains characters other than +alphanumeric characters, and, "`/`", "`_`", "`-`", in the `path` field, but +is not using `pathType` value as `ImplementationSpecific`, then the ingress +object will be denied admission. -- The cluster admin should establish validation rules using mechanisms like "`Open Policy Agent`", to validate that only authorized users can use ImplementationSpecific pathType and that only the authorized characters can be used. [The configmap value is here](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#strict-validate-path-type) +- The cluster admin should establish validation rules using mechanisms like +"`Open Policy Agent`", to validate that only authorized users can use +ImplementationSpecific pathType and that only the authorized characters can be +used. [The configmap value is here](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#strict-validate-path-type) - A complete example of an Openpolicyagent gatekeeper rule is available [here](https://kubernetes.github.io/ingress-nginx/examples/openpolicyagent/) -- If you have any issues or concerns, please do one of the following: - - Open a GitHub issue +- If you have any issues or concerns, please do one of the following: + - Open a GitHub issue - Comment in our Dev Slack Channel - - Open a thread in our Google Group ingress-nginx-dev@kubernetes.io + - Open a thread in our Google Group + +## Why is chunking not working since controller v1.10 ? + +- If your code is setting the HTTP header `"Transfer-Encoding: chunked"` and +the controller log messages show an error about duplicate header, it is +because of this change + +- More details are available in this issue diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..5d5943b84 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +mkdocs-material==9.4.5 +mkdocs-awesome-pages-plugin==2.9.2 +mkdocs-minify-plugin==0.7.1 +mkdocs-redirects==1.2.1 \ No newline at end of file diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index e1fd6956e..ffd8f839f 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -443,7 +443,7 @@ $ capsh --decode=0000000000000400 ``` ## Create a test pod as root -(Note, this may be restricted by PodSecurityPolicy, PodSecurityAdmission/Standards, OPA Gatekeeper, etc. in which case you will need to do the appropriate workaround for testing, e.g. deploy in a new namespace without the restrictions.) +(Note, this may be restricted by PodSecurityAdmission/Standards, OPA Gatekeeper, etc. in which case you will need to do the appropriate workaround for testing, e.g. deploy in a new namespace without the restrictions.) To test further you may want to install additional utilities, etc. Modify the pod yaml by: * changing runAsUser from 101 to 0 * removing the "drop..ALL" section from the capabilities. diff --git a/docs/user-guide/cli-arguments.md b/docs/user-guide/cli-arguments.md index 07a17a271..a33e75159 100644 --- a/docs/user-guide/cli-arguments.md +++ b/docs/user-guide/cli-arguments.md @@ -8,6 +8,7 @@ They are set in the container spec of the `ingress-nginx-controller` Deployment |----------|-------------| | `--annotations-prefix` | Prefix of the Ingress annotations specific to the NGINX controller. (default "nginx.ingress.kubernetes.io") | | `--apiserver-host` | Address of the Kubernetes API server. Takes the form "protocol://address:port". If not specified, it is assumed the program runs inside a Kubernetes cluster and local discovery is attempted. | +| `--bucket-factor` | Bucket factor for native histograms. Value must be > 1 for enabling native histograms. (default 0) | | `--certificate-authority` | Path to a cert file for the certificate authority. This certificate is used only when the flag --apiserver-host is specified. | | `--configmap` | Name of the ConfigMap containing custom global configurations for the controller. | | `--controller-class` | Ingress Class Controller value this Ingress satisfies. The class of an Ingress object is set using the field IngressClassName in Kubernetes clusters version v1.19.0 or higher. The .spec.controller value of the IngressClass referenced in an Ingress Object should be the same value specified here to make this object be watched. | @@ -15,16 +16,18 @@ They are set in the container spec of the `ingress-nginx-controller` Deployment | `--default-backend-service` | Service used to serve HTTP requests not matching any known server name (catch-all). Takes the form "namespace/name". The controller configures NGINX to forward requests to the first port of this Service. | | `--default-server-port` | Port to use for exposing the default server (catch-all). (default 8181) | | `--default-ssl-certificate` | Secret containing a SSL certificate to be used by the default HTTPS server (catch-all). Takes the form "namespace/name". | -| `--enable-annotation-validation` | If true, will enable the annotation validation feature. This value will be defaulted to true on a future release. | +| `--enable-annotation-validation` | If true, will enable the annotation validation feature. Defaults to true | | `--disable-catch-all` | Disable support for catch-all Ingresses. (default false) | | `--disable-full-test` | Disable full test of all merged ingresses at the admission stage and tests the template of the ingress being created or updated (full test of all ingresses is enabled by default). | | `--disable-svc-external-name` | Disable support for Services of type ExternalName. (default false) | | `--disable-sync-events` | Disables the creation of 'Sync' Event resources, but still logs them | | `--dynamic-configuration-retries` | Number of times to retry failed dynamic configuration before failing to sync an ingress. (default 15) | | `--election-id` | Election id to use for Ingress status updates. (default "ingress-controller-leader") | -| `--enable-metrics` | Enables the collection of NGINX metrics. (default true) | +| `--election-ttl` | Duration a leader election is valid before it's getting re-elected, e.g. `15s`, `10m` or `1h`. (Default: 30s) | +| `--enable-metrics` | Enables the collection of NGINX metrics. (Default: false) | | `--enable-ssl-chain-completion` | Autocomplete SSL certificate chains with missing intermediate CA certificates. Certificates uploaded to Kubernetes must have the "Authority Information Access" X.509 v3 extension for this to succeed. (default false)| | `--enable-ssl-passthrough` | Enable SSL Passthrough. (default false) | +| `--disable-leader-election` | Disable Leader Election on Nginx Controller. (default false) | | `--enable-topology-aware-routing` | Enable topology aware routing feature, needs service object annotation service.kubernetes.io/topology-mode sets to auto. (default false) | | `--exclude-socket-metrics` | Set of socket request metrics to exclude which won't be exported nor being calculated. The possible socket request metrics to exclude are documented in the monitoring guide e.g. 'nginx_ingress_controller_request_duration_seconds,nginx_ingress_controller_response_size'| | `--health-check-path` | URL path of the health check endpoint. Configured inside the NGINX status server. All requests received on the port defined by the healthz-port parameter are forwarded internally to this path. (default "/healthz") | @@ -38,12 +41,14 @@ They are set in the container spec of the `ingress-nginx-controller` Deployment | `--internal-logger-address` | Address to be used when binding internal syslogger. (default 127.0.0.1:11514) | | `--kubeconfig` | Path to a kubeconfig file containing authorization and API server information. | | `--length-buckets` | Set of buckets which will be used for prometheus histogram metrics such as RequestLength, ResponseLength. (default `[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]`) | +| `--max-buckets` | Maximum number of buckets for native histograms. (default 100) | | `--maxmind-edition-ids` | Maxmind edition ids to download GeoLite2 Databases. (default "GeoLite2-City,GeoLite2-ASN") | | `--maxmind-retries-timeout` | Maxmind downloading delay between 1st and 2nd attempt, 0s - do not retry to download if something went wrong. (default 0s) | | `--maxmind-retries-count` | Number of attempts to download the GeoIP DB. (default 1) | -| `--maxmind-license-key` | Maxmind license key to download GeoLite2 Databases. https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases . | +| `--maxmind-license-key` | Maxmind license key to download GeoLite2 Databases. https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/ . | | `--maxmind-mirror` | Maxmind mirror url (example: http://geoip.local/databases. | | `--metrics-per-host` | Export metrics per-host. (default true) | +| `--metrics-per-undefined-host` | Export metrics per-host even if the host is not defined in an ingress. Requires --metrics-per-host to be set to true. (default false) | | `--monitor-max-batch-size` | Max batch size of NGINX metrics. (default 10000)| | `--post-shutdown-grace-period` | Additional delay in seconds before controller container exits. (default 10) | | `--profiler-port` | Port to use for expose the ingress controller Go profiler when it is enabled. (default 10245) | diff --git a/docs/user-guide/exposing-tcp-udp-services.md b/docs/user-guide/exposing-tcp-udp-services.md index dbc143ff1..9c14a7c39 100644 --- a/docs/user-guide/exposing-tcp-udp-services.md +++ b/docs/user-guide/exposing-tcp-udp-services.md @@ -3,7 +3,7 @@ While the Kubernetes Ingress resource only officially supports routing external HTTP(s) traffic to services, ingress-nginx can be configured to receive external TCP/UDP traffic from non-HTTP protocols and route them to internal services using TCP/UDP port mappings that are specified within a ConfigMap. To support this, the `--tcp-services-configmap` and `--udp-services-configmap` flags can be used to point to an existing config map where the key is the external port to use and the value indicates the service to expose using the format: -`::[PROXY]:[PROXY]` +`:::[PROXY]:[PROXY]` It is also possible to use a number or the name of the port. The two last fields are optional. Adding `PROXY` in either or both of the two last fields we can use [Proxy Protocol](https://www.nginx.com/resources/admin-guide/proxy-protocol) decoding (listen) and/or encoding (proxy_pass) in a TCP service. diff --git a/docs/user-guide/fcgi-services.md b/docs/user-guide/fcgi-services.md index db4d9428b..9c222d9ad 100644 --- a/docs/user-guide/fcgi-services.md +++ b/docs/user-guide/fcgi-services.md @@ -1,5 +1,3 @@ - - # Exposing FastCGI Servers > **FastCGI** is a [binary protocol](https://en.wikipedia.org/wiki/Binary_protocol "Binary protocol") for interfacing interactive programs with a [web server](https://en.wikipedia.org/wiki/Web_server "Web server"). [...] (It's) aim is to reduce the overhead related to interfacing between web server and CGI programs, allowing a server to handle more web page requests per unit of time. @@ -8,27 +6,60 @@ The _ingress-nginx_ ingress controller can be used to directly expose [FastCGI](https://en.wikipedia.org/wiki/FastCGI) servers. Enabling FastCGI in your Ingress only requires setting the _backend-protocol_ annotation to `FCGI`, and with a couple more annotations you can customize the way _ingress-nginx_ handles the communication with your FastCGI _server_. +For most practical use-cases, php applications are a good example. PHP is not HTML so a FastCGI server like php-fpm processes a index.php script for the response to a request. See a working example below. -## Example Objects to Expose a FastCGI Pod +This [post in a FactCGI feature issue](https://github.com/kubernetes/ingress-nginx/issues/8207#issuecomment-2161405468) describes a test for the FastCGI feature. The same test is described below here. -The _Pod_ example object below exposes port `9000`, which is the conventional FastCGI port. +## Example Objects to expose a FastCGI server pod + +### The FasctCGI server pod + +The _Pod_ object example below exposes port `9000`, which is the conventional FastCGI port. ```yaml apiVersion: v1 kind: Pod metadata: name: example-app -labels: - app: example-app + labels: + app: example-app spec: containers: - name: example-app - image: example-app:1.0 + image: php:fpm-alpine ports: - containerPort: 9000 name: fastcgi ``` +- For this example to work, a HTML response should be received from the FastCGI server being exposed +- A HTTP request to the FastCGI server pod should be sent +- The response should be generated by a php script as that is what we are demonstrating here + +The image we are using here `php:fpm-alpine` does not ship with a ready to use php script inside it. So we need to provide the image with a simple php-script for this example to work. + +- Use `kubectl exec` to get into the example-app pod +- You will land at the path `/var/www/html` +- Create a simple php script there at the path /var/www/html called index.php +- Make the index.php file look like this + +``` + + + + PHP Test + + + FastCGI Test Worked!

'; ?> + + +``` + +- Save and exit from the shell in the pod +- If you delete the pod, then you will have to recreate the file as this method is not persistent + +### The FastCGI service + The _Service_ object example below matches port `9000` from the _Pod_ object above. ```yaml @@ -45,21 +76,41 @@ spec: name: fastcgi ``` -And the _Ingress_ and _ConfigMap_ objects below demonstrates the supported _FastCGI_ specific annotations (NGINX actually has 50 FastCGI directives, all of which have not been exposed in the ingress yet), and matches the service `example-service`, and the port named `fastcgi` from above. The _ConfigMap_ **must** be created first for the _Ingress Controller_ to be able to find it when the _Ingress_ object is created, otherwise you will need to restart the _Ingress Controller_ pods. +### The configMap object and the ingress object + +The _Ingress_ and _ConfigMap_ objects below demonstrate the supported _FastCGI_ specific annotations. + +!!! Important + NGINX actually has 50 [FastCGI directives](https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#directives) + All of the nginx directives have not been exposed in the ingress yet + +### The ConfigMap object + +This configMap object is required to set the parameters of [FastCGI directives](https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#directives) + +!!! Attention + - The _ConfigMap_ **must** be created before creating the ingress object + +- The _Ingress Controller_ needs to find the configMap when the _Ingress_ object with the FastCGI annotations is created +- So create the configMap before the ingress +- If the configMap is created after the ingress is created, then you will need to restart the _Ingress Controller_ pods. ```yaml -# The ConfigMap MUST be created first for the ingress controller to be able to -# find it when the Ingress object is created. - apiVersion: v1 kind: ConfigMap metadata: name: example-cm data: - SCRIPT_FILENAME: "/example/index.php" + SCRIPT_FILENAME: "/var/www/html/index.php" ---- +``` +### The ingress object + +- Do not create the ingress shown below until you have created the configMap seen above. +- You can see that this ingress matches the service `example-service`, and the port named `fastcgi` from above. + +``` apiVersion: networking.k8s.io/v1 kind: Ingress metadata: @@ -83,6 +134,44 @@ spec: name: fastcgi ``` +## Send a request to the exposed FastCGI server + +You will have to look at the external-ip of the ingress or you have to send the HTTP request to the ClusterIP address of the ingress-nginx controller pod. + +``` +% curl 172.19.0.2 -H "Host: app.example.com" -vik +* Trying 172.19.0.2:80... +* Connected to 172.19.0.2 (172.19.0.2) port 80 +> GET / HTTP/1.1 +> Host: app.example.com +> User-Agent: curl/8.6.0 +> Accept: */* +> +< HTTP/1.1 200 OK +HTTP/1.1 200 OK +< Date: Wed, 12 Jun 2024 07:11:59 GMT +Date: Wed, 12 Jun 2024 07:11:59 GMT +< Content-Type: text/html; charset=UTF-8 +Content-Type: text/html; charset=UTF-8 +< Transfer-Encoding: chunked +Transfer-Encoding: chunked +< Connection: keep-alive +Connection: keep-alive +< X-Powered-By: PHP/8.3.8 +X-Powered-By: PHP/8.3.8 + +< + + + + PHP Test + + +

FastCGI Test Worked

+ + +``` + ## FastCGI Ingress Annotations To enable FastCGI, the `nginx.ingress.kubernetes.io/backend-protocol` annotation needs to be set to `FCGI`, which overrides the default `HTTP` value. @@ -114,6 +203,7 @@ data: SCRIPT_FILENAME: "/example/index.php" HTTP_PROXY: "" ``` + Using the _namespace/_ prefix is also supported, for example: > `nginx.ingress.kubernetes.io/fastcgi-params-configmap: "example-namespace/example-configmap"` diff --git a/docs/user-guide/ingress-path-matching.md b/docs/user-guide/ingress-path-matching.md index dd618e08b..43d049043 100644 --- a/docs/user-guide/ingress-path-matching.md +++ b/docs/user-guide/ingress-path-matching.md @@ -3,7 +3,7 @@ ## Regular Expression Support !!! important - Regular expressions and wild cards are not supported in the `spec.rules.host` field. Full hostnames must be used. + Regular expressions is not supported in the `spec.rules.host` field. The wildcard character '\*' must appear by itself as the first DNS label and matches only a single label. You cannot have a wildcard label by itself (e.g. Host == "\*"). !!! note Please see the [FAQ](../faq.md#validation-of-path) for Validation Of __`path`__ diff --git a/docs/user-guide/k8s-122-migration.md b/docs/user-guide/k8s-122-migration.md index 9a1ca081d..0880f020e 100644 --- a/docs/user-guide/k8s-122-migration.md +++ b/docs/user-guide/k8s-122-migration.md @@ -192,54 +192,3 @@ Bear in mind that if you start Ingress-Nginx B with the command line argument `- It is highly likely that you will also see the name of the ingress resource in the same error message. This error message has been observed on use the deprecated annotation (`kubernetes.io/ingress.class`) in an Ingress resource manifest. It is recommended to use the `.spec.ingressClassName` field of the Ingress resource, to specify the name of the IngressClass of the Ingress you are defining. - -## How can I easily install multiple instances of the ingress-nginx controller in the same cluster? - -You can install them in different namespaces. - -- Create a new namespace - ``` - kubectl create namespace ingress-nginx-2 - ``` -- Use Helm to install the additional instance of the ingress controller -- Ensure you have Helm working (refer to the [Helm documentation](https://helm.sh/docs/)) -- We have to assume that you have the helm repo for the ingress-nginx controller already added to your Helm config. - But, if you have not added the helm repo then you can do this to add the repo to your helm config; - ``` - helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx - ``` -- Make sure you have updated the helm repo data; - ``` - helm repo update - ``` -- Now, install an additional instance of the ingress-nginx controller like this: - ``` - helm install ingress-nginx-2 ingress-nginx/ingress-nginx \ - --namespace ingress-nginx-2 \ - --set controller.ingressClassResource.name=nginx-two \ - --set controller.ingressClass=nginx-two \ - --set controller.ingressClassResource.controllerValue="example.com/ingress-nginx-2" \ - --set controller.ingressClassResource.enabled=true \ - --set controller.ingressClassByName=true - ``` - -If you need to install yet another instance, then repeat the procedure to create a new namespace, -change the values such as names & namespaces (for example from "-2" to "-3"), or anything else that meets your needs. - -Note that `controller.ingressClassResource.name` and `controller.ingressClass` have to be set correctly. -The first is to create the IngressClass object and the other is to modify the deployment of the actual ingress controller pod. - -### I can't use multiple namespaces, what should I do? - -If you need to install all instances in the same namespace, then you need to specify a different **election id**, like this: - -``` -helm install ingress-nginx-2 ingress-nginx/ingress-nginx \ ---namespace kube-system \ ---set controller.electionID=nginx-two-leader \ ---set controller.ingressClassResource.name=nginx-two \ ---set controller.ingressClass=nginx-two \ ---set controller.ingressClassResource.controllerValue="example.com/ingress-nginx-2" \ ---set controller.ingressClassResource.enabled=true \ ---set controller.ingressClassByName=true -``` diff --git a/docs/user-guide/miscellaneous.md b/docs/user-guide/miscellaneous.md index e7d1ac59c..ee3d63056 100644 --- a/docs/user-guide/miscellaneous.md +++ b/docs/user-guide/miscellaneous.md @@ -4,9 +4,11 @@ By default NGINX uses the content of the header `X-Forwarded-For` as the source of truth to get information about the client IP address. This works without issues in L7 **if we configure the setting `proxy-real-ip-cidr`** with the correct information of the IP/network address of trusted external load balancer. +This setting can be enabled/disabled by setting [`use-forwarded-headers`](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#use-forwarded-headers). + If the ingress controller is running in AWS we need to use the VPC IPv4 CIDR. -Another option is to enable proxy protocol using `use-proxy-protocol: "true"`. +Another option is to enable the **PROXY protocol** using [`use-proxy-protocol: "true"`](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#use-proxy-protocol). In this mode NGINX does not use the content of the header to get the source IP address of the connection. @@ -17,7 +19,7 @@ By default NGINX path type is Prefix to not break existing definitions ## Proxy Protocol -If you are using a L4 proxy to forward the traffic to the NGINX pods and terminate HTTP/HTTPS there, you will lose the remote endpoint's IP address. To prevent this you could use the [Proxy Protocol](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt) for forwarding traffic, this will send the connection details before forwarding the actual TCP connection itself. +If you are using a L4 proxy to forward the traffic to the Ingress NGINX pods and terminate HTTP/HTTPS there, you will lose the remote endpoint's IP address. To prevent this you could use the [PROXY Protocol](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt) for forwarding traffic, this will send the connection details before forwarding the actual TCP connection itself. Amongst others [ELBs in AWS](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html) and [HAProxy](http://www.haproxy.org/) support Proxy Protocol. diff --git a/docs/user-guide/monitoring.md b/docs/user-guide/monitoring.md index 28608e850..4ad2795cf 100644 --- a/docs/user-guide/monitoring.md +++ b/docs/user-guide/monitoring.md @@ -166,7 +166,9 @@ According to the above example, this URL will be http://10.192.0.3:31086 #### Wildcard ingresses - - By default request metrics are labeled with the hostname. When you have a wildcard domain ingress, then there will be no metrics for that ingress (to prevent the metrics from exploding in cardinality). To get metrics in this case you need to run the ingress controller with `--metrics-per-host=false` (you will lose labeling by hostname, but still have labeling by ingress). + - By default request metrics are labeled with the hostname. When you have a wildcard domain ingress, then there will be no metrics for that ingress (to prevent the metrics from exploding in cardinality). To get metrics in this case you have two options: + - Run the ingress controller with `--metrics-per-host=false`. You will lose labeling by hostname, but still have labeling by ingress. + - Run the ingress controller with `--metrics-per-undefined-host=true --metrics-per-host=true`. You will get labeling by hostname even if the hostname is not explicitly defined on an ingress. Be warned that cardinality could explode due to many hostnames and CPU usage could also increase. ### Grafana dashboard using ingress resource - If you want to expose the dashboard for grafana using an ingress resource, then you can : @@ -386,10 +388,6 @@ Prometheus metrics are exposed on port 10254. The number of bytes sent to a client. **Deprecated**, use `nginx_ingress_controller_response_size`\ nginx var: `bytes_sent` -* `nginx_ingress_controller_ingress_upstream_latency_seconds` Summary\ - Upstream service latency per Ingress. **Deprecated**, use `nginx_ingress_controller_connect_duration_seconds`\ - nginx var: `upstream_connect_time` - ``` # HELP nginx_ingress_controller_bytes_sent The number of bytes sent to a client. DEPRECATED! Use nginx_ingress_controller_response_size # TYPE nginx_ingress_controller_bytes_sent histogram @@ -397,8 +395,6 @@ Prometheus metrics are exposed on port 10254. # TYPE nginx_ingress_controller_connect_duration_seconds nginx_ingress_controller_connect_duration_seconds * HELP nginx_ingress_controller_header_duration_seconds The time spent on receiving first header from the upstream server # TYPE nginx_ingress_controller_header_duration_seconds histogram -# HELP nginx_ingress_controller_ingress_upstream_latency_seconds Upstream service latency per Ingress DEPRECATED! Use nginx_ingress_controller_connect_duration_seconds -# TYPE nginx_ingress_controller_ingress_upstream_latency_seconds summary # HELP nginx_ingress_controller_request_duration_seconds The request processing time in milliseconds # TYPE nginx_ingress_controller_request_duration_seconds histogram # HELP nginx_ingress_controller_request_size The request length (including request line, header, and request body) diff --git a/docs/user-guide/multiple-ingress.md b/docs/user-guide/multiple-ingress.md index fca93ee65..2c7c8e712 100644 --- a/docs/user-guide/multiple-ingress.md +++ b/docs/user-guide/multiple-ingress.md @@ -57,6 +57,7 @@ or if installing with Helm: ```yaml controller: electionID: ingress-controller-leader + ingressClass: internal-nginx # default: nginx ingressClassResource: name: internal-nginx # default: nginx enabled: true diff --git a/docs/user-guide/nginx-configuration/annotations-risk.md b/docs/user-guide/nginx-configuration/annotations-risk.md new file mode 100755 index 000000000..aff9357b8 --- /dev/null +++ b/docs/user-guide/nginx-configuration/annotations-risk.md @@ -0,0 +1,141 @@ +# Annotations Scope and Risk + +|Group |Annotation | Risk | Scope | +|--------|------------------|------|-------| +| Aliases | server-alias | High | ingress | +| Allowlist | allowlist-source-range | Medium | location | +| BackendProtocol | backend-protocol | Low | location | +| BasicDigestAuth | auth-realm | Medium | location | +| BasicDigestAuth | auth-secret | Medium | location | +| BasicDigestAuth | auth-secret-type | Low | location | +| BasicDigestAuth | auth-type | Low | location | +| Canary | canary | Low | ingress | +| Canary | canary-by-cookie | Medium | ingress | +| Canary | canary-by-header | Medium | ingress | +| Canary | canary-by-header-pattern | Medium | ingress | +| Canary | canary-by-header-value | Medium | ingress | +| Canary | canary-weight | Low | ingress | +| Canary | canary-weight-total | Low | ingress | +| CertificateAuth | auth-tls-error-page | High | location | +| CertificateAuth | auth-tls-match-cn | High | location | +| CertificateAuth | auth-tls-pass-certificate-to-upstream | Low | location | +| CertificateAuth | auth-tls-secret | Medium | location | +| CertificateAuth | auth-tls-verify-client | Medium | location | +| CertificateAuth | auth-tls-verify-depth | Low | location | +| ClientBodyBufferSize | client-body-buffer-size | Low | location | +| ConfigurationSnippet | configuration-snippet | Critical | location | +| Connection | connection-proxy-header | Low | location | +| CorsConfig | cors-allow-credentials | Low | ingress | +| CorsConfig | cors-allow-headers | Medium | ingress | +| CorsConfig | cors-allow-methods | Medium | ingress | +| CorsConfig | cors-allow-origin | Medium | ingress | +| CorsConfig | cors-expose-headers | Medium | ingress | +| CorsConfig | cors-max-age | Low | ingress | +| CorsConfig | enable-cors | Low | ingress | +| CustomHTTPErrors | custom-http-errors | Low | location | +| CustomHeaders | custom-headers | Medium | location | +| DefaultBackend | default-backend | Low | location | +| Denylist | denylist-source-range | Medium | location | +| DisableProxyInterceptErrors | disable-proxy-intercept-errors | Low | location | +| EnableGlobalAuth | enable-global-auth | Low | location | +| ExternalAuth | auth-always-set-cookie | Low | location | +| ExternalAuth | auth-cache-duration | Medium | location | +| ExternalAuth | auth-cache-key | Medium | location | +| ExternalAuth | auth-keepalive | Low | location | +| ExternalAuth | auth-keepalive-requests | Low | location | +| ExternalAuth | auth-keepalive-share-vars | Low | location | +| ExternalAuth | auth-keepalive-timeout | Low | location | +| ExternalAuth | auth-method | Low | location | +| ExternalAuth | auth-proxy-set-headers | Medium | location | +| ExternalAuth | auth-request-redirect | Medium | location | +| ExternalAuth | auth-response-headers | Medium | location | +| ExternalAuth | auth-signin | High | location | +| ExternalAuth | auth-signin-redirect-param | Medium | location | +| ExternalAuth | auth-snippet | Critical | location | +| ExternalAuth | auth-url | High | location | +| FastCGI | fastcgi-index | Medium | location | +| FastCGI | fastcgi-params-configmap | Medium | location | +| HTTP2PushPreload | http2-push-preload | Low | location | +| LoadBalancing | load-balance | Low | location | +| Logs | enable-access-log | Low | location | +| Logs | enable-rewrite-log | Low | location | +| Mirror | mirror-host | High | ingress | +| Mirror | mirror-request-body | Low | ingress | +| Mirror | mirror-target | High | ingress | +| ModSecurity | enable-modsecurity | Low | ingress | +| ModSecurity | enable-owasp-core-rules | Low | ingress | +| ModSecurity | modsecurity-snippet | Critical | ingress | +| ModSecurity | modsecurity-transaction-id | High | ingress | +| Opentelemetry | enable-opentelemetry | Low | location | +| Opentelemetry | opentelemetry-operation-name | Medium | location | +| Opentelemetry | opentelemetry-trust-incoming-span | Low | location | +| Proxy | proxy-body-size | Medium | location | +| Proxy | proxy-buffer-size | Low | location | +| Proxy | proxy-buffering | Low | location | +| Proxy | proxy-buffers-number | Low | location | +| Proxy | proxy-busy-buffers-size | Low | location | +| Proxy | proxy-connect-timeout | Low | location | +| Proxy | proxy-cookie-domain | Medium | location | +| Proxy | proxy-cookie-path | Medium | location | +| Proxy | proxy-http-version | Low | location | +| Proxy | proxy-max-temp-file-size | Low | location | +| Proxy | proxy-next-upstream | Medium | location | +| Proxy | proxy-next-upstream-timeout | Low | location | +| Proxy | proxy-next-upstream-tries | Low | location | +| Proxy | proxy-read-timeout | Low | location | +| Proxy | proxy-redirect-from | Medium | location | +| Proxy | proxy-redirect-to | Medium | location | +| Proxy | proxy-request-buffering | Low | location | +| Proxy | proxy-send-timeout | Low | location | +| ProxySSL | proxy-ssl-ciphers | Medium | ingress | +| ProxySSL | proxy-ssl-name | High | ingress | +| ProxySSL | proxy-ssl-protocols | Low | ingress | +| ProxySSL | proxy-ssl-secret | Medium | ingress | +| ProxySSL | proxy-ssl-server-name | Low | ingress | +| ProxySSL | proxy-ssl-verify | Low | ingress | +| ProxySSL | proxy-ssl-verify-depth | Low | ingress | +| RateLimit | limit-allowlist | Low | location | +| RateLimit | limit-burst-multiplier | Low | location | +| RateLimit | limit-connections | Low | location | +| RateLimit | limit-rate | Low | location | +| RateLimit | limit-rate-after | Low | location | +| RateLimit | limit-rpm | Low | location | +| RateLimit | limit-rps | Low | location | +| Redirect | from-to-www-redirect | Low | location | +| Redirect | permanent-redirect | Medium | location | +| Redirect | permanent-redirect-code | Low | location | +| Redirect | relative-redirects | Low | location | +| Redirect | temporal-redirect | Medium | location | +| Redirect | temporal-redirect-code | Low | location | +| Rewrite | app-root | Medium | location | +| Rewrite | force-ssl-redirect | Medium | location | +| Rewrite | preserve-trailing-slash | Medium | location | +| Rewrite | rewrite-target | Medium | ingress | +| Rewrite | ssl-redirect | Low | location | +| Rewrite | use-regex | Low | location | +| SSLCipher | ssl-ciphers | Low | ingress | +| SSLCipher | ssl-prefer-server-ciphers | Low | ingress | +| SSLPassthrough | ssl-passthrough | Low | ingress | +| Satisfy | satisfy | Low | location | +| ServerSnippet | server-snippet | Critical | ingress | +| ServiceUpstream | service-upstream | Low | ingress | +| SessionAffinity | affinity | Low | ingress | +| SessionAffinity | affinity-canary-behavior | Low | ingress | +| SessionAffinity | affinity-mode | Medium | ingress | +| SessionAffinity | session-cookie-change-on-failure | Low | ingress | +| SessionAffinity | session-cookie-conditional-samesite-none | Low | ingress | +| SessionAffinity | session-cookie-domain | Medium | ingress | +| SessionAffinity | session-cookie-expires | Medium | ingress | +| SessionAffinity | session-cookie-max-age | Medium | ingress | +| SessionAffinity | session-cookie-name | Medium | ingress | +| SessionAffinity | session-cookie-path | Medium | ingress | +| SessionAffinity | session-cookie-samesite | Low | ingress | +| SessionAffinity | session-cookie-secure | Low | ingress | +| StreamSnippet | stream-snippet | Critical | ingress | +| UpstreamHashBy | upstream-hash-by | High | location | +| UpstreamHashBy | upstream-hash-by-subset | Low | location | +| UpstreamHashBy | upstream-hash-by-subset-size | Low | location | +| UpstreamVhost | upstream-vhost | Low | location | +| UsePortInRedirects | use-port-in-redirects | Low | location | +| XForwardedPrefix | x-forwarded-prefix | Medium | location | + diff --git a/docs/user-guide/nginx-configuration/annotations.md b/docs/user-guide/nginx-configuration/annotations.md index c2da56291..b0ea3cce3 100755 --- a/docs/user-guide/nginx-configuration/annotations.md +++ b/docs/user-guide/nginx-configuration/annotations.md @@ -39,7 +39,7 @@ You can add these Kubernetes annotations to specific Ingress objects to customiz |[nginx.ingress.kubernetes.io/auth-proxy-set-headers](#external-authentication)|string| |[nginx.ingress.kubernetes.io/auth-snippet](#external-authentication)|string| |[nginx.ingress.kubernetes.io/enable-global-auth](#external-authentication)|"true" or "false"| -|[nginx.ingress.kubernetes.io/backend-protocol](#backend-protocol)|string|HTTP,HTTPS,GRPC,GRPCS| +|[nginx.ingress.kubernetes.io/backend-protocol](#backend-protocol)|string| |[nginx.ingress.kubernetes.io/canary](#canary)|"true" or "false"| |[nginx.ingress.kubernetes.io/canary-by-header](#canary)|string| |[nginx.ingress.kubernetes.io/canary-by-header-value](#canary)|string| @@ -50,6 +50,7 @@ You can add these Kubernetes annotations to specific Ingress objects to customiz |[nginx.ingress.kubernetes.io/client-body-buffer-size](#client-body-buffer-size)|string| |[nginx.ingress.kubernetes.io/configuration-snippet](#configuration-snippet)|string| |[nginx.ingress.kubernetes.io/custom-http-errors](#custom-http-errors)|[]int| +|[nginx.ingress.kubernetes.io/custom-headers](#custom-headers)|string| |[nginx.ingress.kubernetes.io/default-backend](#default-backend)|string| |[nginx.ingress.kubernetes.io/enable-cors](#enable-cors)|"true" or "false"| |[nginx.ingress.kubernetes.io/cors-allow-origin](#enable-cors)|string| @@ -63,13 +64,10 @@ You can add these Kubernetes annotations to specific Ingress objects to customiz |[nginx.ingress.kubernetes.io/http2-push-preload](#http2-push-preload)|"true" or "false"| |[nginx.ingress.kubernetes.io/limit-connections](#rate-limiting)|number| |[nginx.ingress.kubernetes.io/limit-rps](#rate-limiting)|number| -|[nginx.ingress.kubernetes.io/global-rate-limit](#global-rate-limiting)|number| -|[nginx.ingress.kubernetes.io/global-rate-limit-window](#global-rate-limiting)|duration| -|[nginx.ingress.kubernetes.io/global-rate-limit-key](#global-rate-limiting)|string| -|[nginx.ingress.kubernetes.io/global-rate-limit-ignored-cidrs](#global-rate-limiting)|string| |[nginx.ingress.kubernetes.io/permanent-redirect](#permanent-redirect)|string| |[nginx.ingress.kubernetes.io/permanent-redirect-code](#permanent-redirect-code)|number| |[nginx.ingress.kubernetes.io/temporal-redirect](#temporal-redirect)|string| +|[nginx.ingress.kubernetes.io/temporal-redirect-code](#temporal-redirect-code)|number| |[nginx.ingress.kubernetes.io/preserve-trailing-slash](#server-side-https-enforcement-through-redirect)|"true" or "false"| |[nginx.ingress.kubernetes.io/proxy-body-size](#custom-max-body-size)|string| |[nginx.ingress.kubernetes.io/proxy-cookie-domain](#proxy-cookie-domain)|string| @@ -97,12 +95,15 @@ You can add these Kubernetes annotations to specific Ingress objects to customiz |[nginx.ingress.kubernetes.io/server-alias](#server-alias)|string| |[nginx.ingress.kubernetes.io/server-snippet](#server-snippet)|string| |[nginx.ingress.kubernetes.io/service-upstream](#service-upstream)|"true" or "false"| -|[nginx.ingress.kubernetes.io/session-cookie-name](#cookie-affinity)|string| -|[nginx.ingress.kubernetes.io/session-cookie-path](#cookie-affinity)|string| -|[nginx.ingress.kubernetes.io/session-cookie-domain](#cookie-affinity)|string| |[nginx.ingress.kubernetes.io/session-cookie-change-on-failure](#cookie-affinity)|"true" or "false"| -|[nginx.ingress.kubernetes.io/session-cookie-samesite](#cookie-affinity)|string| |[nginx.ingress.kubernetes.io/session-cookie-conditional-samesite-none](#cookie-affinity)|"true" or "false"| +|[nginx.ingress.kubernetes.io/session-cookie-domain](#cookie-affinity)|string| +|[nginx.ingress.kubernetes.io/session-cookie-expires](#cookie-affinity)|string| +|[nginx.ingress.kubernetes.io/session-cookie-max-age](#cookie-affinity)|string| +|[nginx.ingress.kubernetes.io/session-cookie-name](#cookie-affinity)|string|default "INGRESSCOOKIE"| +|[nginx.ingress.kubernetes.io/session-cookie-path](#cookie-affinity)|string| +|[nginx.ingress.kubernetes.io/session-cookie-samesite](#cookie-affinity)|string|"None", "Lax" or "Strict"| +|[nginx.ingress.kubernetes.io/session-cookie-secure](#cookie-affinity)|string| |[nginx.ingress.kubernetes.io/ssl-redirect](#server-side-https-enforcement-through-redirect)|"true" or "false"| |[nginx.ingress.kubernetes.io/ssl-passthrough](#ssl-passthrough)|"true" or "false"| |[nginx.ingress.kubernetes.io/stream-snippet](#stream-snippet)|string| @@ -115,13 +116,12 @@ You can add these Kubernetes annotations to specific Ingress objects to customiz |[nginx.ingress.kubernetes.io/proxy-buffering](#proxy-buffering)|string| |[nginx.ingress.kubernetes.io/proxy-buffers-number](#proxy-buffers-number)|number| |[nginx.ingress.kubernetes.io/proxy-buffer-size](#proxy-buffer-size)|string| +|[nginx.ingress.kubernetes.io/proxy-busy-buffers-size](#proxy-busy-buffers-size)|string| |[nginx.ingress.kubernetes.io/proxy-max-temp-file-size](#proxy-max-temp-file-size)|string| |[nginx.ingress.kubernetes.io/ssl-ciphers](#ssl-ciphers)|string| |[nginx.ingress.kubernetes.io/ssl-prefer-server-ciphers](#ssl-ciphers)|"true" or "false"| |[nginx.ingress.kubernetes.io/connection-proxy-header](#connection-proxy-header)|string| |[nginx.ingress.kubernetes.io/enable-access-log](#enable-access-log)|"true" or "false"| -|[nginx.ingress.kubernetes.io/enable-opentracing](#enable-opentracing)|"true" or "false"| -|[nginx.ingress.kubernetes.io/opentracing-trust-incoming-span](#opentracing-trust-incoming-span)|"true" or "false"| |[nginx.ingress.kubernetes.io/enable-opentelemetry](#enable-opentelemetry)|"true" or "false"| |[nginx.ingress.kubernetes.io/opentelemetry-trust-incoming-span](#opentelemetry-trust-incoming-spans)|"true" or "false"| |[nginx.ingress.kubernetes.io/use-regex](#use-regex)|bool| @@ -193,6 +193,12 @@ Use `nginx.ingress.kubernetes.io/session-cookie-domain` to set the `Domain` attr Use `nginx.ingress.kubernetes.io/session-cookie-samesite` to apply a `SameSite` attribute to the sticky cookie. Browser accepted values are `None`, `Lax`, and `Strict`. Some browsers reject cookies with `SameSite=None`, including those created before the `SameSite=None` specification (e.g. Chrome 5X). Other browsers mistakenly treat `SameSite=None` cookies as `SameSite=Strict` (e.g. Safari running on OSX 14). To omit `SameSite=None` from browsers with these incompatibilities, add the annotation `nginx.ingress.kubernetes.io/session-cookie-conditional-samesite-none: "true"`. +Use `nginx.ingress.kubernetes.io/session-cookie-expires` to control the cookie expires, its value is a number of seconds until the cookie expires. + +Use `nginx.ingress.kubernetes.io/session-cookie-path` to control the cookie path when use-regex is set to true. + +Use `nginx.ingress.kubernetes.io/session-cookie-change-on-failure` to control the cookie change after request failure. + ### Authentication It is possible to add authentication by adding additional annotations in the Ingress rule. The source of the authentication is a secret that contains usernames and passwords. @@ -316,7 +322,7 @@ nginx.ingress.kubernetes.io/configuration-snippet: | more_set_headers "Request-Id: $req_id"; ``` -Since version 1.9.0 this annotation is disabled by default and has to be explicitly enabled, see [allow-snippet-annotations](./configmap.md#allow-snippet-annotations). Enabling it can be dangerous in multi-tenant clusters, as it can lead to people with otherwise limited permissions being able to retrieve all secrets on the cluster. See CVE-2021-25742 and the [related issue on github](https://github.com/kubernetes/ingress-nginx/issues/7837) for more information. +Be aware this can be dangerous in multi-tenant clusters, as it can lead to people with otherwise limited permissions being able to retrieve all secrets on the cluster. The recommended mitigation for this threat is to disable this feature, so it may not work for you. See CVE-2021-25742 and the [related issue on github](https://github.com/kubernetes/ingress-nginx/issues/7837) for more information. ### Custom HTTP Errors @@ -329,6 +335,29 @@ Example usage: nginx.ingress.kubernetes.io/custom-http-errors: "404,415" ``` +### Custom Headers +This annotation is of the form `nginx.ingress.kubernetes.io/custom-headers: /` to specify a namespace and configmap name that contains custom headers. This annotation uses `more_set_headers` nginx directive. + +Example annotation for following example configmap: + +```yaml +nginx.ingress.kubernetes.io/custom-headers: default/custom-headers-configmap +``` + +Example configmap: +```yaml +apiVersion: v1 +data: + Content-Type: application/json +kind: ConfigMap +metadata: + name: custom-headers-configmap + namespace: default +``` + +!!! attention + First define the allowed response headers in [global-allowed-response-headers](https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/configmap.md#global-allowed-response-headers). + ### Default Backend This annotation is of the form `nginx.ingress.kubernetes.io/default-backend: ` to specify a custom default backend. This `` is a reference to a service inside of the same namespace in which you are applying this annotation. This annotation overrides the global default backend. In case the service has [multiple ports](https://kubernetes.io/docs/concepts/services-networking/service/#multi-port-services), the first one is the one which will receive the backend traffic. @@ -366,13 +395,13 @@ CORS can be controlled with the following annotations: * `nginx.ingress.kubernetes.io/cors-allow-origin`: Controls what's the accepted Origin for CORS. - This is a multi-valued field, separated by ','. It must follow this format: `http(s)://origin-site.com` or `http(s)://origin-site.com:port` + This is a multi-valued field, separated by ','. It must follow this format: `protocol://origin-site.com` or `protocol://origin-site.com:port` - Default: `*` - - Example: `nginx.ingress.kubernetes.io/cors-allow-origin: "https://origin-site.com:4443, http://origin-site.com, https://example.org:1199"` + - Example: `nginx.ingress.kubernetes.io/cors-allow-origin: "https://origin-site.com:4443, http://origin-site.com, myprotocol://example.org:1199"` - It also supports single level wildcard subdomains and follows this format: `http(s)://*.foo.bar`, `http(s)://*.bar.foo:8080` or `http(s)://*.abc.bar.foo:9000` - - Example: `nginx.ingress.kubernetes.io/cors-allow-origin: "https://*.origin-site.com:4443, http://*.origin-site.com, https://example.org:1199"` + It also supports single level wildcard subdomains and follows this format: `protocol://*.foo.bar`, `protocol://*.bar.foo:8080` or `protocol://*.abc.bar.foo:9000` + - Example: `nginx.ingress.kubernetes.io/cors-allow-origin: "https://*.origin-site.com:4443, http://*.origin-site.com, myprotocol://example.org:1199"` * `nginx.ingress.kubernetes.io/cors-allow-credentials`: Controls if credentials can be passed during CORS operations. @@ -521,10 +550,15 @@ By default the controller redirects all requests to an existing service that pro These annotations define limits on connections and transmission rates. These can be used to mitigate [DDoS Attacks](https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus). -* `nginx.ingress.kubernetes.io/limit-connections`: number of concurrent connections allowed from a single IP address. A 503 error is returned when exceeding this limit. -* `nginx.ingress.kubernetes.io/limit-rps`: number of requests accepted from a given IP each second. The burst limit is set to this limit multiplied by the burst multiplier, the default multiplier is 5. When clients exceed this limit, [limit-req-status-code](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#limit-req-status-code) ***default:*** 503 is returned. -* `nginx.ingress.kubernetes.io/limit-rpm`: number of requests accepted from a given IP each minute. The burst limit is set to this limit multiplied by the burst multiplier, the default multiplier is 5. When clients exceed this limit, [limit-req-status-code](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#limit-req-status-code) ***default:*** 503 is returned. -* `nginx.ingress.kubernetes.io/limit-burst-multiplier`: multiplier of the limit rate for burst size. The default burst multiplier is 5, this annotation override the default multiplier. When clients exceed this limit, [limit-req-status-code](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#limit-req-status-code) ***default:*** 503 is returned. +!!! attention + Rate limits are applied per Ingress NGINX controller replica. + If you're running multiple replicas or using a horizontal pod autoscaler (HPA), the effective rate limit will be multiplied by the number of replicas. + When using HPA, the exact rate limit becomes dynamic as the number of replicas may change based on load. + +* `nginx.ingress.kubernetes.io/limit-connections`: number of concurrent connections allowed from a single IP address per controller replica. A 503 error is returned when exceeding this limit. +* `nginx.ingress.kubernetes.io/limit-rps`: number of requests accepted from a given IP each second per controller replica. The burst limit is set to this limit multiplied by the burst multiplier, the default multiplier is 5. When clients exceed this limit, [limit-req-status-code](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#limit-req-status-code) ***default:*** 503 is returned. +* `nginx.ingress.kubernetes.io/limit-rpm`: number of requests accepted from a given IP each minute per controller replica. The burst limit is set to this limit multiplied by the burst multiplier, the default multiplier is 5. When clients exceed this limit, [limit-req-status-code](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#limit-req-status-code) ***default:*** 503 is returned. +* `nginx.ingress.kubernetes.io/limit-burst-multiplier`: multiplier of the limit rate for burst size. The default burst multiplier is 5, this annotation override the default multiplier. When clients exceed this limit, [limit-req-status-code](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#limit-req-status-code) ***default:*** 503 is returned. * `nginx.ingress.kubernetes.io/limit-rate-after`: initial number of kilobytes after which the further transmission of a response to a given connection will be rate limited. This feature must be used with [proxy-buffering](#proxy-buffering) enabled. * `nginx.ingress.kubernetes.io/limit-rate`: number of kilobytes per second allowed to send to a given connection. The zero value disables rate limiting. This feature must be used with [proxy-buffering](#proxy-buffering) enabled. * `nginx.ingress.kubernetes.io/limit-whitelist`: client IP source ranges to be excluded from rate-limiting. The value is a comma separated list of CIDRs. @@ -535,46 +569,6 @@ To configure settings globally for all Ingress rules, the `limit-rate-after` and The client IP address will be set based on the use of [PROXY protocol](./configmap.md#use-proxy-protocol) or from the `X-Forwarded-For` header value when [use-forwarded-headers](./configmap.md#use-forwarded-headers) is enabled. -### Global Rate Limiting - -**Note:** Be careful when configuring both (Local) Rate Limiting and Global Rate Limiting at the same time. -They are two completely different rate limiting implementations. Whichever limit exceeds first will reject the -requests. It might be a good idea to configure both of them to ease load on Global Rate Limiting backend -in cases of spike in traffic. - -The stock NGINX rate limiting does not share its counters among different NGINX instances. -Given that most ingress-nginx deployments are elastic and number of replicas can change any day -it is impossible to configure a proper rate limit using stock NGINX functionalities. -Global Rate Limiting overcome this by using [lua-resty-global-throttle](https://github.com/ElvinEfendi/lua-resty-global-throttle). `lua-resty-global-throttle` shares its counters via a central store such as `memcached`. -The obvious shortcoming of this is users have to deploy and operate a `memcached` instance -in order to benefit from this functionality. Configure the `memcached` -using [these configmap settings](./configmap.md#global-rate-limit). - -**Here are a few remarks for ingress-nginx integration of `lua-resty-global-throttle`:** - -1. We minimize `memcached` access by caching exceeding limit decisions. The expiry of -cache entry is the desired delay `lua-resty-global-throttle` calculates for us. -The Lua Shared Dictionary used for that is `global_throttle_cache`. Currently its size defaults to 10M. -Customize it as per your needs using [lua-shared-dicts](./configmap.md#lua-shared-dicts). -When we fail to cache the exceeding limit decision then we log an NGINX error. You can monitor -for that error to decide if you need to bump the cache size. Without cache the cost of processing a -request is two memcached commands: `GET`, and `INCR`. With the cache it is only `INCR`. -1. Log NGINX variable `$global_rate_limit_exceeding`'s value to have some visibility into -what portion of requests are rejected (value `y`), whether they are rejected using cached decision (value `c`), -or if they are not rejected (default value `n`). You can use [log-format-upstream](./configmap.md#log-format-upstream) -to include that in access logs. -1. In case of an error it will log the error message and **fail open**. -1. The annotations below creates Global Rate Limiting instance per ingress. -That means if there are multiple paths configured under the same ingress, -the Global Rate Limiting will count requests to all the paths under the same counter. -Extract a path out into its own ingress if you need to isolate a certain path. - - -* `nginx.ingress.kubernetes.io/global-rate-limit`: Configures maximum allowed number of requests per window. Required. -* `nginx.ingress.kubernetes.io/global-rate-limit-window`: Configures a time window (i.e `1m`) that the limit is applied. Required. -* `nginx.ingress.kubernetes.io/global-rate-limit-key`: Configures a key for counting the samples. Defaults to `$remote_addr`. You can also combine multiple NGINX variables here, like `${remote_addr}-${http_x_api_client}` which would mean the limit will be applied to requests coming from the same API client (indicated by `X-API-Client` HTTP request header) with the same source IP address. -* `nginx.ingress.kubernetes.io/global-rate-limit-ignored-cidrs`: comma separated list of IPs and CIDRs to match client IP against. When there's a match request is not considered for rate limiting. - ### Permanent Redirect This annotation allows to return a permanent redirect (Return Code 301) instead of sending data to the upstream. For example `nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com` would redirect everything to Google. @@ -586,6 +580,10 @@ This annotation allows you to modify the status code used for permanent redirect ### Temporal Redirect This annotation allows you to return a temporal redirect (Return Code 302) instead of sending data to the upstream. For example `nginx.ingress.kubernetes.io/temporal-redirect: https://www.google.com` would redirect everything to Google with a Return Code of 302 (Moved Temporarily) +### Temporal Redirect Code + +This annotation allows you to modify the status code used for temporal redirects. For example `nginx.ingress.kubernetes.io/temporal-redirect-code: '307'` would return your temporal-redirect with a 307. + ### SSL Passthrough The annotation `nginx.ingress.kubernetes.io/ssl-passthrough` instructs the controller to send TLS connections directly @@ -631,7 +629,10 @@ To preserve the trailing slash in the URI with `ssl-redirect`, set `nginx.ingres ### Redirect from/to www -In some scenarios is required to redirect from `www.domain.com` to `domain.com` or vice versa. +In some scenarios, it is required to redirect from `www.domain.com` to `domain.com` or vice versa, which way the redirect is performed depends on the configured `host` value in the Ingress object. + +For example, if `.spec.rules.host` is configured with a value like `www.example.com`, then this annotation will redirect from `example.com` to `www.example.com`. If `.spec.rules.host` is configured with a value like `example.com`, so without a `www`, then this annotation will redirect from `www.example.com` to `example.com` instead. + To enable this feature use the annotation `nginx.ingress.kubernetes.io/from-to-www-redirect: "true"` !!! attention @@ -674,6 +675,12 @@ In some scenarios is required to have different values. To allow this we provide - `nginx.ingress.kubernetes.io/proxy-next-upstream-tries` - `nginx.ingress.kubernetes.io/proxy-request-buffering` +If you indicate [Backend Protocol](#backend-protocol) as `GRPC` or `GRPCS`, the following grpc values will be set and inherited from proxy timeouts: + +- [`grpc_connect_timeout=5s`](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_connect_timeout), from `nginx.ingress.kubernetes.io/proxy-connect-timeout` +- [`grpc_send_timeout=60s`](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_send_timeout), from `nginx.ingress.kubernetes.io/proxy-send-timeout` +- [`grpc_read_timeout=60s`](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_read_timeout), from `nginx.ingress.kubernetes.io/proxy-read-timeout` + Note: All timeout values are unitless and in seconds e.g. `nginx.ingress.kubernetes.io/proxy-read-timeout: "120"` sets a valid 120 seconds proxy read timeout. ### Proxy redirect @@ -741,6 +748,18 @@ To configure this setting globally, set `proxy-buffer-size` in [NGINX ConfigMap] nginx.ingress.kubernetes.io/proxy-buffer-size: "8k" ``` +### Proxy busy buffers size + +[Limits the total size of buffers that can be busy](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size) sending a response to the client while the response is not yet fully read. + +By default proxy busy buffers size is set as "8k". + +To configure this setting globally, set `proxy-busy-buffers-size` in the [ConfigMap](./configmap.md#proxy-busy-buffers-size). To use custom values in an Ingress rule, define this annotation: + +```yaml +nginx.ingress.kubernetes.io/proxy-busy-buffers-size: "16k" +``` + ### Proxy max temp file size When [`buffering`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering) of responses from the proxied server is enabled, and the whole response does not fit into the buffers set by the [`proxy_buffer_size`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size) and [`proxy_buffers`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers) directives, a part of the response can be saved to a temporary file. This directive sets the maximum `size` of the temporary file setting the [`proxy_max_temp_file_size`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_max_temp_file_size). The size of data written to the temporary file at a time is set by the [`proxy_temp_file_write_size`](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_file_write_size) directive. @@ -804,24 +823,6 @@ Note that rewrite logs are sent to the error_log file at the notice level. To en nginx.ingress.kubernetes.io/enable-rewrite-log: "true" ``` -### Enable Opentracing - -Opentracing can be enabled or disabled globally through the ConfigMap but this will sometimes need to be overridden -to enable it or disable it for a specific ingress (e.g. to turn off tracing of external health check endpoints) - -```yaml -nginx.ingress.kubernetes.io/enable-opentracing: "true" -``` - -### Opentracing Trust Incoming Span - -The option to trust incoming trace spans can be enabled or disabled globally through the ConfigMap but this will -sometimes need to be overridden to enable it or disable it for a specific ingress (e.g. only enable on a private endpoint) - -```yaml -nginx.ingress.kubernetes.io/opentracing-trust-incoming-span: "true" -``` - ### Enable Opentelemetry Opentelemetry can be enabled or disabled globally through the ConfigMap but this will sometimes need to be overridden @@ -898,7 +899,7 @@ Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf ### Backend Protocol Using `backend-protocol` annotations is possible to indicate how NGINX should communicate with the backend service. (Replaces `secure-backends` in older versions) -Valid Values: HTTP, HTTPS, GRPC, GRPCS and FCGI +Valid Values: HTTP, HTTPS, AUTO_HTTP, GRPC, GRPCS and FCGI By default NGINX uses `HTTP`. @@ -946,7 +947,7 @@ Enables a request to be mirrored to a mirror backend. Responses by mirror backen The mirror backend can be set by applying: ```yaml -nginx.ingress.kubernetes.io/mirror-target: https://test.env.com/$request_uri +nginx.ingress.kubernetes.io/mirror-target: https://test.env.com$request_uri ``` By default the request-body is sent to the mirror backend, but can be turned off by applying: @@ -958,7 +959,7 @@ nginx.ingress.kubernetes.io/mirror-request-body: "off" Also by default header Host for mirrored requests will be set the same as a host part of uri in the "mirror-target" annotation. You can override it by "mirror-host" annotation: ```yaml -nginx.ingress.kubernetes.io/mirror-target: https://1.2.3.4/$request_uri +nginx.ingress.kubernetes.io/mirror-target: https://1.2.3.4$request_uri nginx.ingress.kubernetes.io/mirror-host: "test.env.com" ``` diff --git a/docs/user-guide/nginx-configuration/configmap.md b/docs/user-guide/nginx-configuration/configmap.md index 1bb205ad3..d8b4f6693 100644 --- a/docs/user-guide/nginx-configuration/configmap.md +++ b/docs/user-guide/nginx-configuration/configmap.md @@ -25,214 +25,206 @@ data: The following table shows a configuration option's name, type, and the default value: -|name|type|default|notes| -|:---|:---|:------|:----| -|[add-headers](#add-headers)|string|""|| -|[allow-backend-server-header](#allow-backend-server-header)|bool|"false"|| -|[allow-cross-namespace-resources](#allow-cross-namespace-resources)|bool|"true"|| -|[allow-snippet-annotations](#allow-snippet-annotations)|bool|false|| -|[annotations-risk-level](#annotations-risk-level)|string|Critical|| -|[annotation-value-word-blocklist](#annotation-value-word-blocklist)|string array|""|| -|[hide-headers](#hide-headers)|string array|empty|| -|[access-log-params](#access-log-params)|string|""|| -|[access-log-path](#access-log-path)|string|"/var/log/nginx/access.log"|| -|[http-access-log-path](#http-access-log-path)|string|""|| -|[stream-access-log-path](#stream-access-log-path)|string|""|| -|[enable-access-log-for-default-backend](#enable-access-log-for-default-backend)|bool|"false"|| -|[error-log-path](#error-log-path)|string|"/var/log/nginx/error.log"|| -|[enable-modsecurity](#enable-modsecurity)|bool|"false"|| -|[modsecurity-snippet](#modsecurity-snippet)|string|""|| -|[enable-owasp-modsecurity-crs](#enable-owasp-modsecurity-crs)|bool|"false"|| -|[client-header-buffer-size](#client-header-buffer-size)|string|"1k"|| -|[client-header-timeout](#client-header-timeout)|int|60|| -|[client-body-buffer-size](#client-body-buffer-size)|string|"8k"|| -|[client-body-timeout](#client-body-timeout)|int|60|| -|[disable-access-log](#disable-access-log)|bool|false|| -|[disable-ipv6](#disable-ipv6)|bool|false|| -|[disable-ipv6-dns](#disable-ipv6-dns)|bool|false|| -|[enable-underscores-in-headers](#enable-underscores-in-headers)|bool|false|| -|[enable-ocsp](#enable-ocsp)|bool|false|| -|[ignore-invalid-headers](#ignore-invalid-headers)|bool|true|| -|[retry-non-idempotent](#retry-non-idempotent)|bool|"false"|| -|[error-log-level](#error-log-level)|string|"notice"|| -|[http2-max-field-size](#http2-max-field-size)|string|""|DEPRECATED in favour of [large_client_header_buffers](#large-client-header-buffers)| -|[http2-max-header-size](#http2-max-header-size)|string|""|DEPRECATED in favour of [large_client_header_buffers](#large-client-header-buffers)| -|[http2-max-requests](#http2-max-requests)|int|0|DEPRECATED in favour of [keepalive_requests](#keepalive-requests)| -|[http2-max-concurrent-streams](#http2-max-concurrent-streams)|int|128|| -|[hsts](#hsts)|bool|"true"|| -|[hsts-include-subdomains](#hsts-include-subdomains)|bool|"true"|| -|[hsts-max-age](#hsts-max-age)|string|"15724800"|| -|[hsts-preload](#hsts-preload)|bool|"false"|| -|[keep-alive](#keep-alive)|int|75|| -|[keep-alive-requests](#keep-alive-requests)|int|1000|| -|[large-client-header-buffers](#large-client-header-buffers)|string|"4 8k"|| -|[log-format-escape-none](#log-format-escape-none)|bool|"false"|| -|[log-format-escape-json](#log-format-escape-json)|bool|"false"|| -|[log-format-upstream](#log-format-upstream)|string|`$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id`|| -|[log-format-stream](#log-format-stream)|string|`[$remote_addr] [$time_local] $protocol $status $bytes_sent $bytes_received $session_time`|| -|[enable-multi-accept](#enable-multi-accept)|bool|"true"|| -|[max-worker-connections](#max-worker-connections)|int|16384|| -|[max-worker-open-files](#max-worker-open-files)|int|0|| -|[map-hash-bucket-size](#max-hash-bucket-size)|int|64|| -|[nginx-status-ipv4-whitelist](#nginx-status-ipv4-whitelist)|[]string|"127.0.0.1"|| -|[nginx-status-ipv6-whitelist](#nginx-status-ipv6-whitelist)|[]string|"::1"|| -|[proxy-real-ip-cidr](#proxy-real-ip-cidr)|[]string|"0.0.0.0/0"|| -|[proxy-set-headers](#proxy-set-headers)|string|""|| -|[server-name-hash-max-size](#server-name-hash-max-size)|int|1024|| -|[server-name-hash-bucket-size](#server-name-hash-bucket-size)|int|``| -|[proxy-headers-hash-max-size](#proxy-headers-hash-max-size)|int|512|| -|[proxy-headers-hash-bucket-size](#proxy-headers-hash-bucket-size)|int|64|| -|[plugins](#plugins)|[]string| || -|[reuse-port](#reuse-port)|bool|"true"|| -|[server-tokens](#server-tokens)|bool|"false"|| -|[ssl-ciphers](#ssl-ciphers)|string|"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"|| -|[ssl-ecdh-curve](#ssl-ecdh-curve)|string|"auto"|| -|[ssl-dh-param](#ssl-dh-param)|string|""|| -|[ssl-protocols](#ssl-protocols)|string|"TLSv1.2 TLSv1.3"|| -|[ssl-session-cache](#ssl-session-cache)|bool|"true"|| -|[ssl-session-cache-size](#ssl-session-cache-size)|string|"10m"|| -|[ssl-session-tickets](#ssl-session-tickets)|bool|"false"|| -|[ssl-session-ticket-key](#ssl-session-ticket-key)|string|``| -|[ssl-session-timeout](#ssl-session-timeout)|string|"10m"|| -|[ssl-buffer-size](#ssl-buffer-size)|string|"4k"|| -|[use-proxy-protocol](#use-proxy-protocol)|bool|"false"|| -|[proxy-protocol-header-timeout](#proxy-protocol-header-timeout)|string|"5s"|| -|[enable-aio-write](#enable-aio-write)|bool|"true"|| -|[use-gzip](#use-gzip)|bool|"false"|| -|[use-geoip](#use-geoip)|bool|"true"|| -|[use-geoip2](#use-geoip2)|bool|"false"|| -|[enable-brotli](#enable-brotli)|bool|"false"|| -|[brotli-level](#brotli-level)|int|4|| -|[brotli-min-length](#brotli-min-length)|int|20|| -|[brotli-types](#brotli-types)|string|"application/xml+rss application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component"|| -|[use-http2](#use-http2)|bool|"true"|| -|[gzip-disable](#gzip-disable)|string|""|| -|[gzip-level](#gzip-level)|int|1|| -|[gzip-min-length](#gzip-min-length)|int|256|| -|[gzip-types](#gzip-types)|string|"application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component"|| -|[worker-processes](#worker-processes)|string|``|| -|[worker-cpu-affinity](#worker-cpu-affinity)|string|""|| -|[worker-shutdown-timeout](#worker-shutdown-timeout)|string|"240s"|| -|[load-balance](#load-balance)|string|"round_robin"|| -|[variables-hash-bucket-size](#variables-hash-bucket-size)|int|128|| -|[variables-hash-max-size](#variables-hash-max-size)|int|2048|| -|[upstream-keepalive-connections](#upstream-keepalive-connections)|int|320|| -|[upstream-keepalive-time](#upstream-keepalive-time)|string|"1h"|| -|[upstream-keepalive-timeout](#upstream-keepalive-timeout)|int|60|| -|[upstream-keepalive-requests](#upstream-keepalive-requests)|int|10000|| -|[limit-conn-zone-variable](#limit-conn-zone-variable)|string|"$binary_remote_addr"|| -|[proxy-stream-timeout](#proxy-stream-timeout)|string|"600s"|| -|[proxy-stream-next-upstream](#proxy-stream-next-upstream)|bool|"true"|| -|[proxy-stream-next-upstream-timeout](#proxy-stream-next-upstream-timeout)|string|"600s"|| -|[proxy-stream-next-upstream-tries](#proxy-stream-next-upstream-tries)|int|3|| -|[proxy-stream-responses](#proxy-stream-responses)|int|1|| -|[bind-address](#bind-address)|[]string|""|| -|[use-forwarded-headers](#use-forwarded-headers)|bool|"false"|| -|[enable-real-ip](#enable-real-ip)|bool|"false"|| -|[forwarded-for-header](#forwarded-for-header)|string|"X-Forwarded-For"|| -|[compute-full-forwarded-for](#compute-full-forwarded-for)|bool|"false"|| -|[proxy-add-original-uri-header](#proxy-add-original-uri-header)|bool|"false"|| -|[generate-request-id](#generate-request-id)|bool|"true"|| -|[enable-opentracing](#enable-opentracing)|bool|"false"|| -|[opentracing-operation-name](#opentracing-operation-name)|string|""|| -|[opentracing-location-operation-name](#opentracing-location-operation-name)|string|""|| -|[zipkin-collector-host](#zipkin-collector-host)|string|""|| -|[zipkin-collector-port](#zipkin-collector-port)|int|9411|| -|[zipkin-service-name](#zipkin-service-name)|string|"nginx"|| -|[zipkin-sample-rate](#zipkin-sample-rate)|float|1.0|| -|[jaeger-collector-host](#jaeger-collector-host)|string|""|| -|[jaeger-collector-port](#jaeger-collector-port)|int|6831|| -|[jaeger-endpoint](#jaeger-endpoint)|string|""|| -|[jaeger-service-name](#jaeger-service-name)|string|"nginx"|| -|[jaeger-propagation-format](#jaeger-propagation-format)|string|"jaeger"|| -|[jaeger-sampler-type](#jaeger-sampler-type)|string|"const"|| -|[jaeger-sampler-param](#jaeger-sampler-param)|string|"1"|| -|[jaeger-sampler-host](#jaeger-sampler-host)|string|"http://127.0.0.1"|| -|[jaeger-sampler-port](#jaeger-sampler-port)|int|5778|| -|[jaeger-trace-context-header-name](#jaeger-trace-context-header-name)|string|uber-trace-id|| -|[jaeger-debug-header](#jaeger-debug-header)|string|uber-debug-id|| -|[jaeger-baggage-header](#jaeger-baggage-header)|string|jaeger-baggage|| -|[jaeger-trace-baggage-header-prefix](#jaeger-trace-baggage-header-prefix)|string|uberctx-|| -|[datadog-collector-host](#datadog-collector-host)|string|""|| -|[datadog-collector-port](#datadog-collector-port)|int|8126|| -|[datadog-service-name](#datadog-service-name)|string|"nginx"|| -|[datadog-environment](#datadog-environment)|string|"prod"|| -|[datadog-operation-name-override](#datadog-operation-name-override)|string|"nginx.handle"|| -|[datadog-priority-sampling](#datadog-priority-sampling)|bool|"true"|| -|[datadog-sample-rate](#datadog-sample-rate)|float|1.0|| -|[enable-opentelemetry](#enable-opentelemetry)|bool|"false"|| -|[opentelemetry-trust-incoming-span](#opentelemetry-trust-incoming-span)|bool|"true"|| -|[opentelemetry-operation-name](#opentelemetry-operation-name)|string|""|| -|[opentelemetry-config](#/etc/nginx/opentelemetry.toml)|string|"/etc/nginx/opentelemetry.toml"|| -|[otlp-collector-host](#otlp-collector-host)|string|""|| -|[otlp-collector-port](#otlp-collector-port)|int|4317|| -|[otel-max-queuesize](#otel-max-queuesize)|int||| -|[otel-schedule-delay-millis](#otel-schedule-delay-millis)|int||| -|[otel-max-export-batch-size](#otel-max-export-batch-size)|int||| -|[otel-service-name](#otel-service-name)|string|"nginx"|| -|[otel-sampler](#otel-sampler)|string|"AlwaysOff"|| -|[otel-sampler-parent-based](#otel-sampler-parent-based)|bool|"false"|| -|[otel-sampler-ratio](#otel-sampler-ratio)|float|0.01|| -|[main-snippet](#main-snippet)|string|""|| -|[http-snippet](#http-snippet)|string|""|| -|[server-snippet](#server-snippet)|string|""|| -|[stream-snippet](#stream-snippet)|string|""|| -|[location-snippet](#location-snippet)|string|""|| -|[custom-http-errors](#custom-http-errors)|[]int|[]int{}|| -|[proxy-body-size](#proxy-body-size)|string|"1m"|| -|[proxy-connect-timeout](#proxy-connect-timeout)|int|5|| -|[proxy-read-timeout](#proxy-read-timeout)|int|60|| -|[proxy-send-timeout](#proxy-send-timeout)|int|60|| -|[proxy-buffers-number](#proxy-buffers-number)|int|4|| -|[proxy-buffer-size](#proxy-buffer-size)|string|"4k"|| -|[proxy-cookie-path](#proxy-cookie-path)|string|"off"|| -|[proxy-cookie-domain](#proxy-cookie-domain)|string|"off"|| -|[proxy-next-upstream](#proxy-next-upstream)|string|"error timeout"|| -|[proxy-next-upstream-timeout](#proxy-next-upstream-timeout)|int|0|| -|[proxy-next-upstream-tries](#proxy-next-upstream-tries)|int|3|| -|[proxy-redirect-from](#proxy-redirect-from)|string|"off"|| -|[proxy-request-buffering](#proxy-request-buffering)|string|"on"|| -|[ssl-redirect](#ssl-redirect)|bool|"true"|| -|[force-ssl-redirect](#force-ssl-redirect)|bool|"false"|| -|[denylist-source-range](#denylist-source-range)|[]string|[]string{}|| -|[whitelist-source-range](#whitelist-source-range)|[]string|[]string{}|| -|[skip-access-log-urls](#skip-access-log-urls)|[]string|[]string{}|| -|[limit-rate](#limit-rate)|int|0|| -|[limit-rate-after](#limit-rate-after)|int|0|| -|[lua-shared-dicts](#lua-shared-dicts)|string|""|| -|[http-redirect-code](#http-redirect-code)|int|308|| -|[proxy-buffering](#proxy-buffering)|string|"off"|| -|[limit-req-status-code](#limit-req-status-code)|int|503|| -|[limit-conn-status-code](#limit-conn-status-code)|int|503|| -|[enable-syslog](#enable-syslog)|bool|false|| -|[syslog-host](#syslog-host)|string|""|| -|[syslog-port](#syslog-port)|int|514|| -|[no-tls-redirect-locations](#no-tls-redirect-locations)|string|"/.well-known/acme-challenge"|| -|[global-auth-url](#global-auth-url)|string|""|| -|[global-auth-method](#global-auth-method)|string|""|| -|[global-auth-signin](#global-auth-signin)|string|""|| -|[global-auth-signin-redirect-param](#global-auth-signin-redirect-param)|string|"rd"|| -|[global-auth-response-headers](#global-auth-response-headers)|string|""|| -|[global-auth-request-redirect](#global-auth-request-redirect)|string|""|| -|[global-auth-snippet](#global-auth-snippet)|string|""|| -|[global-auth-cache-key](#global-auth-cache-key)|string|""|| -|[global-auth-cache-duration](#global-auth-cache-duration)|string|"200 202 401 5m"|| -|[no-auth-locations](#no-auth-locations)|string|"/.well-known/acme-challenge"|| -|[block-cidrs](#block-cidrs)|[]string|""|| -|[block-user-agents](#block-user-agents)|[]string|""|| -|[block-referers](#block-referers)|[]string|""|| -|[proxy-ssl-location-only](#proxy-ssl-location-only)|bool|"false"|| -|[default-type](#default-type)|string|"text/html"|| -|[global-rate-limit-memcached-host](#global-rate-limit)|string|""|| -|[global-rate-limit-memcached-port](#global-rate-limit)|int|11211|| -|[global-rate-limit-memcached-connect-timeout](#global-rate-limit)|int|50|| -|[global-rate-limit-memcached-max-idle-timeout](#global-rate-limit)|int|10000|| -|[global-rate-limit-memcached-pool-size](#global-rate-limit)|int|50|| -|[global-rate-limit-status-code](#global-rate-limit)|int|429|| -|[service-upstream](#service-upstream)|bool|"false"|| -|[ssl-reject-handshake](#ssl-reject-handshake)|bool|"false"|| -|[debug-connections](#debug-connections)|[]string|"127.0.0.1,1.1.1.1/24"|| -|[strict-validate-path-type](#strict-validate-path-type)|bool|"false" (v1.7.x)|| +| name | type | default | notes | +|:--------------------------------------------------------------------------------|:-------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------| +| [add-headers](#add-headers) | string | "" | | +| [allow-backend-server-header](#allow-backend-server-header) | bool | "false" | | +| [allow-cross-namespace-resources](#allow-cross-namespace-resources) | bool | "false" | | +| [allow-snippet-annotations](#allow-snippet-annotations) | bool | "false" | | +| [annotations-risk-level](#annotations-risk-level) | string | High | | +| [annotation-value-word-blocklist](#annotation-value-word-blocklist) | string array | "" | | +| [hide-headers](#hide-headers) | string array | empty | | +| [access-log-params](#access-log-params) | string | "" | | +| [access-log-path](#access-log-path) | string | "/var/log/nginx/access.log" | | +| [http-access-log-path](#http-access-log-path) | string | "" | | +| [stream-access-log-path](#stream-access-log-path) | string | "" | | +| [enable-access-log-for-default-backend](#enable-access-log-for-default-backend) | bool | "false" | | +| [error-log-path](#error-log-path) | string | "/var/log/nginx/error.log" | | +| [enable-modsecurity](#enable-modsecurity) | bool | "false" | | +| [modsecurity-snippet](#modsecurity-snippet) | string | "" | | +| [enable-owasp-modsecurity-crs](#enable-owasp-modsecurity-crs) | bool | "false" | | +| [client-header-buffer-size](#client-header-buffer-size) | string | "1k" | | +| [client-header-timeout](#client-header-timeout) | int | 60 | | +| [client-body-buffer-size](#client-body-buffer-size) | string | "8k" | | +| [client-body-timeout](#client-body-timeout) | int | 60 | | +| [disable-access-log](#disable-access-log) | bool | "false" | | +| [disable-ipv6](#disable-ipv6) | bool | "false" | | +| [disable-ipv6-dns](#disable-ipv6-dns) | bool | "false" | | +| [enable-underscores-in-headers](#enable-underscores-in-headers) | bool | "false" | | +| [enable-ocsp](#enable-ocsp) | bool | "false" | | +| [ignore-invalid-headers](#ignore-invalid-headers) | bool | "true" | | +| [retry-non-idempotent](#retry-non-idempotent) | bool | "false" | | +| [error-log-level](#error-log-level) | string | "notice" | | +| [http2-max-field-size](#http2-max-field-size) | string | "" | DEPRECATED in favour of [large_client_header_buffers](#large-client-header-buffers) | +| [http2-max-header-size](#http2-max-header-size) | string | "" | DEPRECATED in favour of [large_client_header_buffers](#large-client-header-buffers) | +| [http2-max-requests](#http2-max-requests) | int | 0 | DEPRECATED in favour of [keepalive_requests](#keepalive-requests) | +| [http2-max-concurrent-streams](#http2-max-concurrent-streams) | int | 128 | | +| [hsts](#hsts) | bool | "true" | | +| [hsts-include-subdomains](#hsts-include-subdomains) | bool | "true" | | +| [hsts-max-age](#hsts-max-age) | string | "31536000" | | +| [hsts-preload](#hsts-preload) | bool | "false" | | +| [keep-alive](#keep-alive) | int | 75 | | +| [keep-alive-requests](#keep-alive-requests) | int | 1000 | | +| [large-client-header-buffers](#large-client-header-buffers) | string | "4 8k" | | +| [log-format-escape-none](#log-format-escape-none) | bool | "false" | | +| [log-format-escape-json](#log-format-escape-json) | bool | "false" | | +| [log-format-upstream](#log-format-upstream) | string | `$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id` | | +| [log-format-stream](#log-format-stream) | string | `[$remote_addr] [$time_local] $protocol $status $bytes_sent $bytes_received $session_time` | | +| [enable-multi-accept](#enable-multi-accept) | bool | "true" | | +| [max-worker-connections](#max-worker-connections) | int | 16384 | | +| [max-worker-open-files](#max-worker-open-files) | int | 0 | | +| [map-hash-bucket-size](#max-hash-bucket-size) | int | 64 | | +| [nginx-status-ipv4-whitelist](#nginx-status-ipv4-whitelist) | []string | "127.0.0.1" | | +| [nginx-status-ipv6-whitelist](#nginx-status-ipv6-whitelist) | []string | "::1" | | +| [proxy-real-ip-cidr](#proxy-real-ip-cidr) | []string | "0.0.0.0/0" | | +| [proxy-set-headers](#proxy-set-headers) | string | "" | | +| [server-name-hash-max-size](#server-name-hash-max-size) | int | 1024 | | +| [server-name-hash-bucket-size](#server-name-hash-bucket-size) | int | `` | +| [proxy-headers-hash-max-size](#proxy-headers-hash-max-size) | int | 512 | | +| [proxy-headers-hash-bucket-size](#proxy-headers-hash-bucket-size) | int | 64 | | +| [reuse-port](#reuse-port) | bool | "true" | | +| [server-tokens](#server-tokens) | bool | "false" | | +| [ssl-ciphers](#ssl-ciphers) | string | "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384" | | +| [ssl-ecdh-curve](#ssl-ecdh-curve) | string | "auto" | | +| [ssl-dh-param](#ssl-dh-param) | string | "" | | +| [ssl-protocols](#ssl-protocols) | string | "TLSv1.2 TLSv1.3" | | +| [ssl-session-cache](#ssl-session-cache) | bool | "true" | | +| [ssl-session-cache-size](#ssl-session-cache-size) | string | "10m" | | +| [ssl-session-tickets](#ssl-session-tickets) | bool | "false" | | +| [ssl-session-ticket-key](#ssl-session-ticket-key) | string | `` | +| [ssl-session-timeout](#ssl-session-timeout) | string | "10m" | | +| [ssl-buffer-size](#ssl-buffer-size) | string | "4k" | | +| [use-proxy-protocol](#use-proxy-protocol) | bool | "false" | | +| [proxy-protocol-header-timeout](#proxy-protocol-header-timeout) | string | "5s" | | +| [enable-aio-write](#enable-aio-write) | bool | "true" | | +| [use-gzip](#use-gzip) | bool | "false" | | +| [use-geoip](#use-geoip) | bool | "true" | | +| [use-geoip2](#use-geoip2) | bool | "false" | | +| [geoip2-autoreload-in-minutes](#geoip2-autoreload-in-minutes) | int | "0" | | +| [enable-brotli](#enable-brotli) | bool | "false" | | +| [brotli-level](#brotli-level) | int | 4 | | +| [brotli-min-length](#brotli-min-length) | int | 20 | | +| [brotli-types](#brotli-types) | string | "application/xml+rss application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component" | | +| [use-http2](#use-http2) | bool | "true" | | +| [gzip-disable](#gzip-disable) | string | "" | | +| [gzip-level](#gzip-level) | int | 1 | | +| [gzip-min-length](#gzip-min-length) | int | 256 | | +| [gzip-types](#gzip-types) | string | "application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component" | | +| [worker-processes](#worker-processes) | string | `` | | +| [worker-cpu-affinity](#worker-cpu-affinity) | string | "" | | +| [worker-shutdown-timeout](#worker-shutdown-timeout) | string | "240s" | | +| [enable-serial-reloads](#enable-serial-reloads) | bool | "false" | | +| [load-balance](#load-balance) | string | "round_robin" | | +| [variables-hash-bucket-size](#variables-hash-bucket-size) | int | 128 | | +| [variables-hash-max-size](#variables-hash-max-size) | int | 2048 | | +| [upstream-keepalive-connections](#upstream-keepalive-connections) | int | 320 | | +| [upstream-keepalive-time](#upstream-keepalive-time) | string | "1h" | | +| [upstream-keepalive-timeout](#upstream-keepalive-timeout) | int | 60 | | +| [upstream-keepalive-requests](#upstream-keepalive-requests) | int | 10000 | | +| [limit-conn-zone-variable](#limit-conn-zone-variable) | string | "$binary_remote_addr" | | +| [proxy-stream-timeout](#proxy-stream-timeout) | string | "600s" | | +| [proxy-stream-next-upstream](#proxy-stream-next-upstream) | bool | "true" | | +| [proxy-stream-next-upstream-timeout](#proxy-stream-next-upstream-timeout) | string | "600s" | | +| [proxy-stream-next-upstream-tries](#proxy-stream-next-upstream-tries) | int | 3 | | +| [proxy-stream-responses](#proxy-stream-responses) | int | 1 | | +| [bind-address](#bind-address) | []string | "" | | +| [use-forwarded-headers](#use-forwarded-headers) | bool | "false" | | +| [enable-real-ip](#enable-real-ip) | bool | "false" | | +| [forwarded-for-header](#forwarded-for-header) | string | "X-Forwarded-For" | | +| [compute-full-forwarded-for](#compute-full-forwarded-for) | bool | "false" | | +| [proxy-add-original-uri-header](#proxy-add-original-uri-header) | bool | "false" | | +| [generate-request-id](#generate-request-id) | bool | "true" | | +| [jaeger-collector-host](#jaeger-collector-host) | string | "" | | +| [jaeger-collector-port](#jaeger-collector-port) | int | 6831 | | +| [jaeger-endpoint](#jaeger-endpoint) | string | "" | | +| [jaeger-service-name](#jaeger-service-name) | string | "nginx" | | +| [jaeger-propagation-format](#jaeger-propagation-format) | string | "jaeger" | | +| [jaeger-sampler-type](#jaeger-sampler-type) | string | "const" | | +| [jaeger-sampler-param](#jaeger-sampler-param) | string | "1" | | +| [jaeger-sampler-host](#jaeger-sampler-host) | string | "http://127.0.0.1" | | +| [jaeger-sampler-port](#jaeger-sampler-port) | int | 5778 | | +| [jaeger-trace-context-header-name](#jaeger-trace-context-header-name) | string | uber-trace-id | | +| [jaeger-debug-header](#jaeger-debug-header) | string | uber-debug-id | | +| [jaeger-baggage-header](#jaeger-baggage-header) | string | jaeger-baggage | | +| [jaeger-trace-baggage-header-prefix](#jaeger-trace-baggage-header-prefix) | string | uberctx- | | +| [datadog-collector-host](#datadog-collector-host) | string | "" | | +| [datadog-collector-port](#datadog-collector-port) | int | 8126 | | +| [datadog-service-name](#datadog-service-name) | string | "nginx" | | +| [datadog-environment](#datadog-environment) | string | "prod" | | +| [datadog-operation-name-override](#datadog-operation-name-override) | string | "nginx.handle" | | +| [datadog-priority-sampling](#datadog-priority-sampling) | bool | "true" | | +| [datadog-sample-rate](#datadog-sample-rate) | float | 1.0 | | +| [enable-opentelemetry](#enable-opentelemetry) | bool | "false" | | +| [opentelemetry-trust-incoming-span](#opentelemetry-trust-incoming-span) | bool | "true" | | +| [opentelemetry-operation-name](#opentelemetry-operation-name) | string | "" | | +| [opentelemetry-config](#/etc/nginx/opentelemetry.toml) | string | "/etc/nginx/opentelemetry.toml" | | +| [otlp-collector-host](#otlp-collector-host) | string | "" | | +| [otlp-collector-port](#otlp-collector-port) | int | 4317 | | +| [otel-max-queuesize](#otel-max-queuesize) | int | | | +| [otel-schedule-delay-millis](#otel-schedule-delay-millis) | int | | | +| [otel-max-export-batch-size](#otel-max-export-batch-size) | int | | | +| [otel-service-name](#otel-service-name) | string | "nginx" | | +| [otel-sampler](#otel-sampler) | string | "AlwaysOff" | | +| [otel-sampler-parent-based](#otel-sampler-parent-based) | bool | "false" | | +| [otel-sampler-ratio](#otel-sampler-ratio) | float | 0.01 | | +| [main-snippet](#main-snippet) | string | "" | | +| [http-snippet](#http-snippet) | string | "" | | +| [server-snippet](#server-snippet) | string | "" | | +| [stream-snippet](#stream-snippet) | string | "" | | +| [location-snippet](#location-snippet) | string | "" | | +| [custom-http-errors](#custom-http-errors) | []int | []int{} | | +| [proxy-body-size](#proxy-body-size) | string | "1m" | | +| [proxy-connect-timeout](#proxy-connect-timeout) | int | 5 | | +| [proxy-read-timeout](#proxy-read-timeout) | int | 60 | | +| [proxy-send-timeout](#proxy-send-timeout) | int | 60 | | +| [proxy-buffers-number](#proxy-buffers-number) | int | 4 | | +| [proxy-buffer-size](#proxy-buffer-size) | string | "4k" | | +| [proxy-busy-buffers-size](#proxy-busy-buffers-size) | string | "8k" | | +| [proxy-cookie-path](#proxy-cookie-path) | string | "off" | | +| [proxy-cookie-domain](#proxy-cookie-domain) | string | "off" | | +| [proxy-next-upstream](#proxy-next-upstream) | string | "error timeout" | | +| [proxy-next-upstream-timeout](#proxy-next-upstream-timeout) | int | 0 | | +| [proxy-next-upstream-tries](#proxy-next-upstream-tries) | int | 3 | | +| [proxy-redirect-from](#proxy-redirect-from) | string | "off" | | +| [proxy-request-buffering](#proxy-request-buffering) | string | "on" | | +| [ssl-redirect](#ssl-redirect) | bool | "true" | | +| [force-ssl-redirect](#force-ssl-redirect) | bool | "false" | | +| [denylist-source-range](#denylist-source-range) | []string | []string{} | | +| [whitelist-source-range](#whitelist-source-range) | []string | []string{} | | +| [skip-access-log-urls](#skip-access-log-urls) | []string | []string{} | | +| [limit-rate](#limit-rate) | int | 0 | | +| [limit-rate-after](#limit-rate-after) | int | 0 | | +| [lua-shared-dicts](#lua-shared-dicts) | string | "" | | +| [http-redirect-code](#http-redirect-code) | int | 308 | | +| [proxy-buffering](#proxy-buffering) | string | "off" | | +| [limit-req-status-code](#limit-req-status-code) | int | 503 | | +| [limit-conn-status-code](#limit-conn-status-code) | int | 503 | | +| [enable-syslog](#enable-syslog) | bool | "false" | | +| [syslog-host](#syslog-host) | string | "" | | +| [syslog-port](#syslog-port) | int | 514 | | +| [no-tls-redirect-locations](#no-tls-redirect-locations) | string | "/.well-known/acme-challenge" | | +| [global-allowed-response-headers](#global-allowed-response-headers) | string | "" | | +| [global-auth-url](#global-auth-url) | string | "" | | +| [global-auth-method](#global-auth-method) | string | "" | | +| [global-auth-signin](#global-auth-signin) | string | "" | | +| [global-auth-signin-redirect-param](#global-auth-signin-redirect-param) | string | "rd" | | +| [global-auth-response-headers](#global-auth-response-headers) | string | "" | | +| [global-auth-request-redirect](#global-auth-request-redirect) | string | "" | | +| [global-auth-snippet](#global-auth-snippet) | string | "" | | +| [global-auth-cache-key](#global-auth-cache-key) | string | "" | | +| [global-auth-cache-duration](#global-auth-cache-duration) | string | "200 202 401 5m" | | +| [no-auth-locations](#no-auth-locations) | string | "/.well-known/acme-challenge" | | +| [block-cidrs](#block-cidrs) | []string | "" | | +| [block-user-agents](#block-user-agents) | []string | "" | | +| [block-referers](#block-referers) | []string | "" | | +| [proxy-ssl-location-only](#proxy-ssl-location-only) | bool | "false" | | +| [default-type](#default-type) | string | "text/html" | | +| [service-upstream](#service-upstream) | bool | "false" | | +| [ssl-reject-handshake](#ssl-reject-handshake) | bool | "false" | | +| [debug-connections](#debug-connections) | []string | "127.0.0.1,1.1.1.1/24" | | +| [strict-validate-path-type](#strict-validate-path-type) | bool | "true" | | +| [grpc-buffer-size-kb](#grpc-buffer-size-kb) | int | 0 | | +| [relative-redirects](#relative-redirects) | bool | false | | ## add-headers @@ -244,18 +236,16 @@ Enables the return of the header Server from the backend instead of the generic ## allow-cross-namespace-resources -Enables users to consume cross namespace resource on annotations, when was previously enabled . _**default:**_ true +Enables users to consume cross namespace resource on annotations, when was previously enabled . _**default:**_ false **Annotations that may be impacted with this change**: + * `auth-secret` * `auth-proxy-set-header` * `auth-tls-secret` * `fastcgi-params-configmap` * `proxy-ssl-secret` - -**This option will be defaulted to false in the next major release** - ## allow-snippet-annotations Enables Ingress to parse and add *-snippet annotations/directives created by the user. _**default:**_ `false` @@ -263,15 +253,13 @@ Enables Ingress to parse and add *-snippet annotations/directives created by the Warning: We recommend enabling this option only if you TRUST users with permission to create Ingress objects, as this may allow a user to add restricted configurations to the final nginx.conf file -**This option will be defaulted to false in the next major release** - ## annotations-risk-level Represents the risk accepted on an annotation. If the risk is, for instance `Medium`, annotations with risk High and Critical will not be accepted. Accepted values are `Critical`, `High`, `Medium` and `Low`. -Defaults to `Critical` but will be changed to `High` on the next minor release +_**default:**_ `High` ## annotation-value-word-blocklist @@ -615,10 +603,6 @@ _References:_ - [https://nginx.org/en/docs/hash.html](https://nginx.org/en/docs/hash.html) - [https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_headers_hash_bucket_size) -## plugins - -Activates plugins installed in `/etc/nginx/lua/plugins`. Refer to [ingress-nginx plugins README](https://github.com/kubernetes/ingress-nginx/blob/main/rootfs/etc/nginx/lua/plugins/README.md) for more information on how to write and install a plugin. - ## server-tokens Send NGINX Server header in responses and display NGINX version in error pages. _**default:**_ is disabled @@ -728,15 +712,21 @@ _**default:**_ true ## use-geoip2 Enables the [geoip2 module](https://github.com/leev/ngx_http_geoip2_module) for NGINX. -Since `0.27.0` and due to a [change in the MaxMind databases](https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases) a license is required to have access to the databases. +Since `0.27.0` and due to a [change in the MaxMind databases](https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/) a license is required to have access to the databases. For this reason, it is required to define a new flag `--maxmind-license-key` in the ingress controller deployment to download the databases needed during the initialization of the ingress controller. -Alternatively, it is possible to use a volume to mount the files `/etc/nginx/geoip/GeoLite2-City.mmdb` and `/etc/nginx/geoip/GeoLite2-ASN.mmdb`, avoiding the overhead of the download. +Alternatively, it is possible to use a volume to mount the files `/etc/ingress-controller/geoip/GeoLite2-City.mmdb` and `/etc/ingress-controller/geoip/GeoLite2-ASN.mmdb`, avoiding the overhead of the download. !!! important If the feature is enabled but the files are missing, GeoIP2 will not be enabled. _**default:**_ false +## geoip2-autoreload-in-minutes + +Enables the [geoip2 module](https://github.com/leev/ngx_http_geoip2_module) autoreload in MaxMind databases setting the interval in minutes. + +_**default:**_ 0 + ## enable-brotli Enables or disables compression of HTTP responses using the ["brotli" module](https://github.com/google/ngx_brotli). @@ -935,41 +925,6 @@ Adds an X-Original-Uri header with the original request URI to the backend reque Ensures that X-Request-ID is defaulted to a random value, if no X-Request-ID is present in the request -## enable-opentracing - -Enables the nginx Opentracing extension. _**default:**_ is disabled - -_References:_ -[https://github.com/opentracing-contrib/nginx-opentracing](https://github.com/opentracing-contrib/nginx-opentracing) - -## opentracing-operation-name - -Specifies a custom name for the server span. _**default:**_ is empty - -For example, set to "HTTP $request_method $uri". - -## opentracing-location-operation-name - -Specifies a custom name for the location span. _**default:**_ is empty - -For example, set to "HTTP $request_method $uri". - -## zipkin-collector-host - -Specifies the host to use when uploading traces. It must be a valid URL. - -## zipkin-collector-port - -Specifies the port to use when uploading traces. _**default:**_ 9411 - -## zipkin-service-name - -Specifies the service name to use for any traces created. _**default:**_ nginx - -## zipkin-sample-rate - -Specifies sample rate for any traces created. _**default:**_ 1.0 - ## jaeger-collector-host Specifies the host to use when uploading traces. It must be a valid URL. @@ -1133,14 +1088,20 @@ See NGINX [client_max_body_size](https://nginx.org/en/docs/http/ngx_http_core_mo Sets the timeout for [establishing a connection with a proxied server](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout). It should be noted that this timeout cannot usually exceed 75 seconds. +It will also set the [grpc_connect_timeout](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_connect_timeout) for gRPC connections. + ## proxy-read-timeout Sets the timeout in seconds for [reading a response from the proxied server](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout). The timeout is set only between two successive read operations, not for the transmission of the whole response. +It will also set the [grpc_read_timeout](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_read_timeout) for gRPC connections. + ## proxy-send-timeout Sets the timeout in seconds for [transmitting a request to the proxied server](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout). The timeout is set only between two successive write operations, not for the transmission of the whole request. +It will also set the [grpc_send_timeout](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_send_timeout) for gRPC connections. + ## proxy-buffers-number Sets the number of the buffer used for [reading the first part of the response](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers) received from the proxied server. This part usually contains a small response header. @@ -1149,6 +1110,10 @@ Sets the number of the buffer used for [reading the first part of the response]( Sets the size of the buffer used for [reading the first part of the response](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size) received from the proxied server. This part usually contains a small response header. +## proxy-busy-buffers-size + +[Limits the total size of buffers that can be busy](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size) sending a response to the client while the response is not yet fully read. + ## proxy-cookie-path Sets a text that [should be changed in the path attribute](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_path) of the “Set-Cookie” header fields of a proxied server response. @@ -1214,6 +1179,9 @@ _References:_ Sets the initial amount after which the further transmission of a response to a client will be rate limited. +_References:_ +[https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate_after](https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate_after) + ## lua-shared-dicts Customize default Lua shared dictionaries or define more. You can use the following syntax to do so: @@ -1235,9 +1203,6 @@ You can optionally set a size unit to allow for kilobyte-granularity. Allowed un lua-shared-dicts: "certificate_data: 100, my_custom_plugin: 512k" ``` -_References:_ -[https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate_after](https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate_after) - ## http-redirect-code Sets the HTTP status code to be used in redirects. @@ -1277,6 +1242,10 @@ Sets the port of syslog server. _**default:**_ 514 A comma-separated list of locations on which http requests will never get redirected to their https counterpart. _**default:**_ "/.well-known/acme-challenge" +## global-allowed-response-headers + +A comma-separated list of allowed response headers inside the [custom headers annotations](https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md#custom-headers) + ## global-auth-url A url to an existing service that provides authentication for all the locations. @@ -1376,22 +1345,6 @@ _**default:**_ text/html _References:_ [https://nginx.org/en/docs/http/ngx_http_core_module.html#default_type](https://nginx.org/en/docs/http/ngx_http_core_module.html#default_type) -## global-rate-limit - -* `global-rate-limit-status-code`: configure HTTP status code to return when rejecting requests. Defaults to 429. - -Configure `memcached` client for [Global Rate Limiting](https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md#global-rate-limiting). - -* `global-rate-limit-memcached-host`: IP/FQDN of memcached server to use. Required to enable Global Rate Limiting. -* `global-rate-limit-memcached-port`: port of memcached server to use. Defaults default memcached port of `11211`. -* `global-rate-limit-memcached-connect-timeout`: configure timeout for connect, send and receive operations. Unit is millisecond. Defaults to 50ms. -* `global-rate-limit-memcached-max-idle-timeout`: configure timeout for cleaning idle connections. Unit is millisecond. Defaults to 50ms. -* `global-rate-limit-memcached-pool-size`: configure number of max connections to keep alive. Make sure your `memcached` server can handle -`global-rate-limit-memcached-pool-size * worker-processes * ` simultaneous connections. - -These settings get used by [lua-resty-global-throttle](https://github.com/ElvinEfendi/lua-resty-global-throttle) -that ingress-nginx includes. Refer to the link to learn more about `lua-resty-global-throttle`. - ## service-upstream Set if the service's Cluster IP and port should be used instead of a list of all endpoints. This can be overwritten by an annotation on an Ingress rule. @@ -1413,6 +1366,7 @@ _References:_ [http://nginx.org/en/docs/ngx_core_module.html#debug_connection](http://nginx.org/en/docs/ngx_core_module.html#debug_connection) ## strict-validate-path-type + Ingress objects contains a field called pathType that defines the proxy behavior. It can be `Exact`, `Prefix` and `ImplementationSpecific`. When pathType is configured as `Exact` or `Prefix`, there should be a more strict validation, allowing only paths starting with "/" and @@ -1425,3 +1379,23 @@ This means that Ingress objects that rely on paths containing regex characters s The cluster admin should establish validation rules using mechanisms like [Open Policy Agent](https://www.openpolicyagent.org/) to validate that only authorized users can use `ImplementationSpecific` pathType and that only the authorized characters can be used. + +_**default:**_ "true" + +## grpc-buffer-size-kb + +Sets the configuration for the GRPC Buffer Size parameter. If not set it will use the default from NGINX. + +_References:_ +[https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_buffer_size](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_buffer_size) + +## relative-redirects + +Use relative redirects instead of absolute redirects. Absolute redirects are the default in nginx. RFC7231 allows relative redirects since 2014. +Similar to the Ingress rule annotation `nginx.ingress.kubernetes.io/relative-redirects`. + +_**default:**_ "false" + +_References:_ +- [https://nginx.org/en/docs/http/ngx_http_core_module.html#absolute_redirect](https://nginx.org/en/docs/http/ngx_http_core_module.html#absolute_redirect) +- [https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.2](https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.2) diff --git a/docs/user-guide/retaining-client-ipaddress.md b/docs/user-guide/retaining-client-ipaddress.md deleted file mode 100644 index 237bd3004..000000000 --- a/docs/user-guide/retaining-client-ipaddress.md +++ /dev/null @@ -1,44 +0,0 @@ - -## Retaining Client IPAddress - -Please read this https://kubernetes.github.io/ingress-nginx/user-guide/miscellaneous/#source-ip-address , to get details of retaining the client IPAddress. - -### Using proxy-protocol - -Please read this https://kubernetes.github.io/ingress-nginx/user-guide/miscellaneous/#proxy-protocol , to use proxy-protocol for retaining client IPAddress - - -### Using the K8S spec service.spec.externalTrafficPolicy - -``` -% kubectl explain service.spec.externalTrafficPolicy -KIND: Service -VERSION: v1 - -FIELD: externalTrafficPolicy - -DESCRIPTION: - externalTrafficPolicy describes how nodes distribute service traffic they - receive on one of the Service's "externally-facing" addresses (NodePorts, - ExternalIPs, and LoadBalancer IPs). If set to "Local", the proxy will - configure the service in a way that assumes that external load balancers - will take care of balancing the service traffic between nodes, and so each - node will deliver traffic only to the node-local endpoints of the service, - without masquerading the client source IP. (Traffic mistakenly sent to a - node with no endpoints will be dropped.) The default value, "Cluster", uses - the standard behavior of routing to all endpoints evenly (possibly modified - by topology and other features). Note that traffic sent to an External IP or - LoadBalancer IP from within the cluster will always get "Cluster" semantics, - but clients sending to a NodePort from within the cluster may need to take - traffic policy into account when picking a node. - - Possible enum values: - - `"Cluster"` routes traffic to all endpoints. - - `"Local"` preserves the source IP of the traffic by routing only to - endpoints on the same node as the traffic was received on (dropping the - traffic if there are no local endpoints). - -``` - - -- Setting the field `externalTrafficPolicy`, in the ingress-controller service, to a value of `Local` retains the client's ipaddress, within the scope explained above diff --git a/docs/user-guide/third-party-addons/modsecurity.md b/docs/user-guide/third-party-addons/modsecurity.md index 93a7f4097..38d39888d 100644 --- a/docs/user-guide/third-party-addons/modsecurity.md +++ b/docs/user-guide/third-party-addons/modsecurity.md @@ -14,3 +14,97 @@ The default `Serial` value in SecAuditLogType can impact performance. The OWASP ModSecurity Core Rule Set (CRS) is a set of generic attack detection rules for use with ModSecurity or compatible web application firewalls. The CRS aims to protect web applications from a wide range of attacks, including the OWASP Top Ten, with a minimum of false alerts. The directory `/etc/nginx/owasp-modsecurity-crs` contains the [OWASP ModSecurity Core Rule Set repository](https://github.com/coreruleset/coreruleset). Using `enable-owasp-modsecurity-crs: "true"` we enable the use of the rules. + +## Supported annotations + +For more info on supported annotations, please see [annotations/#modsecurity](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#modsecurity) + +## Example of using ModSecurity with plugins via the helm chart + +Suppose you have a ConfigMap that contains the contents of the [nextcloud-rule-exclusions plugin](https://github.com/coreruleset/nextcloud-rule-exclusions-plugin/blob/main/plugins/nextcloud-rule-exclusions-before.conf) like this: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: modsecurity-plugins +data: + empty-after.conf: | + # no data + empty-before.conf: | + # no data + empty-config.conf: | + # no data + nextcloud-rule-exclusions-before.conf: + # this is just a snippet + # find the full file at https://github.com/coreruleset/nextcloud-rule-exclusions-plugin + # + # [ File Manager ] + # The web interface uploads files, and interacts with the user. + SecRule REQUEST_FILENAME "@contains /remote.php/webdav" \ + "id:9508102,\ + phase:1,\ + pass,\ + t:none,\ + nolog,\ + ver:'nextcloud-rule-exclusions-plugin/1.2.0',\ + ctl:ruleRemoveById=920420,\ + ctl:ruleRemoveById=920440,\ + ctl:ruleRemoveById=941000-942999,\ + ctl:ruleRemoveById=951000-951999,\ + ctl:ruleRemoveById=953100-953130,\ + ctl:ruleRemoveByTag=attack-injection-php" +``` + +If you're using the helm chart, you can pass in the following parameters in your `values.yaml`: + +```yaml +controller: + config: + # Enables Modsecurity + enable-modsecurity: "true" + + # Update ModSecurity config and rules + modsecurity-snippet: | + # this enables the mod security nextcloud plugin + Include /etc/nginx/owasp-modsecurity-crs/plugins/nextcloud-rule-exclusions-before.conf + + # this enables the default OWASP Core Rule Set + Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf + + # Enable prevention mode. Options: DetectionOnly,On,Off (default is DetectionOnly) + SecRuleEngine On + + # Enable scanning of the request body + SecRequestBodyAccess On + + # Enable XML and JSON parsing + SecRule REQUEST_HEADERS:Content-Type "(?:text|application(?:/soap\+|/)|application/xml)/" \ + "id:200000,phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML" + + SecRule REQUEST_HEADERS:Content-Type "application/json" \ + "id:200001,phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" + + # Reject if larger (we could also let it pass with ProcessPartial) + SecRequestBodyLimitAction Reject + + # Send ModSecurity audit logs to the stdout (only for rejected requests) + SecAuditLog /dev/stdout + + # format the logs in JSON + SecAuditLogFormat JSON + + # could be On/Off/RelevantOnly + SecAuditEngine RelevantOnly + + # Add a volume for the plugins directory + extraVolumes: + - name: plugins + configMap: + name: modsecurity-plugins + + # override the /etc/nginx/enable-owasp-modsecurity-crs/plugins with your ConfigMap + extraVolumeMounts: + - name: plugins + mountPath: /etc/nginx/owasp-modsecurity-crs/plugins +``` diff --git a/docs/user-guide/third-party-addons/opentelemetry.md b/docs/user-guide/third-party-addons/opentelemetry.md index d735fca4f..255ba1ffa 100644 --- a/docs/user-guide/third-party-addons/opentelemetry.md +++ b/docs/user-guide/third-party-addons/opentelemetry.md @@ -1,314 +1,304 @@ -# OpenTelemetry - -Enables requests served by NGINX for distributed telemetry via The OpenTelemetry Project. - -Using the third party module [opentelemetry-cpp-contrib/nginx](https://github.com/open-telemetry/opentelemetry-cpp-contrib/tree/main/instrumentation/nginx) the Ingress-Nginx Controller can configure NGINX to enable [OpenTelemetry](http://opentelemetry.io) instrumentation. -By default this feature is disabled. - -Check out this demo showcasing OpenTelemetry in Ingress NGINX. The video provides an overview and -practical demonstration of how OpenTelemetry can be utilized in Ingress NGINX for observability -and monitoring purposes. - -

- - Video Thumbnail - -

- -

Demo: OpenTelemetry in Ingress NGINX.

- -## Usage - -To enable the instrumentation we must enable OpenTelemetry in the configuration ConfigMap: -```yaml -data: - enable-opentelemetry: "true" -``` - -To enable or disable instrumentation for a single Ingress, use -the `enable-opentelemetry` annotation: -```yaml -kind: Ingress -metadata: - annotations: - nginx.ingress.kubernetes.io/enable-opentelemetry: "true" -``` - -We must also set the host to use when uploading traces: - -```yaml -otlp-collector-host: "otel-coll-collector.otel.svc" -``` -NOTE: While the option is called `otlp-collector-host`, you will need to point this to any backend that receives otlp-grpc. - -Next you will need to deploy a distributed telemetry system which uses OpenTelemetry. -[opentelemetry-collector](https://github.com/open-telemetry/opentelemetry-collector), [Jaeger](https://www.jaegertracing.io/) -[Tempo](https://github.com/grafana/tempo), and [zipkin](https://zipkin.io/) -have been tested. - -Other optional configuration options: -```yaml -# specifies the name to use for the server span -opentelemetry-operation-name - -# sets whether or not to trust incoming telemetry spans -opentelemetry-trust-incoming-span - -# specifies the port to use when uploading traces, Default: 4317 -otlp-collector-port - -# specifies the service name to use for any traces created, Default: nginx -otel-service-name - -# The maximum queue size. After the size is reached data are dropped. -otel-max-queuesize - -# The delay interval in milliseconds between two consecutive exports. -otel-schedule-delay-millis - -# How long the export can run before it is cancelled. -otel-schedule-delay-millis - -# The maximum batch size of every export. It must be smaller or equal to maxQueueSize. -otel-max-export-batch-size - -# specifies sample rate for any traces created, Default: 0.01 -otel-sampler-ratio - -# specifies the sampler to be used when sampling traces. -# The available samplers are: AlwaysOn, AlwaysOff, TraceIdRatioBased, Default: AlwaysOff -otel-sampler - -# Uses sampler implementation which by default will take a sample if parent Activity is sampled, Default: false -otel-sampler-parent-based -``` - -Note that you can also set whether to trust incoming spans (global default is true) per-location using annotations like the following: -```yaml -kind: Ingress -metadata: - annotations: - nginx.ingress.kubernetes.io/opentelemetry-trust-incoming-span: "true" -``` - -## Examples - -The following examples show how to deploy and test different distributed telemetry systems. These example can be performed using Docker Desktop. - -In the [esigo/nginx-example](https://github.com/esigo/nginx-example) -GitHub repository is an example of a simple hello service: - -```mermaid -graph TB - subgraph Browser - start["http://esigo.dev/hello/nginx"] - end - - subgraph app - sa[service-a] - sb[service-b] - sa --> |name: nginx| sb - sb --> |hello nginx!| sa - end - - subgraph otel - otc["Otel Collector"] - end - - subgraph observability - tempo["Tempo"] - grafana["Grafana"] - backend["Jaeger"] - zipkin["Zipkin"] - end - - subgraph ingress-nginx - ngx[nginx] - end - - subgraph ngx[nginx] - ng[nginx] - om[OpenTelemetry module] - end - - subgraph Node - app - otel - observability - ingress-nginx - om --> |otlp-gRPC| otc --> |jaeger| backend - otc --> |zipkin| zipkin - otc --> |otlp-gRPC| tempo --> grafana - sa --> |otlp-gRPC| otc - sb --> |otlp-gRPC| otc - start --> ng --> sa - end -``` - -To install the example and collectors run: - -1. Enable Ingress addon with: - - ```yaml - opentelemetry: - enabled: true - image: registry.k8s.io/ingress-nginx/opentelemetry:v20230527@sha256:fd7ec835f31b7b37187238eb4fdad4438806e69f413a203796263131f4f02ed0 - containerSecurityContext: - allowPrivilegeEscalation: false - ``` - -2. Enable OpenTelemetry and set the otlp-collector-host: - - ```yaml - $ echo ' - apiVersion: v1 - kind: ConfigMap - data: - enable-opentelemetry: "true" - opentelemetry-config: "/etc/nginx/opentelemetry.toml" - opentelemetry-operation-name: "HTTP $request_method $service_name $uri" - opentelemetry-trust-incoming-span: "true" - otlp-collector-host: "otel-coll-collector.otel.svc" - otlp-collector-port: "4317" - otel-max-queuesize: "2048" - otel-schedule-delay-millis: "5000" - otel-max-export-batch-size: "512" - otel-service-name: "nginx-proxy" # Opentelemetry resource name - otel-sampler: "AlwaysOn" # Also: AlwaysOff, TraceIdRatioBased - otel-sampler-ratio: "1.0" - otel-sampler-parent-based: "false" - metadata: - name: ingress-nginx-controller - namespace: ingress-nginx - ' | kubectl replace -f - - ``` - -4. Deploy otel-collector, grafana and Jaeger backend: - - ```bash - # add helm charts needed for grafana and OpenTelemetry collector - helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts - helm repo add grafana https://grafana.github.io/helm-charts - helm repo update - # deply cert-manager needed for OpenTelemetry collector operator - kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml - # create observability namespace - kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/namespace.yaml - # install OpenTelemetry collector operator - helm upgrade --install otel-collector-operator -n otel --create-namespace open-telemetry/opentelemetry-operator - # deploy OpenTelemetry collector - kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/collector.yaml - # deploy Jaeger all-in-one - kubectl apply -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.37.0/jaeger-operator.yaml -n observability - kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/jaeger.yaml -n observability - # deploy zipkin - kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/zipkin.yaml -n observability - # deploy tempo and grafana - helm upgrade --install tempo grafana/tempo --create-namespace -n observability - helm upgrade -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/grafana/grafana-values.yaml --install grafana grafana/grafana --create-namespace -n observability - ``` - -3. Build and deploy demo app: - - ```bash - # build images - make images - - # deploy demo app: - make deploy-app - ``` - -5. Make a few requests to the Service: - - ```bash - kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8090:80 - curl http://esigo.dev:8090/hello/nginx - - - StatusCode : 200 - StatusDescription : OK - Content : {"v":"hello nginx!"} - - RawContent : HTTP/1.1 200 OK - Connection: keep-alive - Content-Length: 21 - Content-Type: text/plain; charset=utf-8 - Date: Mon, 10 Oct 2022 17:43:33 GMT - - {"v":"hello nginx!"} - - Forms : {} - Headers : {[Connection, keep-alive], [Content-Length, 21], [Content-Type, text/plain; charset=utf-8], [Date, - Mon, 10 Oct 2022 17:43:33 GMT]} - Images : {} - InputFields : {} - Links : {} - ParsedHtml : System.__ComObject - RawContentLength : 21 - ``` - -6. View the Grafana UI: - - ```bash - kubectl port-forward --namespace=observability service/grafana 3000:80 - ``` - In the Grafana interface we can see the details: - ![grafana screenshot](../../images/otel-grafana-demo.png "grafana screenshot") - -7. View the Jaeger UI: - - ```bash - kubectl port-forward --namespace=observability service/jaeger-all-in-one-query 16686:16686 - ``` - In the Jaeger interface we can see the details: - ![Jaeger screenshot](../../images/otel-jaeger-demo.png "Jaeger screenshot") - -8. View the Zipkin UI: - - ```bash - kubectl port-forward --namespace=observability service/zipkin 9411:9411 - ``` - In the Zipkin interface we can see the details: - ![zipkin screenshot](../../images/otel-zipkin-demo.png "zipkin screenshot") - -## Migration from OpenTracing, Jaeger, Zipkin and Datadog - -If you are migrating from OpenTracing, Jaeger, Zipkin, or Datadog to OpenTelemetry, -you may need to update various annotations and configurations. Here are the mappings -for common annotations and configurations: - -### Annotations - -| Legacy | OpenTelemetry | -|--------------------------------------------------|--------------------------------------------------| -| `nginx.ingress.kubernetes.io/enable-opentracing` | `nginx.ingress.kubernetes.io/enable-opentelemetry` | -| `opentracing-trust-incoming-span` | `opentracing-trust-incoming-span` | - -### Configs - -| Legacy | OpenTelemetry | -|---------------------------------------|----------------------------------------------| -| `opentracing-operation-name` | `opentelemetry-operation-name` | -| `opentracing-location-operation-name` | `opentelemetry-operation-name` | -| `opentracing-trust-incoming-span` | `opentelemetry-trust-incoming-span` | -| `zipkin-collector-port` | `otlp-collector-port` | -| `zipkin-service-name` | `otel-service-name` | -| `zipkin-sample-rate` | `otel-sampler-ratio` | -| `jaeger-collector-port` | `otlp-collector-port` | -| `jaeger-endpoint` | `otlp-collector-port`, `otlp-collector-host` | -| `jaeger-service-name` | `otel-service-name` | -| `jaeger-propagation-format` | `N/A` | -| `jaeger-sampler-type` | `otel-sampler` | -| `jaeger-sampler-param` | `otel-sampler` | -| `jaeger-sampler-host` | `N/A` | -| `jaeger-sampler-port` | `N/A` | -| `jaeger-trace-context-header-name` | `N/A` | -| `jaeger-debug-header` | `N/A` | -| `jaeger-baggage-header` | `N/A` | -| `jaeger-tracer-baggage-header-prefix` | `N/A` | -| `datadog-collector-port` | `otlp-collector-port` | -| `datadog-service-name` | `otel-service-name` | -| `datadog-environment` | `N/A` | -| `datadog-operation-name-override` | `N/A` | -| `datadog-priority-sampling` | `otel-sampler` | -| `datadog-sample-rate` | `otel-sampler-ratio` | +# OpenTelemetry + +Enables requests served by NGINX for distributed telemetry via The OpenTelemetry Project. + +Using the third party module [opentelemetry-cpp-contrib/nginx](https://github.com/open-telemetry/opentelemetry-cpp-contrib/tree/main/instrumentation/nginx) the Ingress-Nginx Controller can configure NGINX to enable [OpenTelemetry](http://opentelemetry.io) instrumentation. +By default this feature is disabled. + +Check out this demo showcasing OpenTelemetry in Ingress NGINX. The video provides an overview and +practical demonstration of how OpenTelemetry can be utilized in Ingress NGINX for observability +and monitoring purposes. + +

+ + Video Thumbnail + +

+ +

Demo: OpenTelemetry in Ingress NGINX.

+ +## Usage + +To enable the instrumentation we must enable OpenTelemetry in the configuration ConfigMap: +```yaml +data: + enable-opentelemetry: "true" +``` + +To enable or disable instrumentation for a single Ingress, use +the `enable-opentelemetry` annotation: +```yaml +kind: Ingress +metadata: + annotations: + nginx.ingress.kubernetes.io/enable-opentelemetry: "true" +``` + +We must also set the host to use when uploading traces: + +```yaml +otlp-collector-host: "otel-coll-collector.otel.svc" +``` +NOTE: While the option is called `otlp-collector-host`, you will need to point this to any backend that receives otlp-grpc. + +Next you will need to deploy a distributed telemetry system which uses OpenTelemetry. +[opentelemetry-collector](https://github.com/open-telemetry/opentelemetry-collector), [Jaeger](https://www.jaegertracing.io/) +[Tempo](https://github.com/grafana/tempo), and [zipkin](https://zipkin.io/) +have been tested. + +Other optional configuration options: +```yaml +# specifies the name to use for the server span +opentelemetry-operation-name + +# sets whether or not to trust incoming telemetry spans +opentelemetry-trust-incoming-span + +# specifies the port to use when uploading traces, Default: 4317 +otlp-collector-port + +# specifies the service name to use for any traces created, Default: nginx +otel-service-name + +# The maximum queue size. After the size is reached data are dropped. +otel-max-queuesize + +# The delay interval in milliseconds between two consecutive exports. +otel-schedule-delay-millis + +# How long the export can run before it is cancelled. +otel-schedule-delay-millis + +# The maximum batch size of every export. It must be smaller or equal to maxQueueSize. +otel-max-export-batch-size + +# specifies sample rate for any traces created, Default: 0.01 +otel-sampler-ratio + +# specifies the sampler to be used when sampling traces. +# The available samplers are: AlwaysOn, AlwaysOff, TraceIdRatioBased, Default: AlwaysOff +otel-sampler + +# Uses sampler implementation which by default will take a sample if parent Activity is sampled, Default: false +otel-sampler-parent-based +``` + +Note that you can also set whether to trust incoming spans (global default is true) per-location using annotations like the following: +```yaml +kind: Ingress +metadata: + annotations: + nginx.ingress.kubernetes.io/opentelemetry-trust-incoming-span: "true" +``` + +## Examples + +The following examples show how to deploy and test different distributed telemetry systems. These example can be performed using Docker Desktop. + +In the [esigo/nginx-example](https://github.com/esigo/nginx-example) +GitHub repository is an example of a simple hello service: + +```mermaid +graph TB + subgraph Browser + start["http://esigo.dev/hello/nginx"] + end + + subgraph app + sa[service-a] + sb[service-b] + sa --> |name: nginx| sb + sb --> |hello nginx!| sa + end + + subgraph otel + otc["Otel Collector"] + end + + subgraph observability + tempo["Tempo"] + grafana["Grafana"] + backend["Jaeger"] + zipkin["Zipkin"] + end + + subgraph ingress-nginx + ngx[nginx] + end + + subgraph ngx[nginx] + ng[nginx] + om[OpenTelemetry module] + end + + subgraph Node + app + otel + observability + ingress-nginx + om --> |otlp-gRPC| otc --> |jaeger| backend + otc --> |zipkin| zipkin + otc --> |otlp-gRPC| tempo --> grafana + sa --> |otlp-gRPC| otc + sb --> |otlp-gRPC| otc + start --> ng --> sa + end +``` + +To install the example and collectors run: + +1. Enable OpenTelemetry and set the otlp-collector-host: + + ```yaml + $ echo ' + apiVersion: v1 + kind: ConfigMap + data: + enable-opentelemetry: "true" + opentelemetry-config: "/etc/nginx/opentelemetry.toml" + opentelemetry-operation-name: "HTTP $request_method $service_name $uri" + opentelemetry-trust-incoming-span: "true" + otlp-collector-host: "otel-coll-collector.otel.svc" + otlp-collector-port: "4317" + otel-max-queuesize: "2048" + otel-schedule-delay-millis: "5000" + otel-max-export-batch-size: "512" + otel-service-name: "nginx-proxy" # Opentelemetry resource name + otel-sampler: "AlwaysOn" # Also: AlwaysOff, TraceIdRatioBased + otel-sampler-ratio: "1.0" + otel-sampler-parent-based: "false" + metadata: + name: ingress-nginx-controller + namespace: ingress-nginx + ' | kubectl replace -f - + ``` + +2. Deploy otel-collector, grafana and Jaeger backend: + + ```bash + # add helm charts needed for grafana and OpenTelemetry collector + helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts + helm repo add grafana https://grafana.github.io/helm-charts + helm repo update + # deploy cert-manager needed for OpenTelemetry collector operator + kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.3/cert-manager.yaml + # create observability namespace + kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/namespace.yaml + # install OpenTelemetry collector operator + helm upgrade --install otel-collector-operator -n otel --create-namespace open-telemetry/opentelemetry-operator + # deploy OpenTelemetry collector + kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/collector.yaml + # deploy Jaeger all-in-one + kubectl apply -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.37.0/jaeger-operator.yaml -n observability + kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/jaeger.yaml -n observability + # deploy zipkin + kubectl apply -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/zipkin.yaml -n observability + # deploy tempo and grafana + helm upgrade --install tempo grafana/tempo --create-namespace -n observability + helm upgrade -f https://raw.githubusercontent.com/esigo/nginx-example/main/observability/grafana/grafana-values.yaml --install grafana grafana/grafana --create-namespace -n observability + ``` + +3. Build and deploy demo app: + + ```bash + # build images + make images + + # deploy demo app: + make deploy-app + ``` + +4. Make a few requests to the Service: + + ```bash + kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8090:80 + curl http://esigo.dev:8090/hello/nginx + + + StatusCode : 200 + StatusDescription : OK + Content : {"v":"hello nginx!"} + + RawContent : HTTP/1.1 200 OK + Connection: keep-alive + Content-Length: 21 + Content-Type: text/plain; charset=utf-8 + Date: Mon, 10 Oct 2022 17:43:33 GMT + + {"v":"hello nginx!"} + + Forms : {} + Headers : {[Connection, keep-alive], [Content-Length, 21], [Content-Type, text/plain; charset=utf-8], [Date, + Mon, 10 Oct 2022 17:43:33 GMT]} + Images : {} + InputFields : {} + Links : {} + ParsedHtml : System.__ComObject + RawContentLength : 21 + ``` + +5. View the Grafana UI: + + ```bash + kubectl port-forward --namespace=observability service/grafana 3000:80 + ``` + In the Grafana interface we can see the details: + ![grafana screenshot](../../images/otel-grafana-demo.png "grafana screenshot") + +6. View the Jaeger UI: + + ```bash + kubectl port-forward --namespace=observability service/jaeger-all-in-one-query 16686:16686 + ``` + In the Jaeger interface we can see the details: + ![Jaeger screenshot](../../images/otel-jaeger-demo.png "Jaeger screenshot") + +7. View the Zipkin UI: + + ```bash + kubectl port-forward --namespace=observability service/zipkin 9411:9411 + ``` + In the Zipkin interface we can see the details: + ![zipkin screenshot](../../images/otel-zipkin-demo.png "zipkin screenshot") + +## Migration from OpenTracing, Jaeger, Zipkin and Datadog + +If you are migrating from OpenTracing, Jaeger, Zipkin, or Datadog to OpenTelemetry, +you may need to update various annotations and configurations. Here are the mappings +for common annotations and configurations: + +### Annotations + +| Legacy | OpenTelemetry | +|---------------------------------------------------------------|-----------------------------------------------------------------| +| `nginx.ingress.kubernetes.io/enable-opentracing` | `nginx.ingress.kubernetes.io/enable-opentelemetry` | +| `nginx.ingress.kubernetes.io/opentracing-trust-incoming-span` | `nginx.ingress.kubernetes.io/opentelemetry-trust-incoming-span` | + +### Configs + +| Legacy | OpenTelemetry | +|---------------------------------------|----------------------------------------------| +| `opentracing-operation-name` | `opentelemetry-operation-name` | +| `opentracing-location-operation-name` | `opentelemetry-operation-name` | +| `opentracing-trust-incoming-span` | `opentelemetry-trust-incoming-span` | +| `zipkin-collector-port` | `otlp-collector-port` | +| `zipkin-service-name` | `otel-service-name` | +| `zipkin-sample-rate` | `otel-sampler-ratio` | +| `jaeger-collector-port` | `otlp-collector-port` | +| `jaeger-endpoint` | `otlp-collector-port`, `otlp-collector-host` | +| `jaeger-service-name` | `otel-service-name` | +| `jaeger-propagation-format` | `N/A` | +| `jaeger-sampler-type` | `otel-sampler` | +| `jaeger-sampler-param` | `otel-sampler` | +| `jaeger-sampler-host` | `N/A` | +| `jaeger-sampler-port` | `N/A` | +| `jaeger-trace-context-header-name` | `N/A` | +| `jaeger-debug-header` | `N/A` | +| `jaeger-baggage-header` | `N/A` | +| `jaeger-tracer-baggage-header-prefix` | `N/A` | +| `datadog-collector-port` | `otlp-collector-port` | +| `datadog-service-name` | `otel-service-name` | +| `datadog-environment` | `N/A` | +| `datadog-operation-name-override` | `N/A` | +| `datadog-priority-sampling` | `otel-sampler` | +| `datadog-sample-rate` | `otel-sampler-ratio` | diff --git a/docs/user-guide/third-party-addons/opentracing.md b/docs/user-guide/third-party-addons/opentracing.md deleted file mode 100644 index f5ec59faf..000000000 --- a/docs/user-guide/third-party-addons/opentracing.md +++ /dev/null @@ -1,263 +0,0 @@ -# OpenTracing - -Enables requests served by NGINX for distributed tracing via The OpenTracing Project. - -Using the third party module [opentracing-contrib/nginx-opentracing](https://github.com/opentracing-contrib/nginx-opentracing) the Ingress-Nginx Controller can configure NGINX to enable [OpenTracing](http://opentracing.io) instrumentation. -By default this feature is disabled. - -## Usage - -To enable the instrumentation we must enable OpenTracing in the configuration ConfigMap: -``` -data: - enable-opentracing: "true" -``` - -To enable or disable instrumentation for a single Ingress, use -the `enable-opentracing` annotation: -``` -kind: Ingress -metadata: - annotations: - nginx.ingress.kubernetes.io/enable-opentracing: "true" -``` - -We must also set the host to use when uploading traces: - -``` -zipkin-collector-host: zipkin.default.svc.cluster.local -jaeger-collector-host: jaeger-agent.default.svc.cluster.local -datadog-collector-host: datadog-agent.default.svc.cluster.local -``` -NOTE: While the option is called `jaeger-collector-host`, you will need to point this to a `jaeger-agent`, and not the `jaeger-collector` component. -Alternatively, you can set `jaeger-endpoint` and specify the full endpoint for uploading traces. This will use TCP and should be used for a collector rather than an agent. - -Next you will need to deploy a distributed tracing system which uses OpenTracing. -[Zipkin](https://github.com/openzipkin/zipkin) and -[Jaeger](https://github.com/jaegertracing/jaeger) and -[Datadog](https://github.com/DataDog/dd-opentracing-cpp) -have been tested. - -Other optional configuration options: -``` -# specifies the name to use for the server span -opentracing-operation-name - -# specifies specifies the name to use for the location span -opentracing-location-operation-name - -# sets whether or not to trust incoming tracing spans -opentracing-trust-incoming-span - -# specifies the port to use when uploading traces, Default: 9411 -zipkin-collector-port - -# specifies the service name to use for any traces created, Default: nginx -zipkin-service-name - -# specifies sample rate for any traces created, Default: 1.0 -zipkin-sample-rate - -# specifies the port to use when uploading traces, Default: 6831 -jaeger-collector-port - -# specifies the endpoint to use when uploading traces to a collector instead of an agent -jaeger-endpoint - -# specifies the service name to use for any traces created, Default: nginx -jaeger-service-name - -# specifies the traceparent/tracestate propagation format -jaeger-propagation-format - -# specifies the sampler to be used when sampling traces. -# The available samplers are: const, probabilistic, ratelimiting, remote, Default: const -jaeger-sampler-type - -# specifies the argument to be passed to the sampler constructor, Default: 1 -jaeger-sampler-param - -# Specifies the custom remote sampler host to be passed to the sampler constructor. Must be a valid URL. -# Default: http://127.0.0.1 -jaeger-sampler-host - -# Specifies the custom remote sampler port to be passed to the sampler constructor. Must be a number. Default: 5778 -jaeger-sampler-port - -# Specifies the header name used for passing trace context. Must be a string. Default: uber-trace-id -jaeger-trace-context-header-name - -# Specifies the header name used for force sampling. Must be a string. Default: jaeger-debug-id -jaeger-debug-header - -# Specifies the header name used to submit baggage if there is no root span. Must be a string. Default: jaeger-baggage -jaeger-baggage-header - -# Specifies the header prefix used to propagate baggage. Must be a string. Default: uberctx- -jaeger-tracer-baggage-header-prefix - -# specifies the port to use when uploading traces, Default 8126 -datadog-collector-port - -# specifies the service name to use for any traces created, Default: nginx -datadog-service-name - -# specifies the environment this trace belongs to, Default: prod -datadog-environment - -# specifies the operation name to use for any traces collected, Default: nginx.handle -datadog-operation-name-override - -# Specifies to use client-side sampling for distributed priority sampling and ignore sample rate, Default: true -datadog-priority-sampling - -# specifies sample rate for any traces created, Default: 1.0 -datadog-sample-rate -``` - -All these options (including host) allow environment variables, such as `$HOSTNAME` or `$HOST_IP`. In the case of Jaeger, if you have a Jaeger agent running on each machine in your cluster, you can use something like `$HOST_IP` (which can be 'mounted' with the `status.hostIP` fieldpath, as described [here](https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-of-the-downward-api)) to make sure traces will be sent to the local agent. - - -Note that you can also set whether to trust incoming spans (global default is true) per-location using annotations like the following: -``` -kind: Ingress -metadata: - annotations: - nginx.ingress.kubernetes.io/opentracing-trust-incoming-span: "true" -``` - -## Examples - -The following examples show how to deploy and test different distributed tracing systems. These example can be performed using Minikube. - -### Zipkin - -In the [rnburn/zipkin-date-server](https://github.com/rnburn/zipkin-date-server) -GitHub repository is an example of a dockerized date service. To install the example and Zipkin collector run: - -``` -kubectl create -f https://raw.githubusercontent.com/rnburn/zipkin-date-server/master/kubernetes/zipkin.yaml -kubectl create -f https://raw.githubusercontent.com/rnburn/zipkin-date-server/master/kubernetes/deployment.yaml -``` - -Also we need to configure the Ingress-NGINX controller ConfigMap with the required values: - -``` -$ echo ' -apiVersion: v1 -kind: ConfigMap -data: - enable-opentracing: "true" - zipkin-collector-host: zipkin.default.svc.cluster.local -metadata: - name: ingress-nginx-controller - namespace: kube-system -' | kubectl replace -f - -``` - -In the Zipkin interface we can see the details: -![zipkin screenshot](../../images/zipkin-demo.png "zipkin collector screenshot") - -### Jaeger - -1. Enable Ingress addon in Minikube: - ``` - $ minikube addons enable ingress - ``` - -2. Add Minikube IP to /etc/hosts: - ``` - $ echo "$(minikube ip) example.com" | sudo tee -a /etc/hosts - ``` - -3. Apply a basic Service and Ingress Resource: - ``` - # Create Echoheaders Deployment - $ kubectl run echoheaders --image=registry.k8s.io/echoserver:1.4 --replicas=1 --port=8080 - - # Expose as a Cluster-IP - $ kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders-x - - # Apply the Ingress Resource - $ echo ' - apiVersion: networking.k8s.io/v1 - kind: Ingress - metadata: - name: echo-ingress - spec: - ingressClassName: nginx - rules: - - host: example.com - http: - paths: - - path: /echo - pathType: Prefix - backend: - service: - name: echoheaders-x - port: - number: 80 - ' | kubectl apply -f - - ``` - -4. Enable OpenTracing and set the jaeger-collector-host: - ``` - $ echo ' - apiVersion: v1 - kind: ConfigMap - data: - enable-opentracing: "true" - jaeger-collector-host: jaeger-agent.default.svc.cluster.local - metadata: - name: ingress-nginx-controller - namespace: kube-system - ' | kubectl replace -f - - ``` - -5. Apply the Jaeger All-In-One Template: - ``` - $ kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml - ``` - -6. Make a few requests to the Service: - ``` - $ curl example.com/echo -d "meow" - - CLIENT VALUES: - client_address=172.17.0.5 - command=POST - real path=/echo - query=nil - request_version=1.1 - request_uri=http://example.com:8080/echo - - SERVER VALUES: - server_version=nginx: 1.10.0 - lua: 10001 - - HEADERS RECEIVED: - accept=*/* - connection=close - content-length=4 - content-type=application/x-www-form-urlencoded - host=example.com - user-agent=curl/7.54.0 - x-forwarded-for=192.168.99.1 - x-forwarded-host=example.com - x-forwarded-port=80 - x-forwarded-proto=http - x-original-uri=/echo - x-real-ip=192.168.99.1 - x-scheme=http - BODY: - meow - ``` - -7. View the Jaeger UI: - ``` - $ minikube service jaeger-query --url - - http://192.168.99.100:30183 - ``` - - In the Jaeger interface we can see the details: - ![jaeger screenshot](../../images/jaeger-demo.png "jaeger collector screenshot") diff --git a/docs/user-guide/tls.md b/docs/user-guide/tls.md index f6fee6895..eaf33e210 100644 --- a/docs/user-guide/tls.md +++ b/docs/user-guide/tls.md @@ -23,7 +23,7 @@ The resulting secret will be of type `kubernetes.io/tls`. ## Host names -Ensure that the relevant [ingress rules specify a matching host name](https://kubernetes.io/docs/concepts/services-networking/ingress/#tls). +Ensure that the relevant [ingress rules specify a matching hostname](https://kubernetes.io/docs/concepts/services-networking/ingress/#tls). ## Default SSL Certificate @@ -41,8 +41,9 @@ If this flag is not provided NGINX will use a self-signed certificate. For instance, if you have a TLS secret `foo-tls` in the `default` namespace, add `--default-ssl-certificate=default/foo-tls` in the `nginx-controller` deployment. -The default certificate will also be used for ingress `tls:` sections that do not -have a `secretName` option. +If the `tls:` section is not set, NGINX will provide the default certificate but will not force HTTPS redirect. + +On the other hand, if the `tls:` section is set - even without specifying a `secretName` option - NGINX will force HTTPS redirect. To force redirects for Ingresses that do not specify a TLS-block at all, take a look at `force-ssl-redirect` in [ConfigMap][ConfigMap]. @@ -127,9 +128,6 @@ ingress-nginx defaults to using TLS 1.2 and 1.3 only, with a [secure set of TLS ### Legacy TLS -!!! warning - TLSv1, TLSv1.1 are not supported in ingress-nginx v1.6.0 and above. - The default configuration, though secure, does not support some older browsers and operating systems. For instance, TLS 1.1+ is only enabled by default from Android 5.0 on. At the time of writing, @@ -148,7 +146,7 @@ metadata: name: nginx-config data: ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA" - ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3" + ssl-protocols: "TLSv1.2 TLSv1.3" ``` diff --git a/ginkgo_upgrade.md b/ginkgo_upgrade.md index 1ed996cd1..87e6bd9fd 100644 --- a/ginkgo_upgrade.md +++ b/ginkgo_upgrade.md @@ -11,7 +11,7 @@ ### a. Make changes to appropriate files in required directories -- Make changes in files where gingko version is hardcoded. These files are : +- Make changes in files where ginkgo version is hardcoded. These files are : - [run-in-docker.sh ](build/run-in-docker.sh) - [Dockerfile ](images/test-runner/rootfs/Dockerfile) - [run.sh ](test/e2e/run.sh) @@ -49,7 +49,7 @@ Promoting the images basically means that images, that were pushed to staging co ``` ... - pushing manifest for gcr.io/k8s-staging-ingress-nginx/controller:v1.0.2@sha256:e15fac6e8474d77e1f017edc33d804ce72a184e3c0a30963b2a0d7f0b89f6b16 + pushing manifest for us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx/controller:v1.0.2@sha256:e15fac6e8474d77e1f017edc33d804ce72a184e3c0a30963b2a0d7f0b89f6b16 ... ``` @@ -65,11 +65,11 @@ Promoting the images basically means that images, that were pushed to staging co - Create a branch in your fork, named as the issue number for this release -- In the related branch, of your fork, edit the file k8s.gcr.io/images/k8s-staging-ingress-nginx/images.yaml. +- In the related branch, of your fork, edit the file registry.k8s.io/images/k8s-staging-ingress-nginx/images.yaml. - For making it easier, you can edit your branch directly in the browser. But be careful about making any mistake. -- Insert the sha(s) & the tag(s), in a new line, in this file [Project kubernetes/k8s.io Ingress-Nginx-Controller Images](https://github.com/kubernetes/k8s.io/blob/main/k8s.gcr.io/images/k8s-staging-ingress-nginx/images.yaml) Look at this [example PR and the diff](https://github.com/kubernetes/k8s.io/pull/4499) to see how it was done before +- Insert the sha(s) & the tag(s), in a new line, in this file [Project kubernetes/k8s.io Ingress-Nginx-Controller Images](https://github.com/kubernetes/k8s.io/blob/main/registry.k8s.io/images/k8s-staging-ingress-nginx/images.yaml) Look at this [example PR and the diff](https://github.com/kubernetes/k8s.io/pull/4499) to see how it was done before - Save and commit @@ -128,4 +128,4 @@ Promoting the images basically means that images, that were pushed to staging co - Finally merge the PR. -## END ## \ No newline at end of file +## END ## diff --git a/go.mod b/go.mod index e04f22320..34584bbf9 100644 --- a/go.mod +++ b/go.mod @@ -1,126 +1,137 @@ module k8s.io/ingress-nginx -go 1.21.1 +go 1.23.6 require ( - github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a + dario.cat/mergo v1.0.1 + github.com/armon/go-proxyproto v0.1.0 github.com/eapache/channels v1.1.0 - github.com/fsnotify/fsnotify v1.6.0 - github.com/imdario/mergo v0.3.16 + github.com/fsnotify/fsnotify v1.8.0 github.com/json-iterator/go v1.1.12 github.com/kylelemons/godebug v1.1.0 github.com/mitchellh/go-ps v1.0.0 github.com/mitchellh/hashstructure/v2 v2.0.2 github.com/mitchellh/mapstructure v1.5.0 github.com/moul/pb v0.0.0-20220425114252-bca18df4138c - github.com/ncabatoff/process-exporter v0.7.10 - github.com/onsi/ginkgo/v2 v2.12.0 - github.com/opencontainers/runc v1.1.9 - github.com/pmezard/go-difflib v1.0.0 - github.com/prometheus/client_golang v1.17.0 - github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 - github.com/prometheus/common v0.44.0 - github.com/spf13/cobra v1.7.0 - github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/ncabatoff/process-exporter v0.8.5 + github.com/onsi/ginkgo/v2 v2.22.2 + github.com/opencontainers/runc v1.2.5 + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 + github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_model v0.6.1 + github.com/prometheus/common v0.62.0 + github.com/spf13/cobra v1.9.1 + github.com/spf13/pflag v1.0.6 + github.com/stretchr/testify v1.10.0 github.com/yudai/gojsondiff v1.0.0 - github.com/zakjan/cert-chain-resolver v0.0.0-20211122211144-c6b0b792af9a - golang.org/x/crypto v0.13.0 - google.golang.org/grpc v1.58.2 - google.golang.org/grpc/examples v0.0.0-20221220003428-4f16fbe410f7 + github.com/zakjan/cert-chain-resolver v0.0.0-20221221105603-fcedb00c5b30 + golang.org/x/crypto v0.33.0 + google.golang.org/grpc v1.70.0 + google.golang.org/grpc/examples v0.0.0-20240223204917-5ccf176a08ab gopkg.in/go-playground/pool.v3 v3.1.1 gopkg.in/mcuadros/go-syslog.v2 v2.3.0 - k8s.io/api v0.27.4 - k8s.io/apiextensions-apiserver v0.26.4 - k8s.io/apimachinery v0.27.4 - k8s.io/apiserver v0.26.4 - k8s.io/cli-runtime v0.26.4 - k8s.io/client-go v0.27.4 - k8s.io/code-generator v0.26.4 - k8s.io/component-base v0.27.4 - k8s.io/klog/v2 v2.100.1 + k8s.io/api v0.32.2 + k8s.io/apiextensions-apiserver v0.32.2 + k8s.io/apimachinery v0.32.2 + k8s.io/apiserver v0.32.2 + k8s.io/cli-runtime v0.32.2 + k8s.io/client-go v0.32.2 + k8s.io/code-generator v0.32.2 + k8s.io/component-base v0.32.2 + k8s.io/klog/v2 v2.130.1 pault.ag/go/sniff v0.0.0-20200207005214-cf7e4d167732 - sigs.k8s.io/controller-runtime v0.14.6 - sigs.k8s.io/mdtoc v1.1.0 + sigs.k8s.io/controller-runtime v0.20.2 + sigs.k8s.io/mdtoc v1.4.0 ) require ( - github.com/BurntSushi/toml v1.0.0 // indirect + github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + sigs.k8s.io/release-utils v0.8.3 // indirect +) + +require ( + github.com/Anddd7/pb v0.0.0-20240425032658-369b0f6a404c + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/coreos/go-systemd/v22 v22.3.2 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.2 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fullsailor/pkcs7 v0.0.0-20160414161337-2585af45975b // indirect - github.com/go-errors/errors v1.0.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus/v5 v5.0.6 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa // indirect + github.com/go-errors/errors v1.5.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/gomarkdown/markdown v0.0.0-20210514010506-3b9f47219fe7 // indirect - github.com/google/btree v1.0.1 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mmarkdown/mmark v2.0.40+incompatible // indirect - github.com/moby/sys/mountinfo v0.5.0 // indirect + github.com/moby/sys/mountinfo v0.7.1 // indirect + github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/ncabatoff/go-seq v0.0.0-20180805175032-b08ef85ed833 // indirect github.com/onsi/ginkgo v1.16.5 // indirect - github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/procfs v0.11.1 // indirect - github.com/sergi/go-diff v1.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/xlab/treeprint v1.1.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/sergi/go-diff v1.3.1 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/xlab/treeprint v1.2.0 // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect github.com/yudai/pp v2.0.1+incompatible // indirect - go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/term v0.12.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.7.0 // indirect + golang.org/x/tools v0.28.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect + google.golang.org/protobuf v1.36.1 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect - k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect - k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kustomize/api v0.12.1 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/kustomize/api v0.18.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index 5943586e0..6e933d349 100644 --- a/go.sum +++ b/go.sum @@ -1,230 +1,115 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a h1:AP/vsCIvJZ129pdm9Ek7bH7yutN3hByqsMoNrWAxRQc= -github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a/go.mod h1:QmP9hvJ91BbJmGVGSbutW19IC0Q9phDCLGaomwTJbgU= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Anddd7/pb v0.0.0-20240425032658-369b0f6a404c h1:uhBf0CHXi7nCFZXxHV7l1cBcYFEEVRK4FYxvm1l9lKg= +github.com/Anddd7/pb v0.0.0-20240425032658-369b0f6a404c/go.mod h1:vYWKbnXd2KAZHUECLPzSE0Er3FgiEmOdPtxwSIRihck= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/armon/go-proxyproto v0.1.0 h1:TWWcSsjco7o2itn6r25/5AqKBiWmsiuzsUDLT/MTl7k= +github.com/armon/go-proxyproto v0.1.0/go.mod h1:Xj90dce2VKbHzRAeiVQAMBtj4M5oidoXJ8lmgyW21mw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -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/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= +github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= +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/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/eapache/channels v1.1.0 h1:F1taHcn7/F0i8DYqKXJnyhJcVpp2kgFcNePxXtnyu4k= github.com/eapache/channels v1.1.0/go.mod h1:jMm2qB5Ubtg9zLd+inMZd2/NUvXgzmWXsDaLyQIGfH0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= -github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= 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.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fullsailor/pkcs7 v0.0.0-20160414161337-2585af45975b h1:074/xhloHUBOpTZwlIzQ28rbPY8pNJvzY7Gcx5KnNOk= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fullsailor/pkcs7 v0.0.0-20160414161337-2585af45975b/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -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-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= +github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= 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/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/gomarkdown/markdown v0.0.0-20210514010506-3b9f47219fe7 h1:oKYOfNR7Hp6XpZ4JqolL5u642Js5Z0n7psPVl+S5heo= -github.com/gomarkdown/markdown v0.0.0-20210514010506-3b9f47219fe7/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0 h1:4gjrh/PN2MuWCCElk8/I4OCKRKWCCo2zEct3VKCbibU= +github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -239,11 +124,9 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= @@ -252,13 +135,15 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mmarkdown/mmark v2.0.40+incompatible h1:vMeUeDzBK3H+/mU0oMVfMuhSXJlIA+DE/DMPQNAj5C4= github.com/mmarkdown/mmark v2.0.40+incompatible/go.mod h1:Uvmoz7tvsWpr7bMVxIpqZPyN3FbOtzDmnsJDFp7ltJs= -github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= @@ -267,13 +152,10 @@ github.com/moul/pb v0.0.0-20220425114252-bca18df4138c h1:1STmblv9zmHLDpru4dbnf1P github.com/moul/pb v0.0.0-20220425114252-bca18df4138c/go.mod h1:jE2HT8eoucYyUPBFJMreiVlC3KPHkDMtN8wn+ef7Y64= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/ncabatoff/fakescraper v0.0.0-20201102132415-4b37ba603d65/go.mod h1:Tx6UMSMyIsjLG/VU/F6xA1+0XI+/f9o1dGJnf1l+bPg= github.com/ncabatoff/go-seq v0.0.0-20180805175032-b08ef85ed833 h1:t4WWQ9I797y7QUgeEjeXnVb+oYuEDQc6gLvrZJTYo94= github.com/ncabatoff/go-seq v0.0.0-20180805175032-b08ef85ed833/go.mod h1:0CznHmXSjMEqs5Tezj/w2emQoM41wzYM9KpDKUHPYag= -github.com/ncabatoff/process-exporter v0.7.10 h1:+Ere7+3se6QqP54gg7aBRagWcL8bq3u5zNi/GRSWeKQ= -github.com/ncabatoff/process-exporter v0.7.10/go.mod h1:DHZRZjqxw9LCOpLlX0DjBuyn6d5plh41Jv6Tmttj7Ek= +github.com/ncabatoff/process-exporter v0.8.5 h1:Hk1sflgRWn0Xrh/OsupQLVVCTW01kv0YYrGxu7NvkmM= +github.com/ncabatoff/process-exporter v0.8.5/go.mod h1:IZndG/m2Y++D90y99NhDJfg0SOkpbx/Fl6MlnBr4SC0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -281,419 +163,165 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= -github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/opencontainers/runc v1.1.9 h1:XR0VIHTGce5eWPkaPesqTBrhW2yAcaraWfsEalNwQLM= -github.com/opencontainers/runc v1.1.9/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/opencontainers/runc v1.2.5 h1:8KAkq3Wrem8bApgOHyhRI/8IeLXIfmZ6Qaw6DNSLnA4= +github.com/opencontainers/runc v1.2.5/go.mod h1:dOQeFo29xZKBNeRBI0B19mJtfHv68YgCTh1X+YphA+4= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/exporter-toolkit v0.7.0/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.1.3/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/urfave/cli v1.17.1-0.20160602030128-01a33823596e/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zakjan/cert-chain-resolver v0.0.0-20211122211144-c6b0b792af9a h1:CbXWHAnmrtTKgX+yMVVANuRJP8ld88ELbAYAYnBdLJ4= -github.com/zakjan/cert-chain-resolver v0.0.0-20211122211144-c6b0b792af9a/go.mod h1:/Hzu8ych2oXCs1iNI+MeASyFzWTncQ6nlu/wgqbqC2A= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/zakjan/cert-chain-resolver v0.0.0-20221221105603-fcedb00c5b30 h1:rzHvkiukOVYcf840FqAsHqBMhfLofvQIxWtczkGRklU= +github.com/zakjan/cert-chain-resolver v0.0.0-20221221105603-fcedb00c5b30/go.mod h1:/Hzu8ych2oXCs1iNI+MeASyFzWTncQ6nlu/wgqbqC2A= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/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-20190606165138-5da285871e9c/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= 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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= -google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= -google.golang.org/grpc/examples v0.0.0-20221220003428-4f16fbe410f7 h1:pPsdyuBif+uoyUoL19yuj/TCfUPsmpJHJZhWQ98JGLU= -google.golang.org/grpc/examples v0.0.0-20221220003428-4f16fbe410f7/go.mod h1:8pQa1yxxkh+EsxUK8/455D5MSbv3vgmEJqKCH3y17mI= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc/examples v0.0.0-20240223204917-5ccf176a08ab h1:tg8hvIl5RmFBuXlcJMuL0h4Psh1gx5Q5xEMwzBZIzWA= +google.golang.org/grpc/examples v0.0.0-20240223204917-5ccf176a08ab/go.mod h1:liVNnGuZDITxuksuZ+BBvdy7FcJfeNk+efF9qgqNUmc= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= @@ -705,67 +333,52 @@ gopkg.in/mcuadros/go-syslog.v2 v2.3.0 h1:kcsiS+WsTKyIEPABJBJtoG0KkOS6yzvJ+/eZlhD gopkg.in/mcuadros/go-syslog.v2 v2.3.0/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= -k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= -k8s.io/apiextensions-apiserver v0.26.4 h1:9D2RTxYGxrG5uYg6D7QZRcykXvavBvcA59j5kTaedQI= -k8s.io/apiextensions-apiserver v0.26.4/go.mod h1:cd4uGFGIgzEqUghWpRsr9KE8j2KNTjY8Ji8pnMMazyw= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/apiserver v0.26.4 h1:3Oq4mnJv0mzVX7BR/Nod+8KjlELf/3Ljvu9ZWDyLUoA= -k8s.io/apiserver v0.26.4/go.mod h1:yAY3O1vBM4/0OIGAGeWcdfzQvgdwJ188VirLcuSAVnw= -k8s.io/cli-runtime v0.26.4 h1:MgSU871KDzBDX7V9GtuqS6Ai9lhQCHgRzkurnXOWtZ0= -k8s.io/cli-runtime v0.26.4/go.mod h1:MjJ2DXMChw2zcG0/agzm17xwKpfVxOfuoCdfY9iOCOE= -k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= -k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= -k8s.io/code-generator v0.26.4 h1:zgDD0qX13p/jtrAoYRRiYeQ5ibnriwmo2cMkMZAtJxc= -k8s.io/code-generator v0.26.4/go.mod h1:ryaiIKwfxEJEaywEzx3dhWOydpVctKYbqLajJf0O8dI= -k8s.io/component-base v0.27.4 h1:Wqc0jMKEDGjKXdae8hBXeskRP//vu1m6ypC+gwErj4c= -k8s.io/component-base v0.27.4/go.mod h1:hoiEETnLc0ioLv6WPeDt8vD34DDeB35MfQnxCARq3kY= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= -k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= -k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= -k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= +k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= +k8s.io/apiextensions-apiserver v0.32.2 h1:2YMk285jWMk2188V2AERy5yDwBYrjgWYggscghPCvV4= +k8s.io/apiextensions-apiserver v0.32.2/go.mod h1:GPwf8sph7YlJT3H6aKUWtd0E+oyShk/YHWQHf/OOgCA= +k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.32.2 h1:WzyxAu4mvLkQxwD9hGa4ZfExo3yZZaYzoYvvVDlM6vw= +k8s.io/apiserver v0.32.2/go.mod h1:PEwREHiHNU2oFdte7BjzA1ZyjWjuckORLIK/wLV5goM= +k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks= +k8s.io/cli-runtime v0.32.2/go.mod h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8= +k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= +k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= +k8s.io/code-generator v0.32.2 h1:CIvyPrLWP7cMgrqval2qYT839YAwCDeSvGfXgWSNpHQ= +k8s.io/code-generator v0.32.2/go.mod h1:plh7bWk7JztAUkHM4zpbdy0KOMdrhsePcZL2HLWFH7Y= +k8s.io/component-base v0.32.2 h1:1aUL5Vdmu7qNo4ZsE+569PV5zFatM9hl+lb3dEea2zU= +k8s.io/component-base v0.32.2/go.mod h1:PXJ61Vx9Lg+P5mS8TLd7bCIr+eMJRQTyXe8KvkrvJq0= +k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4= +k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= pault.ag/go/sniff v0.0.0-20200207005214-cf7e4d167732 h1:SAElp8THCfmBdM+4lmWX5gebiSSkEr7PAYDVF91qpfg= pault.ag/go/sniff v0.0.0-20200207005214-cf7e4d167732/go.mod h1:lpvCfhqEHNJSSpG5R5A2EgsVzG8RTt4RfPoQuRAcDmg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= -sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= -sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= -sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= -sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= -sigs.k8s.io/mdtoc v1.1.0 h1:q3YtqYzmC2e0hgLXRIOm7/QLuPux1CX3ZHCwlbABxZo= -sigs.k8s.io/mdtoc v1.1.0/go.mod h1:QZLVEdHH2iNIR4uHAZyvFRtjloHgVItk8lo/mzCtq3w= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/controller-runtime v0.20.2 h1:/439OZVxoEc02psi1h4QO3bHzTgu49bb347Xp4gW1pc= +sigs.k8s.io/controller-runtime v0.20.2/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo= +sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U= +sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E= +sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo= +sigs.k8s.io/mdtoc v1.4.0 h1:2pDEwJSjoVrGr5BPkG+LoLkYLKvgtGYurrBY8ul3SxQ= +sigs.k8s.io/mdtoc v1.4.0/go.mod h1:KVnRRtK1rX9aQ95qF0rt3x2ytTxf3r7W7N41H+0KF0k= +sigs.k8s.io/release-utils v0.8.3 h1:KtOtA4qDmzJyeQ2zkDsFVI25+NViwms/o5eL2NftFdA= +sigs.k8s.io/release-utils v0.8.3/go.mod h1:fp82Fma06OXBhEJ+GUJKqvcplDBomruK1R/1fWJnsrQ= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/go.work b/go.work deleted file mode 100644 index 84cc6ca96..000000000 --- a/go.work +++ /dev/null @@ -1,6 +0,0 @@ -go 1.21.1 - -use ( - . - ./magefiles -) diff --git a/go.work.sum b/go.work.sum deleted file mode 100644 index 93c6eaa89..000000000 --- a/go.work.sum +++ /dev/null @@ -1,277 +0,0 @@ -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= diff --git a/hack/init-buildx.sh b/hack/init-buildx.sh index 1a47bf145..bac68e1ae 100755 --- a/hack/init-buildx.sh +++ b/hack/init-buildx.sh @@ -42,12 +42,11 @@ fi # We can skip setup if the current builder already has multi-arch # AND if it isn't the docker driver, which doesn't work current_builder="$(docker buildx inspect)" -# linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6 +# linux/amd64, linux/arm, linux/arm64 if ! grep -q "^Driver: docker$" <<<"${current_builder}" && \ grep -q "linux/amd64" <<<"${current_builder}" && \ grep -q "linux/arm" <<<"${current_builder}" && \ - grep -q "linux/arm64" <<<"${current_builder}" && \ - grep -q "linux/s390x" <<<"${current_builder}"; then + grep -q "linux/arm64" <<<"${current_builder}"; then exit 0 fi diff --git a/hack/manifest-templates/provider/kind/values.yaml b/hack/manifest-templates/provider/kind/values.yaml index ed636f372..6140f6500 100644 --- a/hack/manifest-templates/provider/kind/values.yaml +++ b/hack/manifest-templates/provider/kind/values.yaml @@ -8,11 +8,9 @@ controller: enabled: true terminationGracePeriodSeconds: 0 service: - type: NodePort + type: LoadBalancer watchIngressWithoutClass: true - nodeSelector: - ingress-ready: "true" tolerations: - key: "node-role.kubernetes.io/master" operator: "Equal" diff --git a/hack/print-e2e-suite.sh b/hack/print-e2e-suite.sh index e6b083d58..12b0efb13 100755 --- a/hack/print-e2e-suite.sh +++ b/hack/print-e2e-suite.sh @@ -14,8 +14,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -if [ -n "$DEBUG" ]; then - set -x +if [ "$DEBUG" == "true" ]; then + set -x fi set -o errexit @@ -25,5 +25,6 @@ set -o pipefail DIR=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd -P) $DIR/test/e2e/e2e.test \ - -ginkgo.noColor \ - -ginkgo.dryRun | sed "s|$DIR/|File: |g" | sed 's/•//g' | tail -n+5 | head -n-3 + --ginkgo.no-color \ + --ginkgo.v \ + --ginkgo.dry-run | sed "s|$DIR/|File: |g" | sed 's/•//g' | tail -n+5 | head -n-3 diff --git a/hack/verify-chart-lint.sh b/hack/update-annotation-doc.sh similarity index 57% rename from hack/verify-chart-lint.sh rename to hack/update-annotation-doc.sh index 9ece681e0..c4feb41ce 100755 --- a/hack/verify-chart-lint.sh +++ b/hack/update-annotation-doc.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 The Kubernetes Authors. +# Copyright 2024 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,9 +16,8 @@ set -o errexit set -o nounset -set -o pipefail -KUBE_ROOT="$( cd "$(dirname "$0")../" >/dev/null 2>&1 ; pwd -P )" -# TODO: This is a temporary workaround while we don't update Helm Chart test -curl https://raw.githubusercontent.com/helm/chart-testing/v3.8.0/etc/chart_schema.yaml -o /tmp/chart_schema.yaml -ct lint --charts ${KUBE_ROOT}/charts/ingress-nginx --validate-maintainers=false --chart-yaml-schema=/tmp/chart_schema.yaml +SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. +ANNOTATIONFILE="${SCRIPT_ROOT}/docs/user-guide/nginx-configuration/annotations-risk.md" + +go run "${SCRIPT_ROOT}"/cmd/annotations/main.go -output "${ANNOTATIONFILE}" \ No newline at end of file diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index fadc67633..47a104584 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -27,7 +27,7 @@ if [[ ! -d ${CODEGEN_PKG} ]]; then fi # Ensure we can execute. -chmod +x ${CODEGEN_PKG}/generate-groups.sh +chmod +x ${CODEGEN_PKG}/kube_codegen.sh # generate the code with: # --output-base because this script should also be able to run inside the vendor dir of @@ -37,7 +37,7 @@ chmod +x ${CODEGEN_PKG}/generate-groups.sh # k8s.io/ingress-nginx/pkg/client k8s.io/ingress-nginx/pkg/apis \ # nginxingress:v1alpha1 \ # --output-base "$(dirname ${BASH_SOURCE})/../../.." -${CODEGEN_PKG}/generate-groups.sh "deepcopy" \ +${CODEGEN_PKG}/kube_codegen.sh "deepcopy" \ k8s.io/ingress-nginx/internal k8s.io/ingress-nginx/pkg/apis \ .:ingress \ --output-base "$(dirname ${BASH_SOURCE})/../../.." \ diff --git a/hack/verify-annotation-docs.sh b/hack/verify-annotation-docs.sh new file mode 100755 index 000000000..54034539b --- /dev/null +++ b/hack/verify-annotation-docs.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# Copyright 2024 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. + +ANNOTATIONFILE="${SCRIPT_ROOT}/docs/user-guide/nginx-configuration/annotations-risk.md" +TMP_DIFFROOT="${SCRIPT_ROOT}/_tmp" +TMP_FILE="${TMP_DIFFROOT}/annotations-risk.md" + +cleanup() { + rm -rf "${TMP_DIFFROOT}" +} +trap "cleanup" EXIT SIGINT + +cleanup + +mkdir -p "${TMP_DIFFROOT}" + +go run cmd/annotations/main.go -output "${TMP_FILE}" +echo "diffing ${ANNOTATIONFILE} against freshly generated annotation doc" +ret=0 +diff -Naupr --no-dereference "${ANNOTATIONFILE}" "${TMP_FILE}" || ret=1 + +if [[ $ret -eq 0 ]]; then + echo "${ANNOTATIONFILE} up to date." +else + echo "${ANNOTATIONFILE} is out of date. Please run hack/update-annotation-doc.sh" + exit 1 +fi diff --git a/hack/verify-lualint.sh b/hack/verify-lualint.sh index 1f6048de0..769d7a6cd 100755 --- a/hack/verify-lualint.sh +++ b/hack/verify-lualint.sh @@ -18,6 +18,13 @@ set -o errexit set -o nounset set -o pipefail -luacheck --codes -q rootfs/etc/nginx/lua/ +luacheck --codes --globals lua_ingress \ + --globals configuration \ + --globals balancer \ + --globals monitor \ + --globals certificate \ + --globals tcp_udp_configuration \ + --globals tcp_udp_balancer \ + --no-max-comment-line-length -q rootfs/etc/nginx/lua/ find rootfs/etc/nginx/lua/ -name "*.lua" -not -path "*/test/*" -exec lj-releng -L -s {} + && echo "lj-releng validation is success!" diff --git a/images/fastcgi-helloserver/Makefile b/images/Makefile similarity index 53% rename from images/fastcgi-helloserver/Makefile rename to images/Makefile index 4d277a19d..31560168d 100644 --- a/images/fastcgi-helloserver/Makefile +++ b/images/Makefile @@ -1,4 +1,4 @@ -# Copyright 2020 The Kubernetes Authors. +# Copyright 2024 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,20 +12,30 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Docker image for e2e testing. +.DEFAULT_GOAL:=build # set default shell SHELL=/bin/bash -o pipefail -o errexit DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh +INIT_BUILDX=$(DIR)/../hack/init-buildx.sh -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) + +BASE_IMAGE = $(shell cat $(DIR)/../NGINX_BASE) + +# The env below is called GO_VERSION and not GOLANG_VERSION because +# the gcb image we use to build already defines GOLANG_VERSION and is a +# really old version +GO_VERSION = $(shell cat $(DIR)/../GOLANG_VERSION) REGISTRY ?= local +NAME ?= + +IMAGE = $(REGISTRY)/$(NAME) +TAG ?= $(shell cat $(NAME)/TAG) + +EXTRAARGS ?= $(shell cat $(NAME)/EXTRAARGS) -IMAGE = $(REGISTRY)/e2e-test-fastcgi-helloserver # required to enable buildx export DOCKER_CLI_EXPERIMENTAL=enabled @@ -35,17 +45,34 @@ PLATFORMS?=linux/amd64,linux/arm,linux/arm64 OUTPUT= PROGRESS=plain -build: ensure-buildx + +precheck: +ifndef NAME + $(error NAME variable is required) +endif + +build: precheck ensure-buildx docker buildx build \ + --label=org.opencontainers.image.source=https://github.com/kubernetes/ingress-nginx \ + --label=org.opencontainers.image.licenses=Apache-2.0 \ + --label=org.opencontainers.image.description="Ingress NGINX $(NAME) image" \ + --build-arg BASE_IMAGE=$(BASE_IMAGE) \ + --build-arg GOLANG_VERSION=$(GO_VERSION) \ --platform=${PLATFORMS} $(OUTPUT) \ --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs + --pull $(EXTRAARGS) \ + -t $(IMAGE):$(TAG) $(NAME)/rootfs # push the cross built image push: OUTPUT=--push push: build +test: precheck + cd $(NAME)/rootfs && go test ./... + +test-e2e: precheck + cd $(NAME) && ./hack/e2e.sh + # enable buildx ensure-buildx: # this is required for cloudbuild @@ -56,4 +83,4 @@ else endif @echo "done" -.PHONY: build push ensure-buildx +.PHONY: build push ensure-buildx test test-e2e precheck diff --git a/images/OWNERS b/images/OWNERS deleted file mode 100644 index 00f162ebd..000000000 --- a/images/OWNERS +++ /dev/null @@ -1,9 +0,0 @@ -# See the OWNERS docs: https://github.com/kubernetes/community/blob/master/contributors/guide/owners.md - -approvers: -- ingress-nginx-admins -- ingress-nginx-maintainers - -reviewers: -- ingress-nginx-admins -- ingress-nginx-maintainers diff --git a/images/cfssl/Makefile b/images/cfssl/Makefile deleted file mode 100644 index 31c37fbc5..000000000 --- a/images/cfssl/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2020 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/e2e-test-cfssl - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64,linux/arm,linux/arm64,linux/s390x -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/cfssl/TAG b/images/cfssl/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/cfssl/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/cfssl/cloudbuild.yaml b/images/cfssl/cloudbuild.yaml index 5fed3b712..33fafdb08 100644 --- a/images/cfssl/cloudbuild.yaml +++ b/images/cfssl/cloudbuild.yaml @@ -1,17 +1,11 @@ -timeout: 600s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/cfssl && make push + - -c + - gcloud auth configure-docker && cd images && make NAME=cfssl push diff --git a/images/cfssl/rootfs/Dockerfile b/images/cfssl/rootfs/Dockerfile index 4ad69d362..3978c8f4b 100644 --- a/images/cfssl/rootfs/Dockerfile +++ b/images/cfssl/rootfs/Dockerfile @@ -12,10 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.18.4 +FROM alpine:3.21 - -RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories +RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories RUN apk update \ && apk upgrade && \ apk add --no-cache \ diff --git a/images/custom-error-pages/Makefile b/images/custom-error-pages/Makefile deleted file mode 100644 index 810736cca..000000000 --- a/images/custom-error-pages/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2021 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Container image for nginx-errors. - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/nginx-errors - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64 -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/custom-error-pages/README.md b/images/custom-error-pages/README.md deleted file mode 100644 index cd6df3e0a..000000000 --- a/images/custom-error-pages/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# custom-error-pages - -Example of Custom error pages for the Ingress-Nginx Controller diff --git a/images/custom-error-pages/TAG b/images/custom-error-pages/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/custom-error-pages/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/custom-error-pages/cloudbuild.yaml b/images/custom-error-pages/cloudbuild.yaml index a443d2b11..324a8f19a 100644 --- a/images/custom-error-pages/cloudbuild.yaml +++ b/images/custom-error-pages/cloudbuild.yaml @@ -1,17 +1,11 @@ -timeout: 1800s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/custom-error-pages && make push + - -c + - gcloud auth configure-docker && cd images && make NAME=custom-error-pages push diff --git a/images/custom-error-pages/rootfs/Dockerfile b/images/custom-error-pages/rootfs/Dockerfile index 8ae42317d..478e4c22d 100755 --- a/images/custom-error-pages/rootfs/Dockerfile +++ b/images/custom-error-pages/rootfs/Dockerfile @@ -12,7 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM golang:1.21.1-alpine3.18 as builder +ARG GOLANG_VERSION + +FROM golang:${GOLANG_VERSION}-alpine3.21 as builder RUN apk update \ && apk upgrade && apk add git diff --git a/images/custom-error-pages/rootfs/go.mod b/images/custom-error-pages/rootfs/go.mod index 1fc8f9939..5c0377284 100644 --- a/images/custom-error-pages/rootfs/go.mod +++ b/images/custom-error-pages/rootfs/go.mod @@ -1,17 +1,17 @@ module k8s.io/ingress-nginx/custom-error-pages -go 1.21.1 +go 1.23.6 -require github.com/prometheus/client_golang v1.11.1 +require github.com/prometheus/client_golang v1.20.5 require ( github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect - github.com/golang/protobuf v1.5.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.26.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - golang.org/x/sys v0.1.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + golang.org/x/sys v0.22.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect ) diff --git a/images/custom-error-pages/rootfs/go.sum b/images/custom-error-pages/rootfs/go.sum index a5f86cade..d5318cf86 100644 --- a/images/custom-error-pages/rootfs/go.sum +++ b/images/custom-error-pages/rootfs/go.sum @@ -1,141 +1,24 @@ -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/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/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +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/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= diff --git a/images/e2e-test-echo/EXTRAARGS b/images/e2e-test-echo/EXTRAARGS new file mode 100644 index 000000000..3db8aaa5c --- /dev/null +++ b/images/e2e-test-echo/EXTRAARGS @@ -0,0 +1 @@ +--build-arg LUAROCKS_VERSION=3.8.0 --build-arg LUAROCKS_SHA=ab6612ca9ab87c6984871d2712d05525775e8b50172701a0a1cabddf76de2be7 \ No newline at end of file diff --git a/images/e2e-test-echo/TAG b/images/e2e-test-echo/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/e2e-test-echo/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/e2e-test-echo/cloudbuild.yaml b/images/e2e-test-echo/cloudbuild.yaml new file mode 100644 index 000000000..02bfc034a --- /dev/null +++ b/images/e2e-test-echo/cloudbuild.yaml @@ -0,0 +1,11 @@ +options: + # Ignore Prow provided substitutions. + substitution_option: ALLOW_LOOSE +steps: + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d + env: + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash + args: + - -c + - gcloud auth configure-docker && cd images && make NAME=e2e-test-echo push diff --git a/images/echo/rootfs/Dockerfile b/images/e2e-test-echo/rootfs/Dockerfile similarity index 92% rename from images/echo/rootfs/Dockerfile rename to images/e2e-test-echo/rootfs/Dockerfile index c4ab26561..eaa919835 100644 --- a/images/echo/rootfs/Dockerfile +++ b/images/e2e-test-echo/rootfs/Dockerfile @@ -17,4 +17,4 @@ RUN wget -O /tmp/luarocks.tgz \ RUN luarocks install lua-resty-template -COPY nginx.conf /etc/nginx/nginx.conf +COPY nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/images/echo/rootfs/nginx.conf b/images/e2e-test-echo/rootfs/nginx.conf similarity index 100% rename from images/echo/rootfs/nginx.conf rename to images/e2e-test-echo/rootfs/nginx.conf diff --git a/images/echo/Makefile b/images/echo/Makefile deleted file mode 100644 index a213df5d3..000000000 --- a/images/echo/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2020 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/e2e-test-echo - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -BASE_IMAGE = $(shell cat $(DIR)/../../NGINX_BASE) -# build with buildx -PLATFORMS?=linux/amd64 -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - --build-arg BASE_IMAGE=${BASE_IMAGE} \ - --build-arg LUAROCKS_VERSION=3.8.0 \ - --build-arg LUAROCKS_SHA=ab6612ca9ab87c6984871d2712d05525775e8b50172701a0a1cabddf76de2be7 \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/echo/cloudbuild.yaml b/images/echo/cloudbuild.yaml deleted file mode 100644 index 811d8d3f0..000000000 --- a/images/echo/cloudbuild.yaml +++ /dev/null @@ -1,17 +0,0 @@ -timeout: 1200s -options: - substitution_option: ALLOW_LOOSE -steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash - env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root - args: - - -c - - | - gcloud auth configure-docker \ - && cd images/echo && make push diff --git a/images/ext-auth-example-authsvc/Makefile b/images/ext-auth-example-authsvc/Makefile deleted file mode 100644 index 63f261ec3..000000000 --- a/images/ext-auth-example-authsvc/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2022 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/ext-auth-example-authsvc - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64,linux/arm,linux/arm64,linux/s390x -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/ext-auth-example-authsvc/TAG b/images/ext-auth-example-authsvc/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/ext-auth-example-authsvc/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/ext-auth-example-authsvc/cloudbuild.yaml b/images/ext-auth-example-authsvc/cloudbuild.yaml deleted file mode 100644 index 4a436e012..000000000 --- a/images/ext-auth-example-authsvc/cloudbuild.yaml +++ /dev/null @@ -1,19 +0,0 @@ -timeout: 1200s -options: - substitution_option: ALLOW_LOOSE - # job builds a multi-arch docker image for amd64,arm,arm64 and s390x. - machineType: E2_HIGHCPU_8 -steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash - env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root - args: - - -c - - | - gcloud auth configure-docker \ - && cd images/ext-auth-example-authsvc && make push diff --git a/images/ext-auth-example-authsvc/rootfs/Dockerfile b/images/ext-auth-example-authsvc/rootfs/Dockerfile index f0b51374b..ca142e663 100644 --- a/images/ext-auth-example-authsvc/rootfs/Dockerfile +++ b/images/ext-auth-example-authsvc/rootfs/Dockerfile @@ -1,4 +1,6 @@ -FROM golang:1.21.1-alpine3.18 as builder +ARG GOLANG_VERSION + +FROM golang:${GOLANG_VERSION}-alpine3.21 as builder RUN mkdir /authsvc WORKDIR /authsvc COPY . ./ diff --git a/images/ext-auth-example-authsvc/rootfs/go.mod b/images/ext-auth-example-authsvc/rootfs/go.mod index df99c08b0..5f33a86ff 100644 --- a/images/ext-auth-example-authsvc/rootfs/go.mod +++ b/images/ext-auth-example-authsvc/rootfs/go.mod @@ -1,7 +1,7 @@ module example.com/authsvc -go 1.21.1 +go 1.23.6 -require k8s.io/apimachinery v0.23.1 +require k8s.io/apimachinery v0.32.2 -require github.com/google/uuid v1.1.2 // indirect +require github.com/google/uuid v1.6.0 // indirect diff --git a/images/ext-auth-example-authsvc/rootfs/go.sum b/images/ext-auth-example-authsvc/rootfs/go.sum index 6e3fab295..770c22f6a 100644 --- a/images/ext-auth-example-authsvc/rootfs/go.sum +++ b/images/ext-auth-example-authsvc/rootfs/go.sum @@ -1,215 +1,4 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -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/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/apimachinery v0.23.1 h1:sfBjlDFwj2onG0Ijx5C+SrAoeUscPrmghm7wHP+uXlo= -k8s.io/apimachinery v0.23.1/go.mod h1:SADt2Kl8/sttJ62RRsi9MIV4o8f5S3coArm0Iu3fBno= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/images/fastcgi-helloserver/TAG b/images/fastcgi-helloserver/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/fastcgi-helloserver/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/fastcgi-helloserver/cloudbuild.yaml b/images/fastcgi-helloserver/cloudbuild.yaml index 80623a197..c2c6135df 100644 --- a/images/fastcgi-helloserver/cloudbuild.yaml +++ b/images/fastcgi-helloserver/cloudbuild.yaml @@ -1,18 +1,11 @@ -timeout: 1800s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/fastcgi-helloserver && make push - + - -c + - gcloud auth configure-docker && cd images && make NAME=fastcgi-helloserver push diff --git a/images/fastcgi-helloserver/rootfs/Dockerfile b/images/fastcgi-helloserver/rootfs/Dockerfile index d4ed8305f..7d8e95c47 100755 --- a/images/fastcgi-helloserver/rootfs/Dockerfile +++ b/images/fastcgi-helloserver/rootfs/Dockerfile @@ -11,8 +11,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +ARG GOLANG_VERSION -FROM golang:1.21.1-alpine3.18 as builder +FROM golang:${GOLANG_VERSION}-alpine3.21 as builder WORKDIR /go/src/k8s.io/ingress-nginx/images/fastcgi diff --git a/images/go-grpc-greeter-server/Makefile b/images/go-grpc-greeter-server/Makefile deleted file mode 100644 index e221ecfea..000000000 --- a/images/go-grpc-greeter-server/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2021 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/go-grpc-greeter-server - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64,linux/arm,linux/arm64,linux/s390x -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/go-grpc-greeter-server/TAG b/images/go-grpc-greeter-server/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/go-grpc-greeter-server/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/go-grpc-greeter-server/cloudbuild.yaml b/images/go-grpc-greeter-server/cloudbuild.yaml deleted file mode 100644 index 20740eb27..000000000 --- a/images/go-grpc-greeter-server/cloudbuild.yaml +++ /dev/null @@ -1,19 +0,0 @@ -timeout: 1200s -options: - substitution_option: ALLOW_LOOSE - # job builds a multi-arch docker image for amd64,arm,arm64 and s390x. - machineType: E2_HIGHCPU_8 -steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash - env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root - args: - - -c - - | - gcloud auth configure-docker \ - && cd images/go-grpc-greeter-server && make push diff --git a/images/go-grpc-greeter-server/rootfs/Dockerfile b/images/go-grpc-greeter-server/rootfs/Dockerfile index 6460ce154..39be2990f 100644 --- a/images/go-grpc-greeter-server/rootfs/Dockerfile +++ b/images/go-grpc-greeter-server/rootfs/Dockerfile @@ -1,4 +1,6 @@ -FROM golang:1.21.1-alpine3.18 as build +ARG GOLANG_VERSION + +FROM golang:${GOLANG_VERSION}-alpine3.21 as build WORKDIR /go/src/greeter-server diff --git a/images/httpbun/Makefile b/images/httpbun/Makefile deleted file mode 100644 index bcb8c7be2..000000000 --- a/images/httpbun/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2020 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/e2e-test-httpbun - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64,linux/arm,linux/arm64,linux/s390x -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/httpbun/TAG b/images/httpbun/TAG new file mode 100644 index 000000000..56130fb3a --- /dev/null +++ b/images/httpbun/TAG @@ -0,0 +1 @@ +v1.1.1 diff --git a/images/httpbun/cloudbuild.yaml b/images/httpbun/cloudbuild.yaml index 68afbe873..c56820d15 100644 --- a/images/httpbun/cloudbuild.yaml +++ b/images/httpbun/cloudbuild.yaml @@ -1,19 +1,11 @@ -timeout: 1200s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE - # job builds a multi-arch docker image for amd64,arm,arm64 and s390x. - machineType: E2_HIGHCPU_8 steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/httpbun && make push + - -c + - gcloud auth configure-docker && cd images && make NAME=httpbun push diff --git a/images/httpbun/rootfs/Dockerfile b/images/httpbun/rootfs/Dockerfile index dd2d04502..ada137ee9 100644 --- a/images/httpbun/rootfs/Dockerfile +++ b/images/httpbun/rootfs/Dockerfile @@ -12,7 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM golang:1.21.1 AS builder +ARG GOLANG_VERSION + +FROM golang:${GOLANG_VERSION} AS builder ENV LC_ALL=C.UTF-8 ENV LANG=C.UTF-8 @@ -31,4 +33,4 @@ FROM scratch COPY --from=builder /go/httpbun/bin/httpbun httpbun ENV HTTPBUN_BIND=0.0.0.0:80 EXPOSE 80 -ENTRYPOINT ["/httpbun"] +ENTRYPOINT ["/httpbun"] \ No newline at end of file diff --git a/images/kube-webhook-certgen/Makefile b/images/kube-webhook-certgen/Makefile deleted file mode 100644 index cd014c7c3..000000000 --- a/images/kube-webhook-certgen/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2021 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -.DEFAULT_GOAL:=build - -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= local - -IMAGE = $(REGISTRY)/kube-webhook-certgen - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64,linux/arm,linux/arm64,linux/s390x -OUTPUT= -PROGRESS=plain - -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - -t $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -test: - cd rootfs && go test ./... - -test-e2e: - ./hack/e2e.sh - -.PHONY: build push ensure-buildx test test-e2e diff --git a/images/kube-webhook-certgen/OWNERS b/images/kube-webhook-certgen/OWNERS deleted file mode 100644 index ad47b2e6d..000000000 --- a/images/kube-webhook-certgen/OWNERS +++ /dev/null @@ -1,10 +0,0 @@ -# See the OWNERS docs: https://github.com/kubernetes/community/blob/master/contributors/guide/owners.md - -approvers: -- ingress-nginx-admins -- ingress-nginx-maintainers - -reviewers: -- ingress-nginx-admins -- ingress-nginx-maintainers -- ingress-nginx-kube-webhook-certgen-reviewers diff --git a/images/kube-webhook-certgen/TAG b/images/kube-webhook-certgen/TAG new file mode 100644 index 000000000..53b5bbb12 --- /dev/null +++ b/images/kube-webhook-certgen/TAG @@ -0,0 +1 @@ +v1.5.1 diff --git a/images/kube-webhook-certgen/cloudbuild.yaml b/images/kube-webhook-certgen/cloudbuild.yaml index 88d7400d0..e4118ff88 100644 --- a/images/kube-webhook-certgen/cloudbuild.yaml +++ b/images/kube-webhook-certgen/cloudbuild.yaml @@ -1,32 +1,11 @@ - -# Copyright 2021 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -timeout: 10800s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/kube-webhook-certgen && make push + - -c + - gcloud auth configure-docker && cd images && make NAME=kube-webhook-certgen push diff --git a/images/kube-webhook-certgen/rootfs/Dockerfile b/images/kube-webhook-certgen/rootfs/Dockerfile index 4a7e32ced..2348db825 100644 --- a/images/kube-webhook-certgen/rootfs/Dockerfile +++ b/images/kube-webhook-certgen/rootfs/Dockerfile @@ -12,17 +12,24 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=$BUILDPLATFORM golang:1.21.1 as builder +ARG GOLANG_VERSION + +FROM --platform=$BUILDPLATFORM golang:${GOLANG_VERSION} as builder + ARG BUILDPLATFORM ARG TARGETARCH + WORKDIR /workspace COPY . . -RUN CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -a -o kube-webhook-certgen main.go +RUN go mod tidy && CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -a -o kube-webhook-certgen main.go FROM --platform=$BUILDPLATFORM gcr.io/distroless/static:nonroot ARG BUILDPLATFORM ARG TARGETARCH + +LABEL org.opencontainers.image.source=https://github.com/kubernetes/ingress-nginx + WORKDIR / COPY --from=builder /workspace/kube-webhook-certgen /kube-webhook-certgen USER 65532:65532 diff --git a/images/kube-webhook-certgen/rootfs/go.mod b/images/kube-webhook-certgen/rootfs/go.mod index b2870f840..2b8567748 100644 --- a/images/kube-webhook-certgen/rootfs/go.mod +++ b/images/kube-webhook-certgen/rootfs/go.mod @@ -1,48 +1,57 @@ module github.com/jet/kube-webhook-certgen -go 1.21.1 +go 1.23.6 require ( - github.com/onrik/logrus v0.9.0 - github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.1.3 - k8s.io/api v0.22.6 - k8s.io/apimachinery v0.22.6 - k8s.io/client-go v0.22.6 - k8s.io/kube-aggregator v0.22.6 + github.com/onrik/logrus v0.11.0 + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.9.1 + k8s.io/api v0.32.2 + k8s.io/apimachinery v0.32.2 + k8s.io/client-go v0.32.2 + k8s.io/kube-aggregator v0.32.2 ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/evanphx/json-patch v4.11.0+incompatible // indirect - github.com/go-logr/logr v0.4.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/go-restful/v3 v3.11.3 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.5 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/imdario/mergo v0.3.5 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.11 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.22.2 // indirect + github.com/onsi/gomega v1.36.2 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/tidwall/gjson v1.14.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - google.golang.org/appengine v1.6.5 // indirect - google.golang.org/protobuf v1.26.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/x448/float16 v0.8.4 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.7.0 // indirect + google.golang.org/protobuf v1.36.1 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0 // indirect - k8s.io/klog/v2 v2.9.0 // indirect - k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c // indirect - k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/images/kube-webhook-certgen/rootfs/go.sum b/images/kube-webhook-certgen/rootfs/go.sum index 7817b7f29..1c660f020 100644 --- a/images/kube-webhook-certgen/rootfs/go.sum +++ b/images/kube-webhook-certgen/rootfs/go.sum @@ -1,748 +1,163 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.11.3 h1:yagOQz/38xJmcNeZJtrUcKjkHRltIaIFXKWeG1SkWGE= +github.com/emicklei/go-restful/v3 v3.11.3/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onrik/logrus v0.9.0 h1:oT7VstCUxWBoX7fswYK61fi9bzRBSpROq5CR2b7wxQo= -github.com/onrik/logrus v0.9.0/go.mod h1:qfe9NeZVAJfIxviw3cYkZo3kvBtLoPRJriAO8zl7qTk= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onrik/logrus v0.11.0 h1:pu+BCaWL36t0yQaj/2UHK2erf88dwssAKOT51mxPUVs= +github.com/onrik/logrus v0.11.0/go.mod h1:fO2vlZwIdti6PidD3gV5YKt9Lq5ptpnP293RAe1ITwk= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/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-20190606165138-5da285871e9c/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.22.6 h1:acjE5ABt0KpsBI9QCtLqaQEPSF94jOtE/LoFxSYasSE= -k8s.io/api v0.22.6/go.mod h1:q1F7IfaNrbi/83ebLy3YFQYLjPSNyunZ/IXQxMmbwCg= -k8s.io/apimachinery v0.22.6 h1:z7vxNRkFX0NToA+8D17kzLZ/T4t+DqwzUlqqbqRepRs= -k8s.io/apimachinery v0.22.6/go.mod h1:ZvVLP5iLhwVFg2Yx9Gh5W0um0DUauExbRhe+2Z8I1EU= -k8s.io/apiserver v0.22.6/go.mod h1:OlL1rGa2kKWGj2JEXnwBcul/BwC9Twe95gm4ohtiIIs= -k8s.io/client-go v0.22.6 h1:ugAXeC312xeGXsn7zTRz+btgtLBnW3qYhtUUpVQL7YE= -k8s.io/client-go v0.22.6/go.mod h1:TffU4AV2idZGeP+g3kdFZP+oHVHWPL1JYFySOALriw0= -k8s.io/code-generator v0.22.6/go.mod h1:iOZwYADSgFPNGWfqHFfg1V0TNJnl1t0WyZluQp4baqU= -k8s.io/component-base v0.22.6/go.mod h1:ngHLefY4J5fq2fApNdbWyj4yh0lvw36do4aAjNN8rc8= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-aggregator v0.22.6 h1:/iaXzOWia2dqOQkIA9eJtkmfTveJMLz3Dci9ZA/WgmU= -k8s.io/kube-aggregator v0.22.6/go.mod h1:0RSTzxqiwsj5HUlov195Z72ZKyE4qgedKXCl6sLKAjM= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c h1:jvamsI1tn9V0S8jicyX82qaFC0H/NKxv2e5mbqsgR80= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.27/go.mod h1:tq2nT0Kx7W+/f2JVE+zxYtUhdjuELJkVpNz+x/QN5R4= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= +k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= +k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= +k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-aggregator v0.32.2 h1:kg9pke+i2qRbJwX1UKwZV4fsCRvmbaCEFk38R4FqHmw= +k8s.io/kube-aggregator v0.32.2/go.mod h1:rRm+xY1yIFIt3zBc727nG5SBLYywywD87klfIAw+7+c= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/images/kube-webhook-certgen/rootfs/pkg/k8s/k8s_test.go b/images/kube-webhook-certgen/rootfs/pkg/k8s/k8s_test.go index f11bef981..b326697b6 100644 --- a/images/kube-webhook-certgen/rootfs/pkg/k8s/k8s_test.go +++ b/images/kube-webhook-certgen/rootfs/pkg/k8s/k8s_test.go @@ -186,7 +186,7 @@ func Test_Patching_objects(t *testing.T) { }) // This is to preserve old behavior and log format, it could be improved. - t.Run("diffent_non_empty_names_are_specified_for_validating_and_mutating_webhook", func(t *testing.T) { + t.Run("different_non_empty_names_are_specified_for_validating_and_mutating_webhook", func(t *testing.T) { t.Parallel() k := testK8sWithUnpatchedObjects() diff --git a/images/nginx/Makefile b/images/nginx/Makefile index b54a7739b..3cc14e5b3 100644 --- a/images/nginx/Makefile +++ b/images/nginx/Makefile @@ -1,4 +1,4 @@ -# Copyright 2017 The Kubernetes Authors. All rights reserved. +# Copyright 2024 The Kubernetes Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -22,9 +22,9 @@ INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh # 0.0.0 shouldn't clobber any released builds SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) +TAG ?=$(shell cat TAG) -REGISTRY ?= gcr.io/k8s-staging-ingress-nginx +REGISTRY ?= us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx IMAGE = $(REGISTRY)/nginx @@ -32,7 +32,7 @@ IMAGE = $(REGISTRY)/nginx export DOCKER_CLI_EXPERIMENTAL=enabled # build with buildx -PLATFORMS?=linux/amd64,linux/arm,linux/arm64,linux/s390x +PLATFORMS?=linux/amd64,linux/arm,linux/arm64 OUTPUT= PROGRESS=plain build: ensure-buildx diff --git a/images/nginx/README.md b/images/nginx/README.md index da6994fb5..768077215 100644 --- a/images/nginx/README.md +++ b/images/nginx/README.md @@ -1,27 +1,47 @@ -NGINX base image using [alpine](https://www.alpinelinux.org/) +NGINX base image -This custom image contains: +### HTTP/3 Support -- [nginx-http-auth-digest](https://github.com/atomx/nginx-http-auth-digest) -- [ngx_http_substitutions_filter_module](https://github.com/yaoweibin/ngx_http_substitutions_filter_module) -- [OpenTelemetry-CPP](https://github.com/open-telemetry/opentelemetry-cpp) -- [OpenTelemetry-CPP-Nginx](https://github.com/open-telemetry/opentelemetry-cpp-contrib/tree/main/instrumentation/nginx) -- [nginx-opentracing](https://github.com/opentracing-contrib/nginx-opentracing) -- [opentracing-cpp](https://github.com/opentracing/opentracing-cpp) -- [zipkin-cpp-opentracing](https://github.com/rnburn/zipkin-cpp-opentracing) -- [dd-opentracing-cpp](https://github.com/DataDog/dd-opentracing-cpp) -- [ModSecurity-nginx](https://github.com/SpiderLabs/ModSecurity-nginx) (only supported in x86_64) -- [brotli](https://github.com/google/brotli) -- [geoip2](https://github.com/leev/ngx_http_geoip2_module) +**HTTP/3 support is experimental and under development** -**How to use this image:** -This image provides a default configuration file with no backend servers. +[HTTP/3](https://datatracker.ietf.org/doc/html/rfc9114)\ +[QUIC](https://datatracker.ietf.org/doc/html/rfc9000) -_Using docker_ +[According to the documentation, NGINX 1.25.0 or higher supports HTTP/3:](https://nginx.org/en/docs/quic.html) -NGINX base image we use is defined in NGINX_BASE file at the root of the project +> Support for QUIC and HTTP/3 protocols is available since 1.25.0. -```console -docker run -v /some/nginx.conf:/etc/nginx/nginx.conf:ro $(cat ../../NGINX_BASE) -``` +But this requires adding a new flag during the build: +> When configuring nginx, it is possible to enable QUIC and HTTP/3 using the --with-http_v3_module configuration parameter. + +[We have added this flag](https://github.com/kubernetes/ingress-nginx/pull/11470), but it is not enough to use HTTP/3 in ingress-nginx, this is the first step. + +The next steps will be: + +1. **Waiting for OpenSSL 3.4.**\ + The main problem is, that we still use OpenSSL (3.x) and it does not support the important mechanism of TLS 1.3 - [early_data](https://datatracker.ietf.org/doc/html/rfc8446#section-2.3): + + > Otherwise, the OpenSSL compatibility layer will be used that does not support early data. + + [And although another part of the documentation says that the directive is supported with OpenSSL:](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data) + + > The directive is supported when using OpenSSL 1.1.1 or higher. + + But this is incomplete support, because OpenSSL does not support this feature, and [it has only client side support:](https://github.com/openssl/openssl) + + > ... the QUIC (currently client side only) version 1 protocol + + [And also there are some issues even with client side](https://github.com/openssl/openssl/discussions/23339) + + Due to this, we currently have incomplete HTTP/3 support, without important security and performance features.\ + But the good news is that [OpenSSL plans to add server-side support in 3.4](https://github.com/openssl/web/blob/master/roadmap.md): + + > Server-side QUIC support + + [Overview of SSL libraries(HAProxy Documentation)](https://github.com/haproxy/wiki/wiki/SSL-Libraries-Support-Status#tldr) + +2. **Adding [parameters](https://nginx.org/en/docs/http/ngx_http_v3_module.html) to the configmap to configure HTTP/3 and quic(enableHTTP3, enableHTTP/0.9, maxCurrentStream, and so on).** +3. **Adding options to the nginx config template(`listen 443 quic` to server blocks and `add_header Alt-Svc 'h3=":8443"; ma=86400';` to location blocks).** +4. **Opening the https port for UDP in the container(because QUIC uses UDP).** +5. **Adding tests.** diff --git a/images/nginx/TAG b/images/nginx/TAG index 8acdd82b7..46b105a30 100644 --- a/images/nginx/TAG +++ b/images/nginx/TAG @@ -1 +1 @@ -0.0.1 +v2.0.0 diff --git a/images/nginx/cloudbuild.yaml b/images/nginx/cloudbuild.yaml index 71051f26d..2563692d7 100644 --- a/images/nginx/cloudbuild.yaml +++ b/images/nginx/cloudbuild.yaml @@ -1,17 +1,14 @@ -timeout: 10800s options: - substitution_option: ALLOW_LOOSE - # job builds a multi-arch docker image for amd64,arm,arm64 and s390x. + # Increase machine type for multi-arch builds. machineType: E2_HIGHCPU_32 + # Ignore Prow provided substitutions. + substitution_option: ALLOW_LOOSE steps: - - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90' - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/nginx && make push + - -c + - gcloud auth configure-docker && cd images/nginx && make push +timeout: 7200s diff --git a/images/nginx/rc.yaml b/images/nginx/rc.yaml deleted file mode 100644 index bcf2b0274..000000000 --- a/images/nginx/rc.yaml +++ /dev/null @@ -1,44 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -spec: - type: NodePort - ports: - - port: 80 - protocol: TCP - name: http - - port: 443 - protocol: TCP - name: https - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx ---- -apiVersion: v1 -kind: ReplicationController -metadata: - name: nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx -spec: - replicas: 1 - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - template: - metadata: - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: ingress-nginx - spec: - containers: - - name: nginx - image: registry.k8s.io/ingress-nginx/nginx:c5766dc011965f22fac2f4437e86d0fd9960a50c@sha256:94ff9b435a5f3f4570bbdaed4a3a523f63a54ce2ad6b132b5640bae2af5d9d90 - ports: - - containerPort: 80 - - containerPort: 443 diff --git a/images/nginx/rootfs/Dockerfile b/images/nginx/rootfs/Dockerfile index aba0ab70b..834a9bcf3 100644 --- a/images/nginx/rootfs/Dockerfile +++ b/images/nginx/rootfs/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2015 The Kubernetes Authors. All rights reserved. +# Copyright 2024 The Kubernetes Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.18.4 as builder +FROM alpine:3.21 as builder COPY . / @@ -21,7 +21,7 @@ RUN apk update \ && /build.sh # Use a multi-stage build -FROM alpine:3.18.4 +FROM alpine:3.21 ENV PATH=$PATH:/usr/local/luajit/bin:/usr/local/nginx/sbin:/usr/local/nginx/bin @@ -29,6 +29,7 @@ ENV LUA_PATH="/usr/local/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1 ENV LUA_CPATH="/usr/local/lib/lua/?/?.so;/usr/local/lib/lua/?.so;;" COPY --from=builder /usr/local /usr/local +COPY --from=builder /usr/lib/libopentelemetry* /usr/local/lib COPY --from=builder /opt /opt COPY --from=builder /etc/nginx /etc/nginx @@ -39,7 +40,6 @@ RUN apk update \ openssl \ pcre \ zlib \ - geoip \ ca-certificates \ patch \ yajl \ @@ -49,6 +49,10 @@ RUN apk update \ yaml-cpp \ dumb-init \ tzdata \ + grpc-cpp \ + libprotobuf \ + abseil-cpp-crc-cpu-detect \ + abseil-cpp-vlog-config-internal \ && ln -s /usr/local/nginx/sbin/nginx /sbin/nginx \ && adduser -S -D -H -u 101 -h /usr/local/nginx \ -s /sbin/nologin -G www-data -g www-data www-data \ @@ -64,7 +68,7 @@ RUN apk update \ ); \ for dir in "${writeDirs[@]}"; do \ mkdir -p ${dir}; \ - chown -R www-data.www-data ${dir}; \ + chown -R www-data:www-data ${dir}; \ done' EXPOSE 80 443 diff --git a/images/nginx/rootfs/build.sh b/images/nginx/rootfs/build.sh index dc1d12547..297abf777 100755 --- a/images/nginx/rootfs/build.sh +++ b/images/nginx/rootfs/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2015 The Kubernetes Authors. +# Copyright 2023 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -18,139 +18,119 @@ set -o errexit set -o nounset set -o pipefail -export NGINX_VERSION=1.21.6 +export NGINX_VERSION=1.27.1 -# Check for recent changes: https://github.com/vision5/ngx_devel_kit/compare/v0.3.2...master -export NDK_VERSION=0.3.2 +# Check for recent changes: https://github.com/vision5/ngx_devel_kit/compare/v0.3.3...master +export NDK_VERSION=v0.3.3 # Check for recent changes: https://github.com/openresty/set-misc-nginx-module/compare/v0.33...master -export SETMISC_VERSION=0.33 +export SETMISC_VERSION=v0.33 -# Check for recent changes: https://github.com/openresty/headers-more-nginx-module/compare/v0.34...master -export MORE_HEADERS_VERSION=0.34 +# Check for recent changes: https://github.com/openresty/headers-more-nginx-module/compare/v0.37...master +export MORE_HEADERS_VERSION=v0.37 -# Check for recent changes: https://github.com/atomx/nginx-http-auth-digest/compare/v1.0.0...atomx:master -export NGINX_DIGEST_AUTH=1.0.0 - -# Check for recent changes: https://github.com/yaoweibin/ngx_http_substitutions_filter_module/compare/v0.6.4...master -export NGINX_SUBSTITUTIONS=b8a71eacc7f986ba091282ab8b1bbbc6ae1807e0 - -# Check for recent changes: https://github.com/opentracing-contrib/nginx-opentracing/compare/v0.19.0...master -export NGINX_OPENTRACING_VERSION=0.19.0 - -#Check for recent changes: https://github.com/opentracing/opentracing-cpp/compare/v1.6.0...master -export OPENTRACING_CPP_VERSION=f86b33f3d9e7322b1298ba62d5ffa7a9519c4c41 - -# Check for recent changes: https://github.com/rnburn/zipkin-cpp-opentracing/compare/v0.5.2...master -export ZIPKIN_CPP_VERSION=f69593138ff84ca2f6bc115992e18ca3d35f344a - -# Check for recent changes: https://github.com/jbeder/yaml-cpp/compare/yaml-cpp-0.7.0...master -export YAML_CPP_VERSION=yaml-cpp-0.7.0 - -# Check for recent changes: https://github.com/jaegertracing/jaeger-client-cpp/compare/v0.7.0...master -export JAEGER_VERSION=0.7.0 - -# Check for recent changes: https://github.com/msgpack/msgpack-c/compare/cpp-3.3.0...master -export MSGPACK_VERSION=3.3.0 - -# Check for recent changes: https://github.com/DataDog/dd-opentracing-cpp/compare/v1.3.7...master -export DATADOG_CPP_VERSION=1.3.7 +# Check for recent changes: https://github.com/atomx/nginx-http-auth-digest/compare/v1.0.0...master +export NGINX_DIGEST_AUTH=v1.0.0 # Check for recent changes: https://github.com/SpiderLabs/ModSecurity-nginx/compare/v1.0.3...master -export MODSECURITY_VERSION=1.0.3 +export MODSECURITY_VERSION=v1.0.3 -# Check for recent changes: https://github.com/SpiderLabs/ModSecurity/compare/v3.0.8...v3/master -export MODSECURITY_LIB_VERSION=e9a7ba4a60be48f761e0328c6dfcc668d70e35a0 +# Check for recent changes: https://github.com/SpiderLabs/ModSecurity/compare/v3.0.13...v3/master +export MODSECURITY_LIB_VERSION=v3.0.13 -# Check for recent changes: https://github.com/coreruleset/coreruleset/compare/v3.3.2...v3.3/master -export OWASP_MODSECURITY_CRS_VERSION=v3.3.5 +# Check for recent changes: https://github.com/coreruleset/coreruleset/compare/v4.10.0...main +export OWASP_MODSECURITY_CRS_VERSION=v4.10.0 -# Check for recent changes: https://github.com/openresty/lua-nginx-module/compare/v0.10.25...master -export LUA_NGX_VERSION=0.10.25 +# Check for recent changes: https://github.com/openresty/lua-nginx-module/compare/v0.10.27...master +export LUA_NGX_VERSION=v0.10.27 -# Check for recent changes: https://github.com/openresty/stream-lua-nginx-module/compare/v0.0.13...master -export LUA_STREAM_NGX_VERSION=0.0.13 +# Check for recent changes: https://github.com/openresty/stream-lua-nginx-module/compare/v0.0.15...master +export LUA_STREAM_NGX_VERSION=v0.0.15 -# Check for recent changes: https://github.com/openresty/lua-upstream-nginx-module/compare/8aa93ead98ba2060d4efd594ae33a35d153589bf...master -export LUA_UPSTREAM_VERSION=8aa93ead98ba2060d4efd594ae33a35d153589bf +# Check for recent changes: https://github.com/openresty/lua-upstream-nginx-module/compare/v0.07...master +export LUA_UPSTREAM_VERSION=v0.07 -# Check for recent changes: https://github.com/openresty/lua-cjson/compare/2.1.0.11...openresty:master -export LUA_CJSON_VERSION=2.1.0.11 +# Check for recent changes: https://github.com/openresty/lua-cjson/compare/2.1.0.14...master +export LUA_CJSON_VERSION=2.1.0.14 -# Check for recent changes: https://github.com/leev/ngx_http_geoip2_module/compare/3.3...master -export GEOIP2_VERSION=a26c6beed77e81553686852dceb6c7fdacc5970d +# Check for recent changes: https://github.com/leev/ngx_http_geoip2_module/compare/445df24ef3781e488cee3dfe8a1e111997fc1dfe...master +export GEOIP2_VERSION=445df24ef3781e488cee3dfe8a1e111997fc1dfe -# Check for recent changes: https://github.com/openresty/luajit2/compare/v2.1-20230410...v2.1-agentzh -export LUAJIT_VERSION=2.1-20230410 +# Check for recent changes: https://github.com/openresty/luajit2/compare/v2.1-20240815...v2.1-agentzh +export LUAJIT_VERSION=v2.1-20240815 -# Check for recent changes: https://github.com/openresty/lua-resty-balancer/compare/v0.04...master -export LUA_RESTY_BALANCER=0.04 +# Check for recent changes: https://github.com/openresty/lua-resty-balancer/compare/v0.05...master +export LUA_RESTY_BALANCER=v0.05 -# Check for recent changes: https://github.com/openresty/lua-resty-lrucache/compare/v0.13...master -export LUA_RESTY_CACHE=0.13 +# Check for recent changes: https://github.com/openresty/lua-resty-lrucache/compare/v0.15...master +export LUA_RESTY_CACHE=v0.15 -# Check for recent changes: https://github.com/openresty/lua-resty-core/compare/v0.1.27...master -export LUA_RESTY_CORE=0.1.27 +# Check for recent changes: https://github.com/openresty/lua-resty-core/compare/v0.1.30...master +export LUA_RESTY_CORE=v0.1.30 -# Check for recent changes: https://github.com/cloudflare/lua-resty-cookie/compare/v0.1.0...master -export LUA_RESTY_COOKIE_VERSION=303e32e512defced053a6484bc0745cf9dc0d39e +# Check for recent changes: https://github.com/cloudflare/lua-resty-cookie/compare/f418d77082eaef48331302e84330488fdc810ef4...master +export LUA_RESTY_COOKIE_VERSION=f418d77082eaef48331302e84330488fdc810ef4 -# Check for recent changes: https://github.com/openresty/lua-resty-dns/compare/v0.22...master -export LUA_RESTY_DNS=0.22 +# Check for recent changes: https://github.com/openresty/lua-resty-dns/compare/v0.23...master +export LUA_RESTY_DNS=v0.23 -# Check for recent changes: https://github.com/ledgetech/lua-resty-http/compare/v0.16.1...master -export LUA_RESTY_HTTP=0ce55d6d15da140ecc5966fa848204c6fd9074e8 +# Check for recent changes: https://github.com/ledgetech/lua-resty-http/compare/v0.17.2...master +export LUA_RESTY_HTTP=v0.17.2 # Check for recent changes: https://github.com/openresty/lua-resty-lock/compare/v0.09...master -export LUA_RESTY_LOCK=0.09 +export LUA_RESTY_LOCK=v0.09 # Check for recent changes: https://github.com/openresty/lua-resty-upload/compare/v0.11...master -export LUA_RESTY_UPLOAD_VERSION=0.11 +export LUA_RESTY_UPLOAD_VERSION=v0.11 -# Check for recent changes: https://github.com/openresty/lua-resty-string/compare/v0.15...master -export LUA_RESTY_STRING_VERSION=0.15 +# Check for recent changes: https://github.com/openresty/lua-resty-string/compare/v0.16...master +export LUA_RESTY_STRING_VERSION=v0.16 # Check for recent changes: https://github.com/openresty/lua-resty-memcached/compare/v0.17...master -export LUA_RESTY_MEMCACHED_VERSION=0.17 +export LUA_RESTY_MEMCACHED_VERSION=v0.17 -# Check for recent changes: https://github.com/openresty/lua-resty-redis/compare/v0.30...master -export LUA_RESTY_REDIS_VERSION=0.30 +# Check for recent changes: https://github.com/openresty/lua-resty-redis/compare/v0.31...master +export LUA_RESTY_REDIS_VERSION=v0.31 -# Check for recent changes: https://github.com/api7/lua-resty-ipmatcher/compare/v0.6.1...master -export LUA_RESTY_IPMATCHER_VERSION=0.6.1 +# Check for recent changes: https://github.com/api7/lua-resty-ipmatcher/compare/3e93c53eb8c9884efe939ef070486a0e507cc5be...master +export LUA_RESTY_IPMATCHER_VERSION=3e93c53eb8c9884efe939ef070486a0e507cc5be -# Check for recent changes: https://github.com/ElvinEfendi/lua-resty-global-throttle/compare/v0.2.0...main -export LUA_RESTY_GLOBAL_THROTTLE_VERSION=0.2.0 +# Check for recent changes: https://github.com/microsoft/mimalloc/compare/v2.1.9...master +export MIMALOC_VERSION=v2.1.9 -# Check for recent changes: https://github.com/microsoft/mimalloc/compare/v1.7.6...master -export MIMALOC_VERSION=1.7.6 +# Check for recent changes: https://github.com/open-telemetry/opentelemetry-cpp/compare/v1.18.0...main +export OPENTELEMETRY_CPP_VERSION=v1.18.0 + +# Check for recent changes: https://github.com/open-telemetry/opentelemetry-proto/compare/v1.5.0...main +export OPENTELEMETRY_PROTO_VERSION=v1.5.0 export BUILD_PATH=/tmp/build ARCH=$(uname -m) -if [[ ${ARCH} == "s390x" ]]; then - export LUAJIT_VERSION=9d5750d28478abfdcaefdfdc408f87752a21e431 - export LUA_RESTY_CORE=0.1.17 - export LUA_NGX_VERSION=0.10.15 - export LUA_STREAM_NGX_VERSION=0.0.7 -fi - get_src() { hash="$1" url="$2" + dest="${3-}" + ARGS="" f=$(basename "$url") echo "Downloading $url" curl -sSL "$url" -o "$f" - echo "$hash $f" | sha256sum -c - || exit 10 - tar xzf "$f" + # TODO: Reenable checksum verification but make it smarter + # echo "$hash $f" | sha256sum -c - || exit 10 + if [ ! -z "$dest" ]; then + mkdir ${BUILD_PATH}/${dest} + ARGS="-C ${BUILD_PATH}/${dest} --strip-components=1" + fi + tar xvzf "$f" $ARGS rm -rf "$f" } # install required packages to build +# Dependencies from "ninja" and below are OTEL dependencies apk add \ bash \ gcc \ @@ -164,7 +144,6 @@ apk add \ linux-headers \ libxslt-dev \ gd-dev \ - geoip-dev \ perl-dev \ libedit-dev \ mercurial \ @@ -188,7 +167,22 @@ apk add \ unzip \ dos2unix \ yaml-cpp \ - coreutils + coreutils \ + ninja \ + gtest-dev \ + git \ + build-base \ + pkgconfig \ + c-ares-dev \ + re2-dev \ + grpc-dev \ + protobuf-dev + +# apk add -X http://dl-cdn.alpinelinux.org/alpine/edge/testing opentelemetry-cpp-dev + +# There is some bug with some platforms and git, so force HTTP/1.1 +git config --global http.version HTTP/1.1 +git config --global http.postBuffer 157286400 mkdir -p /etc/nginx @@ -200,276 +194,131 @@ get_src 66dc7081488811e9f925719e34d1b4504c2801c81dee2920e5452a86b11405ae \ "https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz" get_src aa961eafb8317e0eb8da37eb6e2c9ff42267edd18b56947384e719b85188f58b \ - "https://github.com/vision5/ngx_devel_kit/archive/v$NDK_VERSION.tar.gz" + "https://github.com/vision5/ngx_devel_kit/archive/$NDK_VERSION.tar.gz" "ngx_devel_kit" + +get_src abc123 \ + "https://github.com/open-telemetry/opentelemetry-cpp/archive/$OPENTELEMETRY_CPP_VERSION.tar.gz" "opentelemetry-cpp" + +get_src abc123 \ + "https://github.com/open-telemetry/opentelemetry-proto/archive/$OPENTELEMETRY_PROTO_VERSION.tar.gz" "opentelemetry-proto" get_src cd5e2cc834bcfa30149e7511f2b5a2183baf0b70dc091af717a89a64e44a2985 \ - "https://github.com/openresty/set-misc-nginx-module/archive/v$SETMISC_VERSION.tar.gz" + "https://github.com/openresty/set-misc-nginx-module/archive/$SETMISC_VERSION.tar.gz" "set-misc-nginx-module" get_src 0c0d2ced2ce895b3f45eb2b230cd90508ab2a773299f153de14a43e44c1209b3 \ - "https://github.com/openresty/headers-more-nginx-module/archive/v$MORE_HEADERS_VERSION.tar.gz" + "https://github.com/openresty/headers-more-nginx-module/archive/$MORE_HEADERS_VERSION.tar.gz" "headers-more-nginx-module" get_src f09851e6309560a8ff3e901548405066c83f1f6ff88aa7171e0763bd9514762b \ - "https://github.com/atomx/nginx-http-auth-digest/archive/v$NGINX_DIGEST_AUTH.tar.gz" - -get_src a98b48947359166326d58700ccdc27256d2648218072da138ab6b47de47fbd8f \ - "https://github.com/yaoweibin/ngx_http_substitutions_filter_module/archive/$NGINX_SUBSTITUTIONS.tar.gz" - -get_src 6f97776ebdf019b105a755c7736b70bdbd7e575c7f0d39db5fe127873c7abf17 \ - "https://github.com/opentracing-contrib/nginx-opentracing/archive/v$NGINX_OPENTRACING_VERSION.tar.gz" - -get_src cbe625cba85291712253db5bc3870d60c709acfad9a8af5a302673d3d201e3ea \ - "https://github.com/opentracing/opentracing-cpp/archive/$OPENTRACING_CPP_VERSION.tar.gz" - -get_src 71de3d0658935db7ccea20e006b35e58ddc7e4c18878b9523f2addc2371e9270 \ - "https://github.com/rnburn/zipkin-cpp-opentracing/archive/$ZIPKIN_CPP_VERSION.tar.gz" + "https://github.com/atomx/nginx-http-auth-digest/archive/$NGINX_DIGEST_AUTH.tar.gz" "nginx-http-auth-digest" get_src 32a42256616cc674dca24c8654397390adff15b888b77eb74e0687f023c8751b \ - "https://github.com/SpiderLabs/ModSecurity-nginx/archive/v$MODSECURITY_VERSION.tar.gz" + "https://github.com/SpiderLabs/ModSecurity-nginx/archive/$MODSECURITY_VERSION.tar.gz" "ModSecurity-nginx" -get_src 43e6a9fcb146ad871515f0d0873947e5d497a1c9c60c58cb102a97b47208b7c3 \ - "https://github.com/jbeder/yaml-cpp/archive/$YAML_CPP_VERSION.tar.gz" - -get_src 3a3a03060bf5e3fef52c9a2de02e6035cb557f389453d8f3b0c1d3d570636994 \ - "https://github.com/jaegertracing/jaeger-client-cpp/archive/v$JAEGER_VERSION.tar.gz" - -get_src 754c3ace499a63e45b77ef4bcab4ee602c2c414f58403bce826b76ffc2f77d0b \ - "https://github.com/msgpack/msgpack-c/archive/cpp-$MSGPACK_VERSION.tar.gz" - -if [[ ${ARCH} == "s390x" ]]; then -get_src 7d5f3439c8df56046d0564b5857fd8a30296ab1bd6df0f048aed7afb56a0a4c2 \ - "https://github.com/openresty/lua-nginx-module/archive/v$LUA_NGX_VERSION.tar.gz" -get_src 99c47c75c159795c9faf76bbb9fa58e5a50b75286c86565ffcec8514b1c74bf9 \ - "https://github.com/openresty/stream-lua-nginx-module/archive/v$LUA_STREAM_NGX_VERSION.tar.gz" -else get_src bc764db42830aeaf74755754b900253c233ad57498debe7a441cee2c6f4b07c2 \ - "https://github.com/openresty/lua-nginx-module/archive/v$LUA_NGX_VERSION.tar.gz" + "https://github.com/openresty/lua-nginx-module/archive/$LUA_NGX_VERSION.tar.gz" "lua-nginx-module" get_src 01b715754a8248cc7228e0c8f97f7488ae429d90208de0481394e35d24cef32f \ - "https://github.com/openresty/stream-lua-nginx-module/archive/v$LUA_STREAM_NGX_VERSION.tar.gz" - -fi + "https://github.com/openresty/stream-lua-nginx-module/archive/$LUA_STREAM_NGX_VERSION.tar.gz" "stream-lua-nginx-module" get_src a92c9ee6682567605ece55d4eed5d1d54446ba6fba748cff0a2482aea5713d5f \ - "https://github.com/openresty/lua-upstream-nginx-module/archive/$LUA_UPSTREAM_VERSION.tar.gz" + "https://github.com/openresty/lua-upstream-nginx-module/archive/$LUA_UPSTREAM_VERSION.tar.gz" "lua-upstream-nginx-module" -if [[ ${ARCH} == "s390x" ]]; then -get_src 266ed1abb70a9806d97cb958537a44b67db6afb33d3b32292a2d68a2acedea75 \ - "https://github.com/openresty/luajit2/archive/$LUAJIT_VERSION.tar.gz" -else get_src 77bbcbb24c3c78f51560017288f3118d995fe71240aa379f5818ff6b166712ff \ - "https://github.com/openresty/luajit2/archive/v$LUAJIT_VERSION.tar.gz" -fi + "https://github.com/openresty/luajit2/archive/$LUAJIT_VERSION.tar.gz" "luajit2" -get_src 8d39c6b23f941a2d11571daaccc04e69539a3fcbcc50a631837560d5861a7b96 \ - "https://github.com/DataDog/dd-opentracing-cpp/archive/v$DATADOG_CPP_VERSION.tar.gz" - -get_src 4c1933434572226942c65b2f2b26c8a536ab76aa771a3c7f6c2629faa764976b \ - "https://github.com/leev/ngx_http_geoip2_module/archive/$GEOIP2_VERSION.tar.gz" +get_src b6c9c09fd43eb34a71e706ad780b2ead26549a9a9f59280fe558f5b7b980b7c6 \ + "https://github.com/leev/ngx_http_geoip2_module/archive/$GEOIP2_VERSION.tar.gz" "ngx_http_geoip2_module" get_src deb4ab1ffb9f3d962c4b4a2c4bdff692b86a209e3835ae71ebdf3b97189e40a9 \ - "https://github.com/openresty/lua-resty-upload/archive/v$LUA_RESTY_UPLOAD_VERSION.tar.gz" + "https://github.com/openresty/lua-resty-upload/archive/$LUA_RESTY_UPLOAD_VERSION.tar.gz" "lua-resty-upload" get_src bdbf271003d95aa91cab0a92f24dca129e99b33f79c13ebfcdbbcbb558129491 \ - "https://github.com/openresty/lua-resty-string/archive/v$LUA_RESTY_STRING_VERSION.tar.gz" + "https://github.com/openresty/lua-resty-string/archive/$LUA_RESTY_STRING_VERSION.tar.gz" "lua-resty-string" get_src 16d72ed133f0c6df376a327386c3ef4e9406cf51003a700737c3805770ade7c5 \ - "https://github.com/openresty/lua-resty-balancer/archive/v$LUA_RESTY_BALANCER.tar.gz" + "https://github.com/openresty/lua-resty-balancer/archive/$LUA_RESTY_BALANCER.tar.gz" "lua-resty-balancer" -if [[ ${ARCH} == "s390x" ]]; then -get_src 8f5f76d2689a3f6b0782f0a009c56a65e4c7a4382be86422c9b3549fe95b0dc4 \ - "https://github.com/openresty/lua-resty-core/archive/v$LUA_RESTY_CORE.tar.gz" -else get_src 39baab9e2b31cc48cecf896cea40ef6e80559054fd8a6e440cc804a858ea84d4 \ - "https://github.com/openresty/lua-resty-core/archive/v$LUA_RESTY_CORE.tar.gz" -fi + "https://github.com/openresty/lua-resty-core/archive/$LUA_RESTY_CORE.tar.gz" "lua-resty-core" get_src a77b9de160d81712f2f442e1de8b78a5a7ef0d08f13430ff619f79235db974d4 \ - "https://github.com/openresty/lua-cjson/archive/$LUA_CJSON_VERSION.tar.gz" + "https://github.com/openresty/lua-cjson/archive/$LUA_CJSON_VERSION.tar.gz" "lua-cjson" get_src 5ed48c36231e2622b001308622d46a0077525ac2f751e8cc0c9905914254baa4 \ - "https://github.com/cloudflare/lua-resty-cookie/archive/$LUA_RESTY_COOKIE_VERSION.tar.gz" + "https://github.com/cloudflare/lua-resty-cookie/archive/$LUA_RESTY_COOKIE_VERSION.tar.gz" "lua-resty-cookie" get_src 573184006b98ccee2594b0d134fa4d05e5d2afd5141cbad315051ccf7e9b6403 \ - "https://github.com/openresty/lua-resty-lrucache/archive/v$LUA_RESTY_CACHE.tar.gz" + "https://github.com/openresty/lua-resty-lrucache/archive/$LUA_RESTY_CACHE.tar.gz" "lua-resty-lrucache" get_src b4ddcd47db347e9adf5c1e1491a6279a6ae2a3aff3155ef77ea0a65c998a69c1 \ - "https://github.com/openresty/lua-resty-lock/archive/v$LUA_RESTY_LOCK.tar.gz" + "https://github.com/openresty/lua-resty-lock/archive/$LUA_RESTY_LOCK.tar.gz" "lua-resty-lock" get_src 70e9a01eb32ccade0d5116a25bcffde0445b94ad35035ce06b94ccd260ad1bf0 \ - "https://github.com/openresty/lua-resty-dns/archive/v$LUA_RESTY_DNS.tar.gz" + "https://github.com/openresty/lua-resty-dns/archive/$LUA_RESTY_DNS.tar.gz" "lua-resty-dns" get_src 9fcb6db95bc37b6fce77d3b3dc740d593f9d90dce0369b405eb04844d56ac43f \ - "https://github.com/ledgetech/lua-resty-http/archive/$LUA_RESTY_HTTP.tar.gz" + "https://github.com/ledgetech/lua-resty-http/archive/$LUA_RESTY_HTTP.tar.gz" "lua-resty-http" get_src 02733575c4aed15f6cab662378e4b071c0a4a4d07940c4ef19a7319e9be943d4 \ - "https://github.com/openresty/lua-resty-memcached/archive/v$LUA_RESTY_MEMCACHED_VERSION.tar.gz" + "https://github.com/openresty/lua-resty-memcached/archive/$LUA_RESTY_MEMCACHED_VERSION.tar.gz" "lua-resty-memcached" get_src c15aed1a01c88a3a6387d9af67a957dff670357f5fdb4ee182beb44635eef3f1 \ - "https://github.com/openresty/lua-resty-redis/archive/v$LUA_RESTY_REDIS_VERSION.tar.gz" + "https://github.com/openresty/lua-resty-redis/archive/$LUA_RESTY_REDIS_VERSION.tar.gz" "lua-resty-redis" get_src efb767487ea3f6031577b9b224467ddbda2ad51a41c5867a47582d4ad85d609e \ - "https://github.com/api7/lua-resty-ipmatcher/archive/v$LUA_RESTY_IPMATCHER_VERSION.tar.gz" - -get_src 0fb790e394510e73fdba1492e576aaec0b8ee9ef08e3e821ce253a07719cf7ea \ - "https://github.com/ElvinEfendi/lua-resty-global-throttle/archive/v$LUA_RESTY_GLOBAL_THROTTLE_VERSION.tar.gz" + "https://github.com/api7/lua-resty-ipmatcher/archive/$LUA_RESTY_IPMATCHER_VERSION.tar.gz" "lua-resty-ipmatcher" get_src d74f86ada2329016068bc5a243268f1f555edd620b6a7d6ce89295e7d6cf18da \ - "https://github.com/microsoft/mimalloc/archive/refs/tags/v${MIMALOC_VERSION}.tar.gz" + "https://github.com/microsoft/mimalloc/archive/${MIMALOC_VERSION}.tar.gz" "mimalloc" # improve compilation times CORES=$(($(grep -c ^processor /proc/cpuinfo) - 1)) export MAKEFLAGS=-j${CORES} export CTEST_BUILD_FLAGS=${MAKEFLAGS} -export HUNTER_JOBS_NUMBER=${CORES} -export HUNTER_USE_CACHE_SERVERS=true # Install luajit from openresty fork export LUAJIT_LIB=/usr/local/lib export LUA_LIB_DIR="$LUAJIT_LIB/lua" export LUAJIT_INC=/usr/local/include/luajit-2.1 -cd "$BUILD_PATH/luajit2-$LUAJIT_VERSION" +cd "$BUILD_PATH/luajit2" make CCDEBUG=-g make install ln -s /usr/local/bin/luajit /usr/local/bin/lua ln -s "$LUAJIT_INC" /usr/local/include/lua -cd "$BUILD_PATH" +cd "$BUILD_PATH/opentelemetry-cpp" +export CXXFLAGS="-DBENCHMARK_HAS_NO_INLINE_ASSEMBLY" +cmake -B build -G Ninja -Wno-dev \ + -DOTELCPP_PROTO_PATH="${BUILD_PATH}/opentelemetry-proto/" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING="OFF" \ + -DBUILD_W3CTRACECONTEXT_TEST="OFF" \ + -DCMAKE_BUILD_TYPE=None \ + -DWITH_ABSEIL=ON \ + -DWITH_STL=ON \ + -DWITH_EXAMPLES=OFF \ + -DWITH_ZPAGES=OFF \ + -DWITH_OTLP_GRPC=ON \ + -DWITH_OTLP_HTTP=ON \ + -DWITH_ZIPKIN=ON \ + -DWITH_PROMETHEUS=OFF \ + -DWITH_ASYNC_EXPORT_PREVIEW=OFF \ + -DWITH_METRICS_EXEMPLAR_PREVIEW=OFF + cmake --build build + cmake --install build # Git tuning git config --global --add core.compression -1 -# build opentracing lib -cd "$BUILD_PATH/opentracing-cpp-$OPENTRACING_CPP_VERSION" -mkdir .build -cd .build - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTING=OFF \ - -DBUILD_SHARED_LIBS=OFF \ - -DBUILD_MOCKTRACER=OFF \ - -DBUILD_STATIC_LIBS=ON \ - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ - .. - -make -make install - -# build yaml-cpp -# TODO @timmysilv: remove this and jaeger sed calls once it is fixed in jaeger-client-cpp -cd "$BUILD_PATH/yaml-cpp-$YAML_CPP_VERSION" -mkdir .build -cd .build - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ - -DYAML_BUILD_SHARED_LIBS=ON \ - -DYAML_CPP_BUILD_TESTS=OFF \ - -DYAML_CPP_BUILD_TOOLS=OFF \ - .. - -make -make install - -# build jaeger lib -cd "$BUILD_PATH/jaeger-client-cpp-$JAEGER_VERSION" -sed -i 's/-Werror/-Wno-psabi/' CMakeLists.txt -# use the above built yaml-cpp instead until a new version of jaeger-client-cpp fixes the yaml-cpp issue -# tl;dr new hunter is needed for new yaml-cpp, but new hunter has a conflict with old Thrift and new Boost -sed -i 's/hunter_add_package(yaml-cpp)/#hunter_add_package(yaml-cpp)/' CMakeLists.txt -sed -i 's/yaml-cpp::yaml-cpp/yaml-cpp/' CMakeLists.txt - -cat < export.map -{ - global: - OpenTracingMakeTracerFactory; - local: *; -}; -EOF - -mkdir .build -cd .build - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTING=OFF \ - -DJAEGERTRACING_BUILD_EXAMPLES=OFF \ - -DJAEGERTRACING_BUILD_CROSSDOCK=OFF \ - -DJAEGERTRACING_COVERAGE=OFF \ - -DJAEGERTRACING_PLUGIN=ON \ - -DHUNTER_CONFIGURATION_TYPES=Release \ - -DBUILD_SHARED_LIBS=OFF \ - -DJAEGERTRACING_WITH_YAML_CPP=ON \ - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ - .. - -make -make install - -export HUNTER_INSTALL_DIR=$(cat _3rdParty/Hunter/install-root-dir) \ - -mv libjaegertracing_plugin.so /usr/local/lib/libjaegertracing_plugin.so - - -# build zipkin lib -cd "$BUILD_PATH/zipkin-cpp-opentracing-$ZIPKIN_CPP_VERSION" - -cat < export.map -{ - global: - OpenTracingMakeTracerFactory; - local: *; -}; -EOF - -mkdir .build -cd .build - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=OFF \ - -DBUILD_PLUGIN=ON \ - -DBUILD_TESTING=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ - .. - -make -make install - -# build msgpack lib -cd "$BUILD_PATH/msgpack-c-cpp-$MSGPACK_VERSION" - -mkdir .build -cd .build -cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=OFF \ - -DMSGPACK_BUILD_EXAMPLES=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ - .. - -make -make install - -# build datadog lib -cd "$BUILD_PATH/dd-opentracing-cpp-$DATADOG_CPP_VERSION" - -mkdir .build -cd .build - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTING=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true \ - .. - -make -make install - # Get Brotli source and deps cd "$BUILD_PATH" git clone --depth=100 https://github.com/google/ngx_brotli.git cd ngx_brotli -# https://github.com/google/ngx_brotli/issues/156 -git reset --hard 63ca02abdcf79c9e788d2eedcc388d2335902e52 +git reset --hard a71f9312c2deb28875acc7bacfdd5695a111aa53 git submodule init git submodule update @@ -527,17 +376,13 @@ mv rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example rules/REQUEST-900-E mv rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf cd .. -# OWASP CRS v3 rules +# OWASP CRS v4 rules echo " Include /etc/nginx/owasp-modsecurity-crs/crs-setup.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf -Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-903.9001-DRUPAL-EXCLUSION-RULES.conf -Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-905-COMMON-EXCEPTIONS.conf -Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-910-IP-REPUTATION.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-911-METHOD-ENFORCEMENT.conf -Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-912-DOS-PROTECTION.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-913-SCANNER-DETECTION.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-921-PROTOCOL-ATTACK.conf @@ -546,7 +391,7 @@ Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LF Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-931-APPLICATION-ATTACK-RFI.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-933-APPLICATION-ATTACK-PHP.conf -Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-934-APPLICATION-ATTACK-NODEJS.conf +Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-934-APPLICATION-ATTACK-GENERIC.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf Include /etc/nginx/owasp-modsecurity-crs/rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf @@ -557,11 +402,27 @@ Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-951-DATA-LEAKAGES-SQL.co Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf +Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-955-WEB-SHELLS.conf Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-959-BLOCKING-EVALUATION.conf Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-980-CORRELATION.conf Include /etc/nginx/owasp-modsecurity-crs/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf " > /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf +# NGINX compiles a small test program to check if an added module works as expected. +# +# ModSecurity-nginx provides 'printf("hello");' as a test, but newer versions of GCC, +# as included in Alpine 3.21, do not allow implicit declaration of function 'printf': +# +# objs/autotest.c:7:5: error: implicit declaration of function 'printf' [-Wimplicit-function-declaration] +# +# For this reason we replace 'printf("hello");' by 'msc_init();', which is always available. +# +# This fix is taken from a PR, that has been proposed to the ModSecurity-nginx project: +# +# https://github.com/owasp-modsecurity/ModSecurity-nginx/pull/275 +# +sed -i "s/ngx_feature_test='printf(\"hello\");'/ngx_feature_test='msc_init();'/" $BUILD_PATH/ModSecurity-nginx/config + # build nginx cd "$BUILD_PATH/nginx-$NGINX_VERSION" @@ -583,10 +444,10 @@ WITH_FLAGS="--with-debug \ --with-http_realip_module \ --with-http_auth_request_module \ --with-http_addition_module \ - --with-http_geoip_module \ --with-http_gzip_static_module \ --with-http_sub_module \ --with-http_v2_module \ + --with-http_v3_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ @@ -606,10 +467,9 @@ CC_OPT="-g -O2 -fPIE -fstack-protector-strong \ --param=ssp-buffer-size=4 \ -DTCP_FASTOPEN=23 \ -fPIC \ - -I$HUNTER_INSTALL_DIR/include \ -Wno-cast-function-type" -LD_OPT="-fPIE -fPIC -pie -Wl,-z,relro -Wl,-z,now -L$HUNTER_INSTALL_DIR/lib" +LD_OPT="-fPIE -fPIC -pie -Wl,-z,relro -Wl,-z,now" if [[ ${ARCH} != "aarch64" ]]; then WITH_FLAGS+=" --with-file-aio" @@ -620,17 +480,15 @@ if [[ ${ARCH} == "x86_64" ]]; then fi WITH_MODULES=" \ - --add-module=$BUILD_PATH/ngx_devel_kit-$NDK_VERSION \ - --add-module=$BUILD_PATH/set-misc-nginx-module-$SETMISC_VERSION \ - --add-module=$BUILD_PATH/headers-more-nginx-module-$MORE_HEADERS_VERSION \ - --add-module=$BUILD_PATH/ngx_http_substitutions_filter_module-$NGINX_SUBSTITUTIONS \ - --add-module=$BUILD_PATH/lua-nginx-module-$LUA_NGX_VERSION \ - --add-module=$BUILD_PATH/stream-lua-nginx-module-$LUA_STREAM_NGX_VERSION \ - --add-module=$BUILD_PATH/lua-upstream-nginx-module-$LUA_UPSTREAM_VERSION \ - --add-dynamic-module=$BUILD_PATH/nginx-http-auth-digest-$NGINX_DIGEST_AUTH \ - --add-dynamic-module=$BUILD_PATH/nginx-opentracing-$NGINX_OPENTRACING_VERSION/opentracing \ - --add-dynamic-module=$BUILD_PATH/ModSecurity-nginx-$MODSECURITY_VERSION \ - --add-dynamic-module=$BUILD_PATH/ngx_http_geoip2_module-${GEOIP2_VERSION} \ + --add-module=$BUILD_PATH/ngx_devel_kit \ + --add-module=$BUILD_PATH/set-misc-nginx-module \ + --add-module=$BUILD_PATH/headers-more-nginx-module \ + --add-module=$BUILD_PATH/lua-nginx-module \ + --add-module=$BUILD_PATH/stream-lua-nginx-module \ + --add-module=$BUILD_PATH/lua-upstream-nginx-module \ + --add-dynamic-module=$BUILD_PATH/nginx-http-auth-digest \ + --add-dynamic-module=$BUILD_PATH/ModSecurity-nginx \ + --add-dynamic-module=$BUILD_PATH/ngx_http_geoip2_module \ --add-dynamic-module=$BUILD_PATH/ngx_brotli" ./configure \ @@ -662,56 +520,81 @@ make make modules make install -cd "$BUILD_PATH/lua-resty-core-$LUA_RESTY_CORE" +# Check for recent changes: https://github.com/open-telemetry/opentelemetry-cpp-contrib/compare/8933841f0a7f8737f61404cf0a64acf6b079c8a5...main +export OPENTELEMETRY_CONTRIB_COMMIT=8933841f0a7f8737f61404cf0a64acf6b079c8a5 +cd "$BUILD_PATH" + +git clone https://github.com/open-telemetry/opentelemetry-cpp-contrib.git opentelemetry-cpp-contrib-${OPENTELEMETRY_CONTRIB_COMMIT} + +cd ${BUILD_PATH}/opentelemetry-cpp-contrib-${OPENTELEMETRY_CONTRIB_COMMIT} +git reset --hard ${OPENTELEMETRY_CONTRIB_COMMIT} + +export OTEL_TEMP_INSTALL=/tmp/otel +mkdir -p ${OTEL_TEMP_INSTALL} + +cd ${BUILD_PATH}/opentelemetry-cpp-contrib-${OPENTELEMETRY_CONTRIB_COMMIT}/instrumentation/nginx +mkdir -p build +cd build +cmake -DCMAKE_BUILD_TYPE=Release \ + -G Ninja \ + -DCMAKE_CXX_STANDARD=17 \ + -DCMAKE_INSTALL_PREFIX=${OTEL_TEMP_INSTALL} \ + -DBUILD_SHARED_LIBS=ON \ + -DNGINX_VERSION=${NGINX_VERSION} \ + .. +cmake --build . -j ${CORES} --target install + +mkdir -p /etc/nginx/modules +cp ${OTEL_TEMP_INSTALL}/otel_ngx_module.so /etc/nginx/modules/otel_ngx_module.so + + +cd "$BUILD_PATH/lua-resty-core" make install -cd "$BUILD_PATH/lua-resty-balancer-$LUA_RESTY_BALANCER" +cd "$BUILD_PATH/lua-resty-balancer" make all make install export LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1 ln -s $LUA_INCLUDE_DIR /usr/include/lua5.1 -cd "$BUILD_PATH/lua-cjson-$LUA_CJSON_VERSION" +cd "$BUILD_PATH/lua-cjson" make all make install -cd "$BUILD_PATH/lua-resty-cookie-$LUA_RESTY_COOKIE_VERSION" +cd "$BUILD_PATH/lua-resty-cookie" make all make install -cd "$BUILD_PATH/lua-resty-lrucache-$LUA_RESTY_CACHE" +cd "$BUILD_PATH/lua-resty-lrucache" make install -cd "$BUILD_PATH/lua-resty-dns-$LUA_RESTY_DNS" +cd "$BUILD_PATH/lua-resty-dns" make install -cd "$BUILD_PATH/lua-resty-lock-$LUA_RESTY_LOCK" +cd "$BUILD_PATH/lua-resty-lock" make install # required for OCSP verification -cd "$BUILD_PATH/lua-resty-http-$LUA_RESTY_HTTP" +cd "$BUILD_PATH/lua-resty-http" make install -cd "$BUILD_PATH/lua-resty-upload-$LUA_RESTY_UPLOAD_VERSION" +cd "$BUILD_PATH/lua-resty-upload" make install -cd "$BUILD_PATH/lua-resty-string-$LUA_RESTY_STRING_VERSION" +cd "$BUILD_PATH/lua-resty-string" make install -cd "$BUILD_PATH/lua-resty-memcached-$LUA_RESTY_MEMCACHED_VERSION" +cd "$BUILD_PATH/lua-resty-memcached" make install -cd "$BUILD_PATH/lua-resty-redis-$LUA_RESTY_REDIS_VERSION" +cd "$BUILD_PATH/lua-resty-redis" make install -cd "$BUILD_PATH/lua-resty-ipmatcher-$LUA_RESTY_IPMATCHER_VERSION" +cd "$BUILD_PATH/lua-resty-ipmatcher" INST_LUADIR=/usr/local/lib/lua make install -cd "$BUILD_PATH/lua-resty-global-throttle-$LUA_RESTY_GLOBAL_THROTTLE_VERSION" -make install - -cd "$BUILD_PATH/mimalloc-$MIMALOC_VERSION" +cd "$BUILD_PATH/mimalloc" mkdir -p out/release cd out/release @@ -735,11 +618,11 @@ adduser -S -D -H -u 101 -h /usr/local/nginx -s /sbin/nologin -G www-data -g www- for dir in "${writeDirs[@]}"; do mkdir -p ${dir}; - chown -R www-data.www-data ${dir}; + chown -R www-data:www-data ${dir}; done rm -rf /etc/nginx/owasp-modsecurity-crs/.git -rm -rf /etc/nginx/owasp-modsecurity-crs/util/regression-tests +rm -rf /etc/nginx/owasp-modsecurity-crs/tests # remove .a files find /usr/local -name "*.a" -print | xargs /bin/rm diff --git a/images/nginx/rootfs/etc/nginx/geoip/GeoIP.dat b/images/nginx/rootfs/etc/nginx/geoip/GeoIP.dat deleted file mode 100644 index be8b031f7..000000000 Binary files a/images/nginx/rootfs/etc/nginx/geoip/GeoIP.dat and /dev/null differ diff --git a/images/nginx/rootfs/etc/nginx/geoip/GeoIPASNum.dat b/images/nginx/rootfs/etc/nginx/geoip/GeoIPASNum.dat deleted file mode 100644 index 85c2cb329..000000000 Binary files a/images/nginx/rootfs/etc/nginx/geoip/GeoIPASNum.dat and /dev/null differ diff --git a/images/nginx/rootfs/etc/nginx/geoip/GeoLiteCity.dat b/images/nginx/rootfs/etc/nginx/geoip/GeoLiteCity.dat deleted file mode 100644 index 1adb8c3c4..000000000 Binary files a/images/nginx/rootfs/etc/nginx/geoip/GeoLiteCity.dat and /dev/null differ diff --git a/images/nginx/rootfs/patches/drop-alias-root.patch b/images/nginx/rootfs/patches/00_drop-alias-root.patch similarity index 100% rename from images/nginx/rootfs/patches/drop-alias-root.patch rename to images/nginx/rootfs/patches/00_drop-alias-root.patch diff --git a/images/nginx/rootfs/patches/01_nginx-1.27.1-win32_max_err_str.patch b/images/nginx/rootfs/patches/01_nginx-1.27.1-win32_max_err_str.patch new file mode 100644 index 000000000..8c3ba2791 --- /dev/null +++ b/images/nginx/rootfs/patches/01_nginx-1.27.1-win32_max_err_str.patch @@ -0,0 +1,15 @@ +diff --git a/src/os/win32/ngx_event_log.c b/src/os/win32/ngx_event_log.c +index e11ed1e8..dce8eddd 100644 +--- a/src/os/win32/ngx_event_log.c ++++ b/src/os/win32/ngx_event_log.c +@@ -8,7 +8,9 @@ + #include + + +-#define NGX_MAX_ERROR_STR 2048 ++#ifndef NGX_MAX_ERROR_STR ++#define NGX_MAX_ERROR_STR 4096 ++#endif + + + void ngx_cdecl diff --git a/images/nginx/rootfs/patches/02_nginx-1.27.1-stream_balancer_export.patch b/images/nginx/rootfs/patches/02_nginx-1.27.1-stream_balancer_export.patch new file mode 100644 index 000000000..f56bc5257 --- /dev/null +++ b/images/nginx/rootfs/patches/02_nginx-1.27.1-stream_balancer_export.patch @@ -0,0 +1,53 @@ +diff --git a/src/stream/ngx_stream_upstream_round_robin.c b/src/stream/ngx_stream_upstream_round_robin.c +index 526de3a..b531ce1 100644 +--- a/src/stream/ngx_stream_upstream_round_robin.c ++++ b/src/stream/ngx_stream_upstream_round_robin.c +@@ -21,10 +21,6 @@ static void ngx_stream_upstream_notify_round_robin_peer( + + #if (NGX_STREAM_SSL) + +-static ngx_int_t ngx_stream_upstream_set_round_robin_peer_session( +- ngx_peer_connection_t *pc, void *data); +-static void ngx_stream_upstream_save_round_robin_peer_session( +- ngx_peer_connection_t *pc, void *data); + static ngx_int_t ngx_stream_upstream_empty_set_session( + ngx_peer_connection_t *pc, void *data); + static void ngx_stream_upstream_empty_save_session(ngx_peer_connection_t *pc, +@@ -690,7 +686,7 @@ ngx_stream_upstream_notify_round_robin_peer(ngx_peer_connection_t *pc, + + #if (NGX_STREAM_SSL) + +-static ngx_int_t ++ngx_int_t + ngx_stream_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, + void *data) + { +@@ -756,7 +752,7 @@ ngx_stream_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, + } + + +-static void ++void + ngx_stream_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, + void *data) + { +diff --git a/src/stream/ngx_stream_upstream_round_robin.h b/src/stream/ngx_stream_upstream_round_robin.h +index 35d9fce..75f3e31 100644 +--- a/src/stream/ngx_stream_upstream_round_robin.h ++++ b/src/stream/ngx_stream_upstream_round_robin.h +@@ -142,5 +142,15 @@ ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, + void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, + void *data, ngx_uint_t state); + ++#if (NGX_STREAM_SSL) ++ngx_int_t ngx_stream_upstream_set_round_robin_peer_session( ++ ngx_peer_connection_t *pc, void *data); ++void ngx_stream_upstream_save_round_robin_peer_session( ++ ngx_peer_connection_t *pc, void *data); ++#endif ++ ++ ++#define HAVE_NGX_STREAM_BALANCER_EXPORT_PATCH 1 ++ + + #endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-stream_proxy_get_next_upstream_tries.patch b/images/nginx/rootfs/patches/03_nginx-1.27.1-stream_proxy_get_next_upstream_tries.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-stream_proxy_get_next_upstream_tries.patch rename to images/nginx/rootfs/patches/03_nginx-1.27.1-stream_proxy_get_next_upstream_tries.patch diff --git a/images/nginx/rootfs/patches/04_nginx-1.27.1-stream_proxy_timeout_fields.patch b/images/nginx/rootfs/patches/04_nginx-1.27.1-stream_proxy_timeout_fields.patch new file mode 100644 index 000000000..e205abb8b --- /dev/null +++ b/images/nginx/rootfs/patches/04_nginx-1.27.1-stream_proxy_timeout_fields.patch @@ -0,0 +1,178 @@ +diff -u -r -p -Naur nginx-1.27.1/src/stream/ngx_stream.h nginx-1.27.1-patched/src/stream/ngx_stream.h +--- nginx-1.27.1/src/stream/ngx_stream.h 2021-11-04 21:27:55.288708527 +0800 ++++ nginx-1.27.1-patched/src/stream/ngx_stream.h 2021-11-04 21:28:50.768035209 +0800 +@@ -254,6 +254,15 @@ typedef struct { + } ngx_stream_module_t; + + ++typedef struct { ++ ngx_msec_t connect_timeout; ++ ngx_msec_t timeout; ++} ngx_stream_proxy_ctx_t; ++ ++ ++#define NGX_STREAM_HAVE_PROXY_TIMEOUT_FIELDS_PATCH 1 ++ ++ + #define NGX_STREAM_MODULE 0x4d525453 /* "STRM" */ + + #define NGX_STREAM_MAIN_CONF 0x02000000 +@@ -307,6 +316,7 @@ void ngx_stream_finalize_session(ngx_str + extern ngx_module_t ngx_stream_module; + extern ngx_uint_t ngx_stream_max_module; + extern ngx_module_t ngx_stream_core_module; ++extern ngx_module_t ngx_stream_proxy_module; + + + typedef ngx_int_t (*ngx_stream_filter_pt)(ngx_stream_session_t *s, +diff -u -r -p -Naur nginx-1.27.1/src/stream/ngx_stream_proxy_module.c nginx-1.27.1-patched/src/stream/ngx_stream_proxy_module.c +--- nginx-1.27.1/src/stream/ngx_stream_proxy_module.c 2021-11-04 21:27:55.289708533 +0800 ++++ nginx-1.27.1-patched/src/stream/ngx_stream_proxy_module.c 2021-11-04 21:37:03.578936990 +0800 +@@ -400,6 +400,7 @@ ngx_stream_proxy_handler(ngx_stream_sess + ngx_stream_proxy_srv_conf_t *pscf; + ngx_stream_upstream_srv_conf_t *uscf, **uscfp; + ngx_stream_upstream_main_conf_t *umcf; ++ ngx_stream_proxy_ctx_t *pctx; + + c = s->connection; + +@@ -408,6 +409,17 @@ ngx_stream_proxy_handler(ngx_stream_sess + ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, + "proxy connection handler"); + ++ pctx = ngx_palloc(c->pool, sizeof(ngx_stream_proxy_ctx_t)); ++ if (pctx == NULL) { ++ ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); ++ return; ++ } ++ ++ pctx->connect_timeout = pscf->connect_timeout; ++ pctx->timeout = pscf->timeout; ++ ++ ngx_stream_set_ctx(s, pctx, ngx_stream_proxy_module); ++ + u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t)); + if (u == NULL) { + ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); +@@ -699,6 +711,7 @@ ngx_stream_proxy_connect(ngx_stream_sess + ngx_connection_t *c, *pc; + ngx_stream_upstream_t *u; + ngx_stream_proxy_srv_conf_t *pscf; ++ ngx_stream_proxy_ctx_t *ctx; + + c = s->connection; + +@@ -706,6 +719,8 @@ ngx_stream_proxy_connect(ngx_stream_sess + + pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); + ++ ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); ++ + u = s->upstream; + + u->connected = 0; +@@ -774,7 +789,7 @@ ngx_stream_proxy_connect(ngx_stream_sess + pc->read->handler = ngx_stream_proxy_connect_handler; + pc->write->handler = ngx_stream_proxy_connect_handler; + +- ngx_add_timer(pc->write, pscf->connect_timeout); ++ ngx_add_timer(pc->write, ctx->connect_timeout); + } + + +@@ -957,12 +957,14 @@ ngx_stream_proxy_init_upstream(ngx_stream_session_t *s) + static ngx_int_t + ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s) + { +- u_char *p; +- ssize_t n, size; +- ngx_connection_t *c, *pc; +- ngx_stream_upstream_t *u; +- ngx_stream_proxy_srv_conf_t *pscf; +- u_char buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER]; ++ u_char *p; ++ u_char buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER]; ++ ssize_t n, size; ++ ngx_connection_t *c, *pc; ++ ngx_stream_upstream_t *u; ++ ngx_stream_proxy_ctx_t *ctx; ++ ++ ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); + + c = s->connection; + +@@ -976,9 +993,7 @@ ngx_stream_proxy_send_proxy_protocol(ngx + return NGX_ERROR; + } + +- pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); +- +- ngx_add_timer(pc->write, pscf->timeout); ++ ngx_add_timer(pc->write, ctx->timeout); + + pc->write->handler = ngx_stream_proxy_connect_handler; + +@@ -1053,6 +1068,9 @@ ngx_stream_proxy_ssl_init_connection(ngx + ngx_connection_t *pc; + ngx_stream_upstream_t *u; + ngx_stream_proxy_srv_conf_t *pscf; ++ ngx_stream_proxy_ctx_t *ctx; ++ ++ ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); + + u = s->upstream; + +@@ -1099,7 +1117,7 @@ ngx_stream_proxy_ssl_init_connection(ngx + if (rc == NGX_AGAIN) { + + if (!pc->write->timer_set) { +- ngx_add_timer(pc->write, pscf->connect_timeout); ++ ngx_add_timer(pc->write, ctx->connect_timeout); + } + + pc->ssl->handler = ngx_stream_proxy_ssl_handshake; +@@ -1408,6 +1426,7 @@ ngx_stream_proxy_process_connection(ngx_ + ngx_stream_session_t *s; + ngx_stream_upstream_t *u; + ngx_stream_proxy_srv_conf_t *pscf; ++ ngx_stream_proxy_ctx_t *ctx; + + c = ev->data; + s = c->data; +@@ -1419,6 +1438,8 @@ ngx_stream_proxy_process_connection(ngx_ + return; + } + ++ ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); ++ + c = s->connection; + pc = u->peer.connection; + +@@ -1438,7 +1459,7 @@ ngx_stream_proxy_process_connection(ngx_ + } + + if (u->connected && !c->read->delayed && !pc->read->delayed) { +- ngx_add_timer(c->write, pscf->timeout); ++ ngx_add_timer(c->write, ctx->timeout); + } + + return; +@@ -1600,6 +1621,9 @@ ngx_stream_proxy_process(ngx_stream_sess + ngx_log_handler_pt handler; + ngx_stream_upstream_t *u; + ngx_stream_proxy_srv_conf_t *pscf; ++ ngx_stream_proxy_ctx_t *ctx; ++ ++ ctx = ngx_stream_get_module_ctx(s, ngx_stream_proxy_module); + + u = s->upstream; + +@@ -1807,7 +1831,7 @@ ngx_stream_proxy_process(ngx_stream_sess + } + + if (!c->read->delayed && !pc->read->delayed) { +- ngx_add_timer(c->write, pscf->timeout); ++ ngx_add_timer(c->write, ctx->timeout); + + } else if (c->write->timer_set) { + ngx_del_timer(c->write); diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-stream_ssl_preread_no_skip.patch b/images/nginx/rootfs/patches/05_nginx-1.27.1-stream_ssl_preread_no_skip.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-stream_ssl_preread_no_skip.patch rename to images/nginx/rootfs/patches/05_nginx-1.27.1-stream_ssl_preread_no_skip.patch diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-resolver_conf_parsing.patch b/images/nginx/rootfs/patches/06_nginx-1.27.1-resolver_conf_parsing.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-resolver_conf_parsing.patch rename to images/nginx/rootfs/patches/06_nginx-1.27.1-resolver_conf_parsing.patch diff --git a/images/nginx/rootfs/patches/07_nginx-1.27.1-daemon_destroy_pool.patch b/images/nginx/rootfs/patches/07_nginx-1.27.1-daemon_destroy_pool.patch new file mode 100644 index 000000000..5690b88f0 --- /dev/null +++ b/images/nginx/rootfs/patches/07_nginx-1.27.1-daemon_destroy_pool.patch @@ -0,0 +1,12 @@ +diff --git a/src/os/unix/ngx_daemon.c b/src/os/unix/ngx_daemon.c +index ab672110..f259af31 100644 +--- a/src/os/unix/ngx_daemon.c ++++ b/src/os/unix/ngx_daemon.c +@@ -23,6 +23,8 @@ ngx_daemon(ngx_log_t *log) + break; + + default: ++ /* just to make it ASAN or Valgrind clean */ ++ ngx_destroy_pool(ngx_cycle->pool); + exit(0); + } diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-init_cycle_pool_release.patch b/images/nginx/rootfs/patches/08_nginx-1.27.1-init_cycle_pool_release.patch similarity index 65% rename from images/nginx/rootfs/patches/nginx-1.21.4-init_cycle_pool_release.patch rename to images/nginx/rootfs/patches/08_nginx-1.27.1-init_cycle_pool_release.patch index 9cfa4f7cb..4a26b92c5 100644 --- a/images/nginx/rootfs/patches/nginx-1.21.4-init_cycle_pool_release.patch +++ b/images/nginx/rootfs/patches/08_nginx-1.27.1-init_cycle_pool_release.patch @@ -1,6 +1,6 @@ -diff -rup nginx-1.21.4/src/core/nginx.c nginx-1.21.4-patched/src/core/nginx.c ---- nginx-1.21.4/src/core/nginx.c 2017-12-17 00:00:38.136470108 -0800 -+++ nginx-1.21.4-patched/src/core/nginx.c 2017-12-16 23:59:51.680958322 -0800 +diff -rup nginx-1.27.1/src/core/nginx.c nginx-1.27.1-patched/src/core/nginx.c +--- nginx-1.27.1/src/core/nginx.c 2017-12-17 00:00:38.136470108 -0800 ++++ nginx-1.27.1-patched/src/core/nginx.c 2017-12-16 23:59:51.680958322 -0800 @@ -186,6 +186,7 @@ static u_char *ngx_prefix; static u_char *ngx_conf_file; static u_char *ngx_conf_params; @@ -18,9 +18,9 @@ diff -rup nginx-1.21.4/src/core/nginx.c nginx-1.21.4-patched/src/core/nginx.c if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) { return 1; } -diff -rup nginx-1.21.4/src/core/ngx_core.h nginx-1.21.4-patched/src/core/ngx_core.h ---- nginx-1.21.4/src/core/ngx_core.h 2017-10-10 08:22:51.000000000 -0700 -+++ nginx-1.21.4-patched/src/core/ngx_core.h 2017-12-16 23:59:51.679958370 -0800 +diff -rup nginx-1.27.1/src/core/ngx_core.h nginx-1.27.1-patched/src/core/ngx_core.h +--- nginx-1.27.1/src/core/ngx_core.h 2017-10-10 08:22:51.000000000 -0700 ++++ nginx-1.27.1-patched/src/core/ngx_core.h 2017-12-16 23:59:51.679958370 -0800 @@ -108,4 +108,6 @@ void ngx_cpuinfo(void); #define NGX_DISABLE_SYMLINKS_NOTOWNER 2 #endif @@ -28,9 +28,9 @@ diff -rup nginx-1.21.4/src/core/ngx_core.h nginx-1.21.4-patched/src/core/ngx_cor +extern ngx_pool_t *saved_init_cycle_pool; + #endif /* _NGX_CORE_H_INCLUDED_ */ -diff -rup nginx-1.21.4/src/core/ngx_cycle.c nginx-1.21.4-patched/src/core/ngx_cycle.c ---- nginx-1.21.4/src/core/ngx_cycle.c 2017-10-10 08:22:51.000000000 -0700 -+++ nginx-1.21.4-patched/src/core/ngx_cycle.c 2017-12-16 23:59:51.678958419 -0800 +diff -rup nginx-1.27.1/src/core/ngx_cycle.c nginx-1.27.1-patched/src/core/ngx_cycle.c +--- nginx-1.27.1/src/core/ngx_cycle.c 2017-10-10 08:22:51.000000000 -0700 ++++ nginx-1.27.1-patched/src/core/ngx_cycle.c 2017-12-16 23:59:51.678958419 -0800 @@ -748,6 +748,10 @@ old_shm_zone_done: if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) { @@ -42,9 +42,9 @@ diff -rup nginx-1.21.4/src/core/ngx_cycle.c nginx-1.21.4-patched/src/core/ngx_cy ngx_destroy_pool(old_cycle->pool); cycle->old_cycle = NULL; -diff -rup nginx-1.21.4/src/os/unix/ngx_process_cycle.c nginx-1.21.4-patched/src/os/unix/ngx_process_cycle.c ---- nginx-1.21.4/src/os/unix/ngx_process_cycle.c 2017-12-17 00:00:38.142469762 -0800 -+++ nginx-1.21.4-patched/src/os/unix/ngx_process_cycle.c 2017-12-16 23:59:51.691957791 -0800 +diff -rup nginx-1.27.1/src/os/unix/ngx_process_cycle.c nginx-1.27.1-patched/src/os/unix/ngx_process_cycle.c +--- nginx-1.27.1/src/os/unix/ngx_process_cycle.c 2017-12-17 00:00:38.142469762 -0800 ++++ nginx-1.27.1-patched/src/os/unix/ngx_process_cycle.c 2017-12-16 23:59:51.691957791 -0800 @@ -687,6 +692,11 @@ ngx_master_process_exit(ngx_cycle_t *cyc ngx_exit_cycle.files_n = ngx_cycle->files_n; ngx_cycle = &ngx_exit_cycle; diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-balancer_status_code.patch b/images/nginx/rootfs/patches/09_nginx-1.27.1-balancer_status_code.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-balancer_status_code.patch rename to images/nginx/rootfs/patches/09_nginx-1.27.1-balancer_status_code.patch diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-delayed_posted_events.patch b/images/nginx/rootfs/patches/10_nginx-1.27.1-delayed_posted_events.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-delayed_posted_events.patch rename to images/nginx/rootfs/patches/10_nginx-1.27.1-delayed_posted_events.patch diff --git a/images/nginx/rootfs/patches/11_nginx-1.27.1-privileged_agent_process.patch b/images/nginx/rootfs/patches/11_nginx-1.27.1-privileged_agent_process.patch new file mode 100644 index 000000000..164004eba --- /dev/null +++ b/images/nginx/rootfs/patches/11_nginx-1.27.1-privileged_agent_process.patch @@ -0,0 +1,203 @@ +diff --git a/src/core/nginx.c b/src/core/nginx.c +index 60f8fe7..4bd244b 100644 +--- a/src/core/nginx.c ++++ b/src/core/nginx.c +@@ -981,6 +981,7 @@ ngx_core_module_create_conf(ngx_cycle_t *cycle) + + ccf->daemon = NGX_CONF_UNSET; + ccf->master = NGX_CONF_UNSET; ++ ccf->privileged_agent = NGX_CONF_UNSET; + ccf->timer_resolution = NGX_CONF_UNSET_MSEC; + + ccf->worker_processes = NGX_CONF_UNSET; +@@ -1009,6 +1010,7 @@ ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf) + + ngx_conf_init_value(ccf->daemon, 1); + ngx_conf_init_value(ccf->master, 1); ++ ngx_conf_init_value(ccf->privileged_agent, 0); + ngx_conf_init_msec_value(ccf->timer_resolution, 0); + + ngx_conf_init_value(ccf->worker_processes, 1); +diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h +index c51b7ff..3261f90 100644 +--- a/src/core/ngx_cycle.h ++++ b/src/core/ngx_cycle.h +@@ -22,6 +22,9 @@ + #define NGX_DEBUG_POINTS_ABORT 2 + + ++#define HAVE_PRIVILEGED_PROCESS_PATCH 1 ++ ++ + typedef struct ngx_shm_zone_s ngx_shm_zone_t; + + typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data); +@@ -81,6 +84,7 @@ struct ngx_cycle_s { + typedef struct { + ngx_flag_t daemon; + ngx_flag_t master; ++ ngx_flag_t privileged_agent; + + ngx_msec_t timer_resolution; + +diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c +index 7cee1c5..c4f70d6 100644 +--- a/src/os/unix/ngx_process_cycle.c ++++ b/src/os/unix/ngx_process_cycle.c +@@ -15,6 +15,8 @@ static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, + ngx_int_t type); + static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle, + ngx_uint_t respawn); ++static void ngx_start_privileged_agent_processes(ngx_cycle_t *cycle, ++ ngx_uint_t respawn); + static void ngx_pass_open_channel(ngx_cycle_t *cycle); + static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); + static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle); +@@ -24,6 +26,7 @@ static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker); + static void ngx_worker_process_exit(ngx_cycle_t *cycle); + static void ngx_channel_handler(ngx_event_t *ev); + static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data); ++static void ngx_privileged_agent_process_cycle(ngx_cycle_t *cycle, void *data); + static void ngx_cache_manager_process_handler(ngx_event_t *ev); + static void ngx_cache_loader_process_handler(ngx_event_t *ev); + +@@ -51,6 +54,8 @@ sig_atomic_t ngx_noaccept; + ngx_uint_t ngx_noaccepting; + ngx_uint_t ngx_restart; + ++ngx_uint_t ngx_is_privileged_agent; ++ + + static u_char master_process[] = "master process"; + +@@ -130,6 +135,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_RESPAWN); + ngx_start_cache_manager_processes(cycle, 0); ++ ngx_start_privileged_agent_processes(cycle, 0); + + ngx_new_binary = 0; + delay = 0; +@@ -215,6 +221,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_RESPAWN); + ngx_start_cache_manager_processes(cycle, 0); ++ ngx_start_privileged_agent_processes(cycle, 0); + ngx_noaccepting = 0; + + continue; +@@ -234,6 +241,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_JUST_RESPAWN); + ngx_start_cache_manager_processes(cycle, 1); ++ ngx_start_privileged_agent_processes(cycle, 1); + + /* allow new processes to start */ + ngx_msleep(100); +@@ -248,6 +256,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) + ngx_start_worker_processes(cycle, ccf->worker_processes, + NGX_PROCESS_RESPAWN); + ngx_start_cache_manager_processes(cycle, 0); ++ ngx_start_privileged_agent_processes(cycle, 0); + live = 1; + } + +@@ -393,6 +431,26 @@ ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn) + + + static void ++ngx_start_privileged_agent_processes(ngx_cycle_t *cycle, ngx_uint_t respawn) ++{ ++ ngx_core_conf_t *ccf; ++ ++ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ++ ngx_core_module); ++ ++ if (!ccf->privileged_agent) { ++ return; ++ } ++ ++ ngx_spawn_process(cycle, ngx_privileged_agent_process_cycle, ++ "privileged agent process", "privileged agent process", ++ respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN); ++ ++ ngx_pass_open_channel(cycle); ++} ++ ++ ++static void + ngx_pass_open_channel(ngx_cycle_t *cycle) + { + ngx_int_t i; +@@ -794,7 +860,10 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker) + } + } + +- if (geteuid() == 0) { ++ /* ++ * privileged agent process has the same permission as master process ++ */ ++ if (!ngx_is_privileged_agent && geteuid() == 0) { + if (setgid(ccf->group) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "setgid(%d) failed", ccf->group); +@@ -1149,6 +1216,47 @@ ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data) + + + static void ++ngx_privileged_agent_process_cycle(ngx_cycle_t *cycle, void *data) ++{ ++ char *name = data; ++ ++ /* ++ * Set correct process type since closing listening Unix domain socket ++ * in a master process also removes the Unix domain socket file. ++ */ ++ ngx_process = NGX_PROCESS_HELPER; ++ ngx_is_privileged_agent = 1; ++ ++ ngx_close_listening_sockets(cycle); ++ ++ /* Set a moderate number of connections for a helper process. */ ++ cycle->connection_n = 512; ++ ++ ngx_worker_process_init(cycle, -1); ++ ++ ngx_use_accept_mutex = 0; ++ ++ ngx_setproctitle(name); ++ ++ for ( ;; ) { ++ ++ if (ngx_terminate || ngx_quit) { ++ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); ++ ngx_worker_process_exit(cycle); ++ } ++ ++ if (ngx_reopen) { ++ ngx_reopen = 0; ++ ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); ++ ngx_reopen_files(cycle, -1); ++ } ++ ++ ngx_process_events_and_timers(cycle); ++ } ++} ++ ++ ++static void + ngx_cache_manager_process_handler(ngx_event_t *ev) + { + time_t next, n; +diff --git a/src/os/unix/ngx_process_cycle.h b/src/os/unix/ngx_process_cycle.h +index 69495d5..5149396 100644 +--- a/src/os/unix/ngx_process_cycle.h ++++ b/src/os/unix/ngx_process_cycle.h +@@ -45,6 +45,7 @@ extern ngx_pid_t ngx_new_binary; + extern ngx_uint_t ngx_inherited; + extern ngx_uint_t ngx_daemonized; + extern ngx_uint_t ngx_exiting; ++extern ngx_uint_t ngx_is_privileged_agent; + + extern sig_atomic_t ngx_reap; + extern sig_atomic_t ngx_sigio; diff --git a/images/nginx/rootfs/patches/12_nginx-1.27.1-privileged_agent_process_connections.patch b/images/nginx/rootfs/patches/12_nginx-1.27.1-privileged_agent_process_connections.patch new file mode 100644 index 000000000..5c38929cf --- /dev/null +++ b/images/nginx/rootfs/patches/12_nginx-1.27.1-privileged_agent_process_connections.patch @@ -0,0 +1,73 @@ +diff --git a/src/core/nginx.c b/src/core/nginx.c +index 269ff84..48329bd 100644 +--- a/src/core/nginx.c ++++ b/src/core/nginx.c +@@ -1062,6 +1062,7 @@ ngx_core_module_create_conf(ngx_cycle_t *cycle) + ccf->daemon = NGX_CONF_UNSET; + ccf->master = NGX_CONF_UNSET; + ccf->privileged_agent = NGX_CONF_UNSET; ++ ccf->privileged_agent_connections = NGX_CONF_UNSET_UINT; + ccf->timer_resolution = NGX_CONF_UNSET_MSEC; + ccf->shutdown_timeout = NGX_CONF_UNSET_MSEC; + +@@ -1092,6 +1093,7 @@ ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf) + ngx_conf_init_value(ccf->daemon, 1); + ngx_conf_init_value(ccf->master, 1); + ngx_conf_init_value(ccf->privileged_agent, 0); ++ ngx_conf_init_uint_value(ccf->privileged_agent_connections, 512); + ngx_conf_init_msec_value(ccf->timer_resolution, 0); + ngx_conf_init_msec_value(ccf->shutdown_timeout, 0); + +diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h +index 6a9583e..4469390 100644 +--- a/src/core/ngx_cycle.h ++++ b/src/core/ngx_cycle.h +@@ -93,6 +93,7 @@ typedef struct { + ngx_flag_t daemon; + ngx_flag_t master; + ngx_flag_t privileged_agent; ++ ngx_uint_t privileged_agent_connections; + + ngx_msec_t timer_resolution; + ngx_msec_t shutdown_timeout; +diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c +index df25f9d..bd259c1 100644 +--- a/src/os/unix/ngx_process_cycle.c ++++ b/src/os/unix/ngx_process_cycle.c +@@ -1179,6 +1179,7 @@ static void + ngx_privileged_agent_process_cycle(ngx_cycle_t *cycle, void *data) + { + char *name = data; ++ ngx_core_conf_t *ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + + /* + * Set correct process type since closing listening Unix domain socket +@@ -1190,7 +1191,7 @@ ngx_privileged_agent_process_cycle(ngx_cycle_t *cycle, void *data) + ngx_close_listening_sockets(cycle); + + /* Set a moderate number of connections for a helper process. */ +- cycle->connection_n = 512; ++ cycle->connection_n = ccf->privileged_agent_connections; + + ngx_worker_process_init(cycle, -1); + +diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c +index df25f9d..bd259c1 100644 +--- a/src/os/unix/ngx_process_cycle.c ++++ b/src/os/unix/ngx_process_cycle.c +@@ -442,6 +442,15 @@ + return; + } + ++ /* 0 is an illegal value and may result in a core dump later */ ++ if (ccf->privileged_agent_connections == 0) { ++ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, ++ "%ui worker_connection is not enough, " ++ "privileged agent process cannot be spawned", ++ ccf->privileged_agent_connections); ++ return; ++ } ++ + ngx_spawn_process(cycle, ngx_privileged_agent_process_cycle, + "privileged agent process", "privileged agent process", + respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN); diff --git a/images/nginx/rootfs/patches/13_nginx-1.27.1-privileged_agent_process_thread_pool.patch b/images/nginx/rootfs/patches/13_nginx-1.27.1-privileged_agent_process_thread_pool.patch new file mode 100644 index 000000000..829f21460 --- /dev/null +++ b/images/nginx/rootfs/patches/13_nginx-1.27.1-privileged_agent_process_thread_pool.patch @@ -0,0 +1,12 @@ +--- a/src/core/ngx_thread_pool.c ++++ b/src/core/ngx_thread_pool.c +@@ -587,7 +587,8 @@ + ngx_thread_pool_conf_t *tcf; + + if (ngx_process != NGX_PROCESS_WORKER +- && ngx_process != NGX_PROCESS_SINGLE) ++ && ngx_process != NGX_PROCESS_SINGLE ++ && !ngx_is_privileged_agent) + { + return NGX_OK; + } diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-single_process_graceful_exit.patch b/images/nginx/rootfs/patches/14_nginx-1.27.1-single_process_graceful_exit.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-single_process_graceful_exit.patch rename to images/nginx/rootfs/patches/14_nginx-1.27.1-single_process_graceful_exit.patch diff --git a/images/nginx/rootfs/patches/15_nginx-1.27.1-intercept_error_log.patch b/images/nginx/rootfs/patches/15_nginx-1.27.1-intercept_error_log.patch new file mode 100644 index 000000000..5de769517 --- /dev/null +++ b/images/nginx/rootfs/patches/15_nginx-1.27.1-intercept_error_log.patch @@ -0,0 +1,60 @@ +diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h +index c51b7ff..4c335b9 100644 +--- a/src/core/ngx_cycle.h ++++ b/src/core/ngx_cycle.h +@@ -22,9 +22,14 @@ + #define NGX_DEBUG_POINTS_ABORT 2 + + ++#define HAVE_INTERCEPT_ERROR_LOG_PATCH ++ ++ + typedef struct ngx_shm_zone_s ngx_shm_zone_t; + + typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data); ++typedef ngx_int_t (*ngx_log_intercept_pt) (ngx_log_t *log, ngx_uint_t level, ++ u_char *buf, size_t len); + + struct ngx_shm_zone_s { + void *data; +@@ -75,6 +80,10 @@ struct ngx_cycle_s { + ngx_str_t prefix; + ngx_str_t lock_file; + ngx_str_t hostname; ++ ++ ngx_log_intercept_pt intercept_error_log_handler; ++ void *intercept_error_log_data; ++ unsigned entered_logger; /* :1 */ + }; + + +diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c +index 8e9408d..ed9b11b 100644 +--- a/src/core/ngx_log.c ++++ b/src/core/ngx_log.c +@@ -112,6 +112,8 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, + ngx_uint_t wrote_stderr, debug_connection; + u_char errstr[NGX_MAX_ERROR_STR]; + ++ ngx_log_intercept_pt log_intercept = NULL; ++ + last = errstr + NGX_MAX_ERROR_STR; + + p = ngx_cpymem(errstr, ngx_cached_err_log_time.data, +@@ -153,6 +155,16 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, + p = last - NGX_LINEFEED_SIZE; + } + ++ if (ngx_cycle) { ++ log_intercept = ngx_cycle->intercept_error_log_handler; ++ } ++ ++ if (log_intercept && !ngx_cycle->entered_logger) { ++ ngx_cycle->entered_logger = 1; ++ log_intercept(log, level, errstr, p - errstr); ++ ngx_cycle->entered_logger = 0; ++ } ++ + ngx_linefeed(p); + + wrote_stderr = 0; diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-upstream_pipelining.patch b/images/nginx/rootfs/patches/16_nginx-1.27.1-upstream_pipelining.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-upstream_pipelining.patch rename to images/nginx/rootfs/patches/16_nginx-1.27.1-upstream_pipelining.patch diff --git a/images/nginx/rootfs/patches/17_nginx-1.27.1-no_error_pages.patch b/images/nginx/rootfs/patches/17_nginx-1.27.1-no_error_pages.patch new file mode 100644 index 000000000..593fcefd6 --- /dev/null +++ b/images/nginx/rootfs/patches/17_nginx-1.27.1-no_error_pages.patch @@ -0,0 +1,91 @@ +diff -upr nginx-1.27.1/src/http/ngx_http_core_module.c nginx-1.27.1-patched/src/http/ngx_http_core_module.c +--- nginx-1.27.1/src/http/ngx_http_core_module.c 2017-08-31 18:14:41.000000000 -0700 ++++ nginx-1.27.1-patched/src/http/ngx_http_core_module.c 2017-08-31 18:21:31.638098196 -0700 +@@ -64,6 +64,8 @@ static char *ngx_http_core_directio(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); ++static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, ++ void *conf); + static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + static char *ngx_http_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, +@@ -671,6 +673,14 @@ static ngx_command_t ngx_http_core_commands[] = { + 0, + NULL }, + ++ { ngx_string("no_error_pages"), ++ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF ++ |NGX_CONF_NOARGS, ++ ngx_http_core_no_error_pages, ++ NGX_HTTP_LOC_CONF_OFFSET, ++ 0, ++ NULL }, ++ + { ngx_string("post_action"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF + |NGX_CONF_TAKE1, +@@ -3564,7 +3574,6 @@ ngx_http_core_create_loc_conf(ngx_conf_t *cf) + * clcf->types = NULL; + * clcf->default_type = { 0, NULL }; + * clcf->error_log = NULL; +- * clcf->error_pages = NULL; + * clcf->client_body_path = NULL; + * clcf->regex = NULL; + * clcf->exact_match = 0; +@@ -3574,6 +3583,7 @@ ngx_http_core_create_loc_conf(ngx_conf_t *cf) + * clcf->keepalive_disable = 0; + */ + ++ clcf->error_pages = NGX_CONF_UNSET_PTR; + clcf->client_max_body_size = NGX_CONF_UNSET; + clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE; + clcf->client_body_timeout = NGX_CONF_UNSET_MSEC; +@@ -3776,9 +3786,7 @@ ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) + } + } + +- if (conf->error_pages == NULL && prev->error_pages) { +- conf->error_pages = prev->error_pages; +- } ++ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL); + + ngx_conf_merge_str_value(conf->default_type, + prev->default_type, "text/plain"); +@@ -4815,6 +4823,10 @@ ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) + ngx_http_compile_complex_value_t ccv; + + if (clcf->error_pages == NULL) { ++ return "conflicts with \"no_error_pages\""; ++ } ++ ++ if (clcf->error_pages == NGX_CONF_UNSET_PTR) { + clcf->error_pages = ngx_array_create(cf->pool, 4, + sizeof(ngx_http_err_page_t)); + if (clcf->error_pages == NULL) { +@@ -4920,6 +4932,25 @@ ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) + } + + ++static char * ++ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) ++{ ++ ngx_http_core_loc_conf_t *clcf = conf; ++ ++ if (clcf->error_pages == NULL) { ++ return "is duplicate"; ++ } ++ ++ if (clcf->error_pages != NGX_CONF_UNSET_PTR) { ++ return "conflicts with \"error_page\""; ++ } ++ ++ clcf->error_pages = NULL; ++ ++ return NGX_CONF_OK; ++} ++ ++ + static char * + ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) + { diff --git a/images/nginx/rootfs/patches/18_nginx-1.27.1-no_Werror.patch b/images/nginx/rootfs/patches/18_nginx-1.27.1-no_Werror.patch new file mode 100644 index 000000000..d0aa7a31e --- /dev/null +++ b/images/nginx/rootfs/patches/18_nginx-1.27.1-no_Werror.patch @@ -0,0 +1,36 @@ +diff -urp nginx-1.27.1/auto/cc/clang nginx-1.27.1-patched/auto/cc/clang +--- nginx-1.27.1/auto/cc/clang 2014-03-04 03:39:24.000000000 -0800 ++++ nginx-1.27.1-patched/auto/cc/clang 2014-03-13 20:54:26.241413360 -0700 +@@ -89,7 +89,7 @@ CFLAGS="$CFLAGS -Wconditional-uninitiali + CFLAGS="$CFLAGS -Wno-unused-parameter" + + # stop on warning +-CFLAGS="$CFLAGS -Werror" ++#CFLAGS="$CFLAGS -Werror" + + # debug + CFLAGS="$CFLAGS -g" +diff -urp nginx-1.27.1/auto/cc/gcc nginx-1.27.1-patched/auto/cc/gcc +--- nginx-1.27.1/auto/cc/gcc 2014-03-04 03:39:24.000000000 -0800 ++++ nginx-1.27.1-patched/auto/cc/gcc 2014-03-13 20:54:13.301355329 -0700 +@@ -168,7 +168,7 @@ esac + + + # stop on warning +-CFLAGS="$CFLAGS -Werror" ++#CFLAGS="$CFLAGS -Werror" + + # debug + CFLAGS="$CFLAGS -g" +diff -urp nginx-1.27.1/auto/cc/icc nginx-1.27.1-patched/auto/cc/icc +--- nginx-1.27.1/auto/cc/icc 2014-03-04 03:39:24.000000000 -0800 ++++ nginx-1.27.1-patched/auto/cc/icc 2014-03-13 20:54:13.301355329 -0700 +@@ -115,7 +115,7 @@ case "$NGX_ICC_VER" in + esac + + # stop on warning +-CFLAGS="$CFLAGS -Werror" ++#CFLAGS="$CFLAGS -Werror" + + # debug + CFLAGS="$CFLAGS -g" diff --git a/images/nginx/rootfs/patches/19_nginx-1.27.1-log_escape_non_ascii.patch b/images/nginx/rootfs/patches/19_nginx-1.27.1-log_escape_non_ascii.patch new file mode 100644 index 000000000..bea6e52ee --- /dev/null +++ b/images/nginx/rootfs/patches/19_nginx-1.27.1-log_escape_non_ascii.patch @@ -0,0 +1,117 @@ +diff --git a/src/http/modules/ngx_http_log_module.c b/src/http/modules/ngx_http_log_module.c +index 917ed55f..b769dfd3 100644 +--- a/src/http/modules/ngx_http_log_module.c ++++ b/src/http/modules/ngx_http_log_module.c +@@ -79,6 +79,8 @@ typedef struct { + time_t open_file_cache_valid; + ngx_uint_t open_file_cache_min_uses; + ++ ngx_flag_t escape_non_ascii; ++ + ngx_uint_t off; /* unsigned off:1 */ + } ngx_http_log_loc_conf_t; + +@@ -131,7 +133,8 @@ static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r, + uintptr_t data); + static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, + ngx_http_log_op_t *op); +-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size); ++static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, ++ u_char *src, size_t size); + static size_t ngx_http_log_json_variable_getlen(ngx_http_request_t *r, + uintptr_t data); + static u_char *ngx_http_log_json_variable(ngx_http_request_t *r, u_char *buf, +@@ -177,6 +180,13 @@ static ngx_command_t ngx_http_log_commands[] = { + 0, + NULL }, + ++ { ngx_string("log_escape_non_ascii"), ++ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, ++ ngx_conf_set_flag_slot, ++ NGX_HTTP_LOC_CONF_OFFSET, ++ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii), ++ NULL }, ++ + ngx_null_command + }; + +@@ -935,6 +945,7 @@ static size_t + ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) + { + uintptr_t len; ++ ngx_http_log_loc_conf_t *lcf; + ngx_http_variable_value_t *value; + + value = ngx_http_get_indexed_variable(r, data); +@@ -943,7 +954,9 @@ ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) + return 1; + } + +- len = ngx_http_log_escape(NULL, value->data, value->len); ++ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); ++ ++ len = ngx_http_log_escape(lcf, NULL, value->data, value->len); + + value->escape = len ? 1 : 0; + +@@ -954,6 +967,7 @@ ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) + static u_char * + ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) + { ++ ngx_http_log_loc_conf_t *lcf; + ngx_http_variable_value_t *value; + + value = ngx_http_get_indexed_variable(r, op->data); +@@ -967,16 +981,18 @@ ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) + return ngx_cpymem(buf, value->data, value->len); + + } else { +- return (u_char *) ngx_http_log_escape(buf, value->data, value->len); ++ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); ++ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len); + } + } + + + static uintptr_t +-ngx_http_log_escape(u_char *dst, u_char *src, size_t size) ++ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src, ++ size_t size) + { +- ngx_uint_t n; +- static u_char hex[] = "0123456789ABCDEF"; ++ ngx_uint_t n; ++ static u_char hex[] = "0123456789ABCDEF"; + + static uint32_t escape[] = { + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ +@@ -996,6 +1012,12 @@ ngx_http_log_escape(u_char *dst, u_char *src, size_t size) + 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ + }; + ++ if (lcf->escape_non_ascii) { ++ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4); ++ ++ } else { ++ ngx_memzero(&escape[4], sizeof(uint32_t) * 4); ++ } + + if (dst == NULL) { + +@@ -1120,6 +1142,7 @@ ngx_http_log_create_loc_conf(ngx_conf_t *cf) + } + + conf->open_file_cache = NGX_CONF_UNSET_PTR; ++ conf->escape_non_ascii = NGX_CONF_UNSET; + + return conf; + } +@@ -1135,6 +1158,8 @@ ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) + ngx_http_log_fmt_t *fmt; + ngx_http_log_main_conf_t *lmcf; + ++ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1); ++ + if (conf->open_file_cache == NGX_CONF_UNSET_PTR) { + + conf->open_file_cache = prev->open_file_cache; diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-proxy_host_port_vars.patch b/images/nginx/rootfs/patches/20_nginx-1.27.1-proxy_host_port_vars.patch similarity index 87% rename from images/nginx/rootfs/patches/nginx-1.21.4-proxy_host_port_vars.patch rename to images/nginx/rootfs/patches/20_nginx-1.27.1-proxy_host_port_vars.patch index 01cebd65a..b81a299c8 100644 --- a/images/nginx/rootfs/patches/nginx-1.21.4-proxy_host_port_vars.patch +++ b/images/nginx/rootfs/patches/20_nginx-1.27.1-proxy_host_port_vars.patch @@ -1,5 +1,5 @@ ---- nginx-1.21.4/src/http/modules/ngx_http_proxy_module.c 2017-07-16 14:02:51.000000000 +0800 -+++ nginx-1.21.4-patched/src/http/modules/ngx_http_proxy_module.c 2017-07-16 14:02:51.000000000 +0800 +--- nginx-1.27.1/src/http/modules/ngx_http_proxy_module.c 2017-07-16 14:02:51.000000000 +0800 ++++ nginx-1.27.1-patched/src/http/modules/ngx_http_proxy_module.c 2017-07-16 14:02:51.000000000 +0800 @@ -793,13 +793,13 @@ static ngx_keyval_t ngx_http_proxy_cach static ngx_http_variable_t ngx_http_proxy_vars[] = { diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-cache_manager_exit.patch b/images/nginx/rootfs/patches/21_nginx-1.27.1-cache_manager_exit.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-cache_manager_exit.patch rename to images/nginx/rootfs/patches/21_nginx-1.27.1-cache_manager_exit.patch diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-larger_max_error_str.patch b/images/nginx/rootfs/patches/22_nginx-1.27.1-larger_max_error_str.patch similarity index 62% rename from images/nginx/rootfs/patches/nginx-1.21.4-larger_max_error_str.patch rename to images/nginx/rootfs/patches/22_nginx-1.27.1-larger_max_error_str.patch index c89032c9f..b821297e6 100644 --- a/images/nginx/rootfs/patches/nginx-1.21.4-larger_max_error_str.patch +++ b/images/nginx/rootfs/patches/22_nginx-1.27.1-larger_max_error_str.patch @@ -1,5 +1,5 @@ ---- nginx-1.21.4/src/core/ngx_log.h 2013-10-08 05:07:14.000000000 -0700 -+++ nginx-1.21.4-patched/src/core/ngx_log.h 2013-12-05 20:35:35.996236720 -0800 +--- nginx-1.27.1/src/core/ngx_log.h 2013-10-08 05:07:14.000000000 -0700 ++++ nginx-1.27.1-patched/src/core/ngx_log.h 2013-12-05 20:35:35.996236720 -0800 @@ -64,7 +64,9 @@ struct ngx_log_s { }; diff --git a/images/nginx/rootfs/patches/23_nginx-1.27.1-pcre_conf_opt.patch b/images/nginx/rootfs/patches/23_nginx-1.27.1-pcre_conf_opt.patch new file mode 100644 index 000000000..eb17e0642 --- /dev/null +++ b/images/nginx/rootfs/patches/23_nginx-1.27.1-pcre_conf_opt.patch @@ -0,0 +1,26 @@ +# HG changeset patch +# User Yichun Zhang +# Date 1386694955 28800 +# Node ID 9ba6b149669f1f02eeb4cdc0ebd364a949b5c469 +# Parent 30e806b8636af5fd3f03ec17df24801f390f7511 +Configure: added new option --with-pcre-conf-opt=OPTIONS. + +diff -r 30e806b8636a -r 9ba6b149669f auto/options +--- a/auto/options Mon Dec 09 10:16:44 2013 +0400 ++++ b/auto/options Tue Dec 10 09:02:35 2013 -0800 +@@ -286,6 +286,7 @@ + --with-pcre) USE_PCRE=YES ;; + --with-pcre=*) PCRE="$value" ;; + --with-pcre-opt=*) PCRE_OPT="$value" ;; ++ --with-pcre-conf-opt=*) PCRE_CONF_OPT="$value" ;; + --with-pcre-jit) PCRE_JIT=YES ;; + + --with-openssl=*) OPENSSL="$value" ;; +@@ -441,6 +442,7 @@ + --with-pcre force PCRE library usage + --with-pcre=DIR set path to PCRE library sources + --with-pcre-opt=OPTIONS set additional build options for PCRE ++ --with-pcre-conf-opt=OPTIONS set additional configure options for PCRE + --with-pcre-jit build PCRE with JIT compilation support + + --with-md5=DIR set path to md5 library sources diff --git a/images/nginx/rootfs/patches/24_nginx-1.27.1-always_enable_cc_feature_tests.patch b/images/nginx/rootfs/patches/24_nginx-1.27.1-always_enable_cc_feature_tests.patch new file mode 100644 index 000000000..9517e92c4 --- /dev/null +++ b/images/nginx/rootfs/patches/24_nginx-1.27.1-always_enable_cc_feature_tests.patch @@ -0,0 +1,11 @@ +--- nginx-1.27.1/auto/cc/conf 2015-10-30 22:47:50.000000000 +0800 ++++ nginx-1.27.1-patched/auto/cc/conf 2015-11-02 12:23:05.385156987 +0800 +@@ -144,7 +144,7 @@ fi + CFLAGS="$CFLAGS $NGX_CC_OPT" + NGX_TEST_LD_OPT="$NGX_LD_OPT" + +-if [ "$NGX_PLATFORM" != win32 ]; then ++if [ 1 ]; then + + if test -n "$NGX_LD_OPT"; then + ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\" diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-ssl_cert_cb_yield.patch b/images/nginx/rootfs/patches/25_nginx-1.27.1-ssl_cert_cb_yield.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-ssl_cert_cb_yield.patch rename to images/nginx/rootfs/patches/25_nginx-1.27.1-ssl_cert_cb_yield.patch diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-ssl_sess_cb_yield.patch b/images/nginx/rootfs/patches/26_nginx-1.27.1-ssl_sess_cb_yield.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-ssl_sess_cb_yield.patch rename to images/nginx/rootfs/patches/26_nginx-1.27.1-ssl_sess_cb_yield.patch diff --git a/images/nginx/rootfs/patches/27_nginx-1.27.1-ssl_client_hello_cb_yield.patch b/images/nginx/rootfs/patches/27_nginx-1.27.1-ssl_client_hello_cb_yield.patch new file mode 100644 index 000000000..0e97be992 --- /dev/null +++ b/images/nginx/rootfs/patches/27_nginx-1.27.1-ssl_client_hello_cb_yield.patch @@ -0,0 +1,38 @@ +diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c +index 8ba30e58..2b2db95c 100644 +--- a/src/event/ngx_event_openssl.c ++++ b/src/event/ngx_event_openssl.c +@@ -1712,6 +1712,9 @@ ngx_ssl_handshake(ngx_connection_t *c) + if (sslerr == SSL_ERROR_WANT_X509_LOOKUP + # ifdef SSL_ERROR_PENDING_SESSION + || sslerr == SSL_ERROR_PENDING_SESSION ++# endif ++# ifdef SSL_ERROR_WANT_CLIENT_HELLO_CB ++ || sslerr == SSL_ERROR_WANT_CLIENT_HELLO_CB + # endif + ) + { +@@ -1889,6 +1892,23 @@ ngx_ssl_try_early_data(ngx_connection_t *c) + } + #endif + ++#ifdef SSL_ERROR_WANT_CLIENT_HELLO_CB ++ if (sslerr == SSL_ERROR_WANT_CLIENT_HELLO_CB) { ++ c->read->handler = ngx_ssl_handshake_handler; ++ c->write->handler = ngx_ssl_handshake_handler; ++ ++ if (ngx_handle_read_event(c->read, 0) != NGX_OK) { ++ return NGX_ERROR; ++ } ++ ++ if (ngx_handle_write_event(c->write, 0) != NGX_OK) { ++ return NGX_ERROR; ++ } ++ ++ return NGX_AGAIN; ++ } ++#endif ++ + err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; + + c->ssl->no_wait_shutdown = 1; diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-upstream_timeout_fields.patch b/images/nginx/rootfs/patches/28_nginx-1.27.1-upstream_timeout_fields.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-upstream_timeout_fields.patch rename to images/nginx/rootfs/patches/28_nginx-1.27.1-upstream_timeout_fields.patch diff --git a/images/nginx/rootfs/patches/29_nginx-1.27.1-safe_resolver_ipv6_option.patch b/images/nginx/rootfs/patches/29_nginx-1.27.1-safe_resolver_ipv6_option.patch new file mode 100644 index 000000000..6c54c6c4c --- /dev/null +++ b/images/nginx/rootfs/patches/29_nginx-1.27.1-safe_resolver_ipv6_option.patch @@ -0,0 +1,60 @@ +# HG changeset patch +# User Thibault Charbonnier +# Date 1481847421 28800 +# Thu Dec 15 16:17:01 2016 -0800 +# Node ID 8bf038fe006fd8ae253d6b41fc6cf109a8912d3e +# Parent a3dc657f4e9530623683e6b85bd7492662e4dc47 +Resolver: ignore ipv6=off resolver option when no ipv6 support + +Makes the resolver directive more robust: we only error out when ipv6 +resolution is desired but not supported (ipv6=on). + +use case 1: some configurations are sometimes re-used between builds with and +without ipv6 support. This patch avoids the need to remove the "ipv6=off" flag. + +use case 2: currently, some tools rely on the --with-ipv6 configure option from +"nginx -V" to determine if ipv6 resolution should be disabled in some cases. +With this option disappearing in Nginx 1.11.5, this patch would allow such tools +to assume "ipv6=off" to be safe regardless of ipv6 support in the current +build. + +diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c +index dade1846..5a3f0aa4 100644 +--- a/src/core/ngx_resolver.c ++++ b/src/core/ngx_resolver.c +@@ -425,7 +425,6 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) + continue; + } + +-#if (NGX_HAVE_INET6) + if (ngx_strncmp(names[i].data, "ipv4=", 5) == 0) { + + if (ngx_strcmp(&names[i].data[5], "on") == 0) { +@@ -446,10 +445,19 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) + if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) { + + if (ngx_strcmp(&names[i].data[5], "on") == 0) { ++#if (NGX_HAVE_INET6) + r->ipv6 = 1; ++#else ++ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, ++ "no ipv6 support but \"%V\" in resolver", ++ &names[i]); ++ return NULL; ++#endif + + } else if (ngx_strcmp(&names[i].data[5], "off") == 0) { ++#if (NGX_HAVE_INET6) + r->ipv6 = 0; ++#endif + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, +@@ -459,7 +467,6 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) + + continue; + } +-#endif + + #if !(NGX_WIN32) + if (ngx_strncmp(names[i].data, "local=", 6) == 0) { diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-socket_cloexec.patch b/images/nginx/rootfs/patches/30_nginx-1.27.1-socket_cloexec.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-socket_cloexec.patch rename to images/nginx/rootfs/patches/30_nginx-1.27.1-socket_cloexec.patch diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-reuseport_close_unused_fds.patch b/images/nginx/rootfs/patches/31_nginx-1.27.1-reuseport_close_unused_fds.patch similarity index 100% rename from images/nginx/rootfs/patches/nginx-1.21.4-reuseport_close_unused_fds.patch rename to images/nginx/rootfs/patches/31_nginx-1.27.1-reuseport_close_unused_fds.patch diff --git a/images/nginx/rootfs/patches/32_nginx-1.27.1-proc_exit_handler.patch b/images/nginx/rootfs/patches/32_nginx-1.27.1-proc_exit_handler.patch new file mode 100644 index 000000000..f050c09d8 --- /dev/null +++ b/images/nginx/rootfs/patches/32_nginx-1.27.1-proc_exit_handler.patch @@ -0,0 +1,77 @@ +diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c +index c4e3c50..fa1408b 100644 +--- a/src/core/ngx_cycle.c ++++ b/src/core/ngx_cycle.c +@@ -264,6 +264,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) + } + + ++#if !(NGX_WIN32) ++ ngx_proc_exit_top_handler = ngx_proc_exit_def_handler; ++#endif + conf.ctx = cycle->conf_ctx; + conf.cycle = cycle; + conf.pool = pool; +diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c +index 12a8c68..874c9bf 100644 +--- a/src/os/unix/ngx_process.c ++++ b/src/os/unix/ngx_process.c +@@ -34,6 +34,7 @@ ngx_int_t ngx_process_slot; + ngx_socket_t ngx_channel; + ngx_int_t ngx_last_process; + ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; ++ngx_proc_exit_pt ngx_proc_exit_top_handler; + + + ngx_signal_t signals[] = { +@@ -83,6 +84,13 @@ ngx_signal_t signals[] = { + }; + + ++void ++ngx_proc_exit_def_handler(ngx_pid_t pid) ++{ ++ /* do nothing */ ++} ++ ++ + ngx_pid_t + ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, + char *name, ngx_int_t respawn) +@@ -564,6 +572,7 @@ ngx_process_get_status(void) + } + + ngx_unlock_mutexes(pid); ++ ngx_proc_exit_top_handler(pid); + } + } + +diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h +index 3986639..0b55d98 100644 +--- a/src/os/unix/ngx_process.h ++++ b/src/os/unix/ngx_process.h +@@ -18,6 +18,8 @@ typedef pid_t ngx_pid_t; + #define NGX_INVALID_PID -1 + + typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data); ++#define NGX_HAVE_PROC_EXIT 1 ++typedef void (*ngx_proc_exit_pt)(ngx_pid_t pid); + + typedef struct { + ngx_pid_t pid; +@@ -66,6 +68,7 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, + ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); + ngx_int_t ngx_init_signals(ngx_log_t *log); + void ngx_debug_point(void); ++void ngx_proc_exit_def_handler(ngx_pid_t pid); + + + #if (NGX_HAVE_SCHED_YIELD) +@@ -85,6 +88,7 @@ extern ngx_socket_t ngx_channel; + extern ngx_int_t ngx_process_slot; + extern ngx_int_t ngx_last_process; + extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; ++extern ngx_proc_exit_pt ngx_proc_exit_top_handler; + + + #endif /* _NGX_PROCESS_H_INCLUDED_ */ diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-hash_overflow.patch b/images/nginx/rootfs/patches/nginx-1.21.4-hash_overflow.patch deleted file mode 100644 index 449d214ba..000000000 --- a/images/nginx/rootfs/patches/nginx-1.21.4-hash_overflow.patch +++ /dev/null @@ -1,20 +0,0 @@ -# HG changeset patch -# User Yichun Zhang -# Date 1412276417 25200 -# Thu Oct 02 12:00:17 2014 -0700 -# Node ID 4032b992f23b054c1a2cfb0be879330d2c6708e5 -# Parent 1ff0f68d9376e3d184d65814a6372856bf65cfcd -Hash: buffer overflow might happen when exceeding the pre-configured limits. - -diff -r 1ff0f68d9376 -r 4032b992f23b src/core/ngx_hash.c ---- a/src/core/ngx_hash.c Tue Sep 30 15:50:28 2014 -0700 -+++ b/src/core/ngx_hash.c Thu Oct 02 12:00:17 2014 -0700 -@@ -312,6 +312,8 @@ ngx_hash_init(ngx_hash_init_t *hinit, ng - continue; - } - -+ size--; -+ - ngx_log_error(NGX_LOG_WARN, hinit->pool->log, 0, - "could not build optimal %s, you should increase " - "either %s_max_size: %i or %s_bucket_size: %i; " diff --git a/images/nginx/rootfs/patches/nginx-1.21.4-no_Werror.patch b/images/nginx/rootfs/patches/nginx-1.21.4-no_Werror.patch deleted file mode 100644 index f4d6fd0e5..000000000 --- a/images/nginx/rootfs/patches/nginx-1.21.4-no_Werror.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -urp nginx-1.21.4/auto/cc/clang nginx-1.21.4-patched/auto/cc/clang ---- nginx-1.21.4/auto/cc/clang 2014-03-04 03:39:24.000000000 -0800 -+++ nginx-1.21.4-patched/auto/cc/clang 2014-03-13 20:54:26.241413360 -0700 -@@ -89,7 +89,7 @@ CFLAGS="$CFLAGS -Wconditional-uninitiali - CFLAGS="$CFLAGS -Wno-unused-parameter" - - # stop on warning --CFLAGS="$CFLAGS -Werror" -+#CFLAGS="$CFLAGS -Werror" - - # debug - CFLAGS="$CFLAGS -g" -diff -urp nginx-1.21.4/auto/cc/gcc nginx-1.21.4-patched/auto/cc/gcc ---- nginx-1.21.4/auto/cc/gcc 2014-03-04 03:39:24.000000000 -0800 -+++ nginx-1.21.4-patched/auto/cc/gcc 2014-03-13 20:54:13.301355329 -0700 -@@ -168,7 +168,7 @@ esac - - - # stop on warning --CFLAGS="$CFLAGS -Werror" -+#CFLAGS="$CFLAGS -Werror" - - # debug - CFLAGS="$CFLAGS -g" -diff -urp nginx-1.21.4/auto/cc/icc nginx-1.21.4-patched/auto/cc/icc ---- nginx-1.21.4/auto/cc/icc 2014-03-04 03:39:24.000000000 -0800 -+++ nginx-1.21.4-patched/auto/cc/icc 2014-03-13 20:54:13.301355329 -0700 -@@ -115,7 +115,7 @@ case "$NGX_ICC_VER" in - esac - - # stop on warning --CFLAGS="$CFLAGS -Werror" -+#CFLAGS="$CFLAGS -Werror" - - # debug - CFLAGS="$CFLAGS -g" diff --git a/images/opentelemetry/Makefile b/images/opentelemetry/Makefile deleted file mode 100644 index 07a66beed..000000000 --- a/images/opentelemetry/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2021 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -.DEFAULT_GOAL:=build - -# set default shell -SHELL=/bin/bash -o pipefail -o errexit - -DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) -INIT_BUILDX=$(DIR)/../../hack/init-buildx.sh - -# 0.0.0 shouldn't clobber any released builds -SHORT_SHA ?=$(shell git rev-parse --short HEAD) -TAG ?=v$(shell date +%Y%m%d)-$(SHORT_SHA) - -REGISTRY ?= gcr.io/k8s-staging-ingress-nginx - -IMAGE = $(REGISTRY)/opentelemetry - -# required to enable buildx -export DOCKER_CLI_EXPERIMENTAL=enabled - -# build with buildx -PLATFORMS?=linux/amd64,linux/arm64 -OUTPUT= -PROGRESS=plain -build: ensure-buildx - docker buildx build \ - --platform=${PLATFORMS} $(OUTPUT) \ - --progress=$(PROGRESS) \ - --pull \ - --tag $(IMAGE):$(TAG) rootfs - -# push the cross built image -push: OUTPUT=--push -push: build - -# enable buildx -ensure-buildx: -# this is required for cloudbuild -ifeq ("$(wildcard $(INIT_BUILDX))","") - @curl -sSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/hack/init-buildx.sh | bash -else - @exec $(INIT_BUILDX) -endif - @echo "done" - -.PHONY: build push ensure-buildx diff --git a/images/opentelemetry/README.md b/images/opentelemetry/README.md deleted file mode 100644 index f5c3d90de..000000000 --- a/images/opentelemetry/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# OpenTelemetry library builder - -**How to use this image:** -This image only contains the necessary files in /usr/local and /etc/nginx/opentelemetry to -be copied to Ingress Controller deployment when OpenTelemetry is enabled diff --git a/images/opentelemetry/cloudbuild.yaml b/images/opentelemetry/cloudbuild.yaml deleted file mode 100644 index baf29a051..000000000 --- a/images/opentelemetry/cloudbuild.yaml +++ /dev/null @@ -1,19 +0,0 @@ -timeout: 10800s -options: - substitution_option: ALLOW_LOOSE - # job builds a multi-arch docker image for amd64,arm,arm64 and s390x. - machineType: E2_HIGHCPU_32 -steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash - env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root - args: - - -c - - | - gcloud auth configure-docker \ - && cd images/opentelemetry && make push diff --git a/images/opentelemetry/rootfs/CMakeLists.txt b/images/opentelemetry/rootfs/CMakeLists.txt deleted file mode 100644 index 2a816ebf7..000000000 --- a/images/opentelemetry/rootfs/CMakeLists.txt +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash - -# Copyright 2021 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cmake_minimum_required(VERSION 3.11 FATAL_ERROR) - -project( - dependencies - LANGUAGES CXX - VERSION 0.0.1) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_FLAGS "-O2") -set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON" FORCE) - -set(CMAKE_BUILD_TYPE - Release - CACHE STRING "Build type" FORCE) - -include(GNUInstallDirs) - -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY - ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY - ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY - ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) - -set(INSTALL_LIBDIR - ${CMAKE_INSTALL_LIBDIR} - CACHE PATH "directory for libraries") -set(INSTALL_BINDIR - ${CMAKE_INSTALL_BINDIR} - CACHE PATH "directory for executables") -set(INSTALL_INCLUDEDIR - ${CMAKE_INSTALL_INCLUDEDIR} - CACHE PATH "directory for header files") - -set(DEF_INSTALL_CMAKEDIR share/cmake/${PROJECT_NAME}) -set(INSTALL_CMAKEDIR - ${DEF_INSTALL_CMAKEDIR} - CACHE PATH "directory for CMake files") - -set_property(DIRECTORY PROPERTY EP_BASE ${CMAKE_BINARY_DIR}/subs) - -set(STAGED_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/stage) -message(STATUS "${PROJECT_NAME} staged install: ${STAGED_INSTALL_PREFIX}") - -find_package(OpenSSL REQUIRED) -message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}") -message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") - -set(GRPC_GIT_TAG - "v1.45.2" - CACHE STRING "gRPC version") - -include(ExternalProject) -ExternalProject_Add( - gRPC - GIT_REPOSITORY https://github.com/grpc/grpc.git - GIT_TAG ${GRPC_GIT_TAG} - GIT_SHALLOW 1 - UPDATE_COMMAND "" - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${STAGED_INSTALL_PREFIX} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DgRPC_SSL_PROVIDER=package - -DOPENSSL_ROOT_DIR=OpenSSL - -DgRPC_BUILD_TESTS=OFF - -DBUILD_SHARED_LIBS=OFF - -DgRPC_INSTALL=ON - -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF - -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF - -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF - -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF - -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF - CMAKE_CACHE_ARGS -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} - TEST_AFTER_INSTALL FALSE - USES_TERMINAL_BUILD TRUE - DOWNLOAD_NO_PROGRESS TRUE - LOG_CONFIGURE TRUE - LOG_BUILD TRUE - LOG_INSTALL TRUE) - -install( - DIRECTORY ${STAGED_INSTALL_PREFIX}/ - DESTINATION . - USE_SOURCE_PERMISSIONS) diff --git a/images/opentelemetry/rootfs/Dockerfile b/images/opentelemetry/rootfs/Dockerfile deleted file mode 100644 index b46b116e0..000000000 --- a/images/opentelemetry/rootfs/Dockerfile +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2021 The Kubernetes Authors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -FROM alpine:3.18.4 as base - -RUN mkdir -p /opt/third_party/install -COPY . /opt/third_party/ - -# install build tools -RUN apk update \ - && apk upgrade \ - && apk add -U bash \ - && bash /opt/third_party/build.sh -p - -ENV NINJA_STATUS "[%p/%f/%t] " - -# install gRPC -FROM base as grpc -RUN bash /opt/third_party/build.sh -g v1.57.0 - -# install abseil-cpp -FROM base as absl-cpp -RUN bash /opt/third_party/build.sh -a 20230802.0 - -# install OpenTelemetry-cpp -FROM base as otel-cpp -COPY --from=grpc /opt/third_party/install/ /usr -COPY --from=absl-cpp /opt/third_party/install/ /usr -RUN bash /opt/third_party/build.sh -o v1.11.0 - -# install otel_ngx_module.so -FROM base as nginx -COPY --from=grpc /opt/third_party/install/ /usr -COPY --from=otel-cpp /opt/third_party/install/ /usr -RUN bash /opt/third_party/build.sh -n - -FROM cgr.dev/chainguard/go:latest as build-init - -WORKDIR /go/src/app -COPY . . - -RUN go mod download -RUN CGO_ENABLED=0 go build -o /go/bin/init_module - -FROM cgr.dev/chainguard/static as final -COPY --from=build-init /go/bin/init_module / -COPY --from=nginx /etc/nginx/modules /etc/nginx/modules - -CMD ["/init_module"] diff --git a/images/opentelemetry/rootfs/build.sh b/images/opentelemetry/rootfs/build.sh deleted file mode 100755 index ebf95e219..000000000 --- a/images/opentelemetry/rootfs/build.sh +++ /dev/null @@ -1,210 +0,0 @@ -#!/bin/bash - -# Copyright 2021 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -o errexit -set -o nounset -set -o pipefail - -export GRPC_GIT_TAG=${GRPC_GIT_TAG:="v1.43.2"} -# Check for recent changes: https://github.com/open-telemetry/opentelemetry-cpp/compare/v1.2.0...main -export OPENTELEMETRY_CPP_VERSION=${OPENTELEMETRY_CPP_VERSION:="1.2.0"} -export ABSL_CPP_VERSION=${ABSL_CPP_VERSION:="20230802.0"} -export INSTAL_DIR=/opt/third_party/install -# improve compilation times -CORES=$(($(grep -c ^processor /proc/cpuinfo) - 1)) - -rm -rf \ - /var/cache/debconf/* \ - /var/lib/apt/lists/* \ - /var/log/* \ - /tmp/* \ - /var/tmp/* - -export BUILD_PATH=/tmp/build -mkdir --verbose -p "$BUILD_PATH" - -Help() -{ - # Display Help - echo "Add description of the script functions here." - echo - echo "Syntax: scriptTemplate [-h|g|o|n|p|]" - echo "options:" - echo "h Print Help." - echo "g gRPC git tag" - echo "o OpenTelemetry git tag" - echo "n install nginx" - echo "p prepare" - echo -} - -prepare() -{ - apk add \ - linux-headers \ - cmake \ - ninja \ - openssl \ - curl-dev \ - openssl-dev \ - gtest-dev \ - c-ares-dev \ - pcre-dev \ - curl \ - git \ - build-base -} - -install_grpc() -{ - mkdir -p $BUILD_PATH/grpc - cd ${BUILD_PATH}/grpc - cmake -DCMAKE_INSTALL_PREFIX=${INSTAL_DIR} \ - -G Ninja \ - -DGRPC_GIT_TAG=${GRPC_GIT_TAG} /opt/third_party - - cmake --build . -j ${CORES} --target all install --verbose -} - -install_absl() -{ - cd ${BUILD_PATH} - export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+LD_LIBRARY_PATH:}${INSTAL_DIR}/lib:/usr/local" - export PATH="${PATH}:${INSTAL_DIR}/bin" - git clone --recurse-submodules -j ${CORES} --depth=1 -b \ - ${ABSL_CPP_VERSION} https://github.com/abseil/abseil-cpp.git abseil-cpp-${ABSL_CPP_VERSION} - cd "abseil-cpp-${ABSL_CPP_VERSION}" - mkdir -p .build - cd .build - - cmake -DCMAKE_BUILD_TYPE=Release \ - -G Ninja \ - -DCMAKE_CXX_STANDARD=17 \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ - -DBUILD_TESTING=OFF \ - -DCMAKE_INSTALL_PREFIX=${INSTAL_DIR} \ - -DABSL_PROPAGATE_CXX_STD=ON \ - -DBUILD_SHARED_LIBS=OFF \ - .. - cmake --build . -j ${CORES} --target install -} - -install_otel() -{ - cd ${BUILD_PATH} - export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+LD_LIBRARY_PATH:}${INSTAL_DIR}/lib:/usr/local" - export PATH="${PATH}:${INSTAL_DIR}/bin" - git clone --recurse-submodules -j ${CORES} --depth=1 -b \ - ${OPENTELEMETRY_CPP_VERSION} https://github.com/open-telemetry/opentelemetry-cpp.git opentelemetry-cpp-${OPENTELEMETRY_CPP_VERSION} - cd "opentelemetry-cpp-${OPENTELEMETRY_CPP_VERSION}" - mkdir -p .build - cd .build - - cmake -DCMAKE_BUILD_TYPE=Release \ - -G Ninja \ - -DCMAKE_CXX_STANDARD=17 \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ - -DWITH_ZIPKIN=OFF \ - -DCMAKE_INSTALL_PREFIX=${INSTAL_DIR} \ - -DBUILD_TESTING=OFF \ - -DWITH_BENCHMARK=OFF \ - -DWITH_FUNC_TESTS=OFF \ - -DBUILD_SHARED_LIBS=OFF \ - -DWITH_OTLP_GRPC=ON \ - -DWITH_OTLP_HTTP=OFF \ - -DWITH_ABSEIL=ON \ - -DWITH_EXAMPLES=OFF \ - -DWITH_NO_DEPRECATED_CODE=ON \ - .. - cmake --build . -j ${CORES} --target install -} - -get_src() -{ - hash="$1" - url="$2" - f=$(basename "$url") - - echo "Downloading $url" - - curl -sSL --fail-with-body "$url" -o "$f" - echo "$hash $f" | sha256sum -c - || exit 10 - tar xzf "$f" - rm -rf "$f" -} - -install_nginx() -{ - export NGINX_VERSION=1.21.6 - - # Check for recent changes: https://github.com/open-telemetry/opentelemetry-cpp-contrib/compare/2656a4...main - export OPENTELEMETRY_CONTRIB_COMMIT=aaa51e2297bcb34297f3c7aa44fa790497d2f7f3 - - mkdir -p /etc/nginx - cd "$BUILD_PATH" - - # TODO fix curl - # get_src 0528e793a97f942868616449d49326160f9cb67b2253fb2c4864603ac6ab09a9 \ - # "https://github.com/open-telemetry/opentelemetry-cpp-contrib/archive/$OPENTELEMETRY_CONTRIB_COMMIT.tar.gz" - - git clone https://github.com/open-telemetry/opentelemetry-cpp-contrib.git \ - opentelemetry-cpp-contrib-${OPENTELEMETRY_CONTRIB_COMMIT} - cd ${BUILD_PATH}/opentelemetry-cpp-contrib-${OPENTELEMETRY_CONTRIB_COMMIT} - git reset --hard ${OPENTELEMETRY_CONTRIB_COMMIT} - cd ${BUILD_PATH}/opentelemetry-cpp-contrib-${OPENTELEMETRY_CONTRIB_COMMIT}/instrumentation/nginx - mkdir -p build - cd build - cmake -DCMAKE_BUILD_TYPE=Release \ - -G Ninja \ - -DCMAKE_CXX_STANDARD=17 \ - -DCMAKE_INSTALL_PREFIX=${INSTAL_DIR} \ - -DBUILD_SHARED_LIBS=ON \ - -DNGINX_VERSION=${NGINX_VERSION} \ - .. - cmake --build . -j ${CORES} --target install - - mkdir -p /etc/nginx/modules - cp ${INSTAL_DIR}/otel_ngx_module.so /etc/nginx/modules/otel_ngx_module.so -} - -while getopts ":pha:g:o:n" option; do - case $option in - h) # display Help - Help - exit;; - g) # install gRPC with git tag - GRPC_GIT_TAG=${OPTARG} - install_grpc - exit;; - o) # install OpenTelemetry tag - OPENTELEMETRY_CPP_VERSION=${OPTARG} - install_otel - exit;; - p) # prepare - prepare - exit;; - n) # install nginx - install_nginx - exit;; - a) # install abseil - ABSL_CPP_VERSION=${OPTARG} - install_absl - exit;; - \?) - Help - exit;; - esac -done diff --git a/images/opentelemetry/rootfs/go.mod b/images/opentelemetry/rootfs/go.mod deleted file mode 100644 index 2ca85f584..000000000 --- a/images/opentelemetry/rootfs/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module init-otel - -go 1.21.1 diff --git a/images/opentelemetry/rootfs/init_module.go b/images/opentelemetry/rootfs/init_module.go deleted file mode 100644 index bebec728f..000000000 --- a/images/opentelemetry/rootfs/init_module.go +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright 2023 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "io" - "os" - "path/filepath" -) - -func main() { - // Enable error handling for all operations - err := run() - if err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) - os.Exit(1) - } -} - -func run() error { - // Create the target directory if it doesn't exist - targetDir := "/modules_mount/etc/nginx/modules/otel" - err := os.MkdirAll(targetDir, os.ModePerm) - if err != nil { - return fmt.Errorf("failed to create target directory: %w", err) - } - - // Copy files from source directory to target directory - sourceDir := "/etc/nginx/modules/" - err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Skip directories - if info.IsDir() { - return nil - } - - // Calculate the destination path - relPath, err := filepath.Rel(sourceDir, path) - if err != nil { - return err - } - destPath := filepath.Join(targetDir, relPath) - - // Create the destination directory if it doesn't exist - destDir := filepath.Dir(destPath) - err = os.MkdirAll(destDir, os.ModePerm) - if err != nil { - return err - } - - // Copy the file - err = copyFile(path, destPath) - if err != nil { - return err - } - - return nil - }) - - if err != nil { - return fmt.Errorf("failed to copy files: %w", err) - } - - return nil -} - -func copyFile(sourcePath, destPath string) error { - sourceFile, err := os.Open(sourcePath) - if err != nil { - return err - } - defer sourceFile.Close() - - destFile, err := os.Create(destPath) - if err != nil { - return err - } - defer destFile.Close() - - _, err = io.Copy(destFile, sourceFile) - if err != nil { - return err - } - - return nil -} diff --git a/images/test-runner/Makefile b/images/test-runner/Makefile index dc83dd4a2..8adbf0b41 100644 --- a/images/test-runner/Makefile +++ b/images/test-runner/Makefile @@ -27,6 +27,11 @@ IMAGE = $(REGISTRY)/e2e-test-runner NGINX_BASE_IMAGE ?= $(shell cat $(DIR)/../../NGINX_BASE) +# The env below is called GO_VERSION and not GOLANG_VERSION because +# the gcb image we use to build already defines GOLANG_VERSION and is a +# really old version +GO_VERSION ?= $(shell cat $(DIR)/../../GOLANG_VERSION) + # required to enable buildx export DOCKER_CLI_EXPERIMENTAL=enabled @@ -43,18 +48,18 @@ image: --pull \ --push \ --build-arg BASE_IMAGE=${NGINX_BASE_IMAGE} \ - --build-arg GOLANG_VERSION=1.21.1 \ - --build-arg ETCD_VERSION=3.4.3-0 \ - --build-arg K8S_RELEASE=v1.26.0 \ + --build-arg GOLANG_VERSION=${GO_VERSION} \ + --build-arg ETCD_VERSION=3.5.13-0 \ + --build-arg K8S_RELEASE=v1.32.2 \ --build-arg RESTY_CLI_VERSION=0.27 \ --build-arg RESTY_CLI_SHA=e5f4f3128af49ba5c4d039d0554e5ae91bbe05866f60eccfa96d3653274bff90 \ --build-arg LUAROCKS_VERSION=3.8.0 \ --build-arg LUAROCKS_SHA=ab6612ca9ab87c6984871d2712d05525775e8b50172701a0a1cabddf76de2be7 \ --build-arg CHART_TESTING_VERSION=3.8.0 \ - --build-arg YAML_LINT_VERSION=1.27.1 \ + --build-arg YAML_LINT_VERSION=1.33.0 \ --build-arg YAMALE_VERSION=4.0.4 \ - --build-arg HELM_VERSION=3.11.2 \ - --build-arg GINKGO_VERSION=2.9.5 \ + --build-arg HELM_VERSION=3.14.4 \ + --build-arg GINKGO_VERSION=2.22.2 \ --build-arg GOLINT_VERSION=latest \ -t ${IMAGE}:${TAG} rootfs @@ -64,18 +69,18 @@ build: ensure-buildx --progress=${PROGRESS} \ --pull \ --build-arg BASE_IMAGE=${NGINX_BASE_IMAGE} \ - --build-arg GOLANG_VERSION=1.21.1 \ - --build-arg ETCD_VERSION=3.4.3-0 \ - --build-arg K8S_RELEASE=v1.26.0 \ + --build-arg GOLANG_VERSION=${GO_VERSION} \ + --build-arg ETCD_VERSION=3.5.13-0 \ + --build-arg K8S_RELEASE=v1.32.2 \ --build-arg RESTY_CLI_VERSION=0.27 \ --build-arg RESTY_CLI_SHA=e5f4f3128af49ba5c4d039d0554e5ae91bbe05866f60eccfa96d3653274bff90 \ --build-arg LUAROCKS_VERSION=3.8.0 \ --build-arg LUAROCKS_SHA=ab6612ca9ab87c6984871d2712d05525775e8b50172701a0a1cabddf76de2be7 \ --build-arg CHART_TESTING_VERSION=3.8.0 \ - --build-arg YAML_LINT_VERSION=1.27.1 \ + --build-arg YAML_LINT_VERSION=1.33.0 \ --build-arg YAMALE_VERSION=4.0.4 \ - --build-arg HELM_VERSION=3.11.2 \ - --build-arg GINKGO_VERSION=2.9.5 \ + --build-arg HELM_VERSION=3.14.4 \ + --build-arg GINKGO_VERSION=2.22.2 \ --build-arg GOLINT_VERSION=latest \ -t ${IMAGE}:${TAG} rootfs diff --git a/images/test-runner/TAG b/images/test-runner/TAG new file mode 100644 index 000000000..46b105a30 --- /dev/null +++ b/images/test-runner/TAG @@ -0,0 +1 @@ +v2.0.0 diff --git a/images/test-runner/cloudbuild.yaml b/images/test-runner/cloudbuild.yaml index b17de9b31..93dce3ec9 100644 --- a/images/test-runner/cloudbuild.yaml +++ b/images/test-runner/cloudbuild.yaml @@ -1,17 +1,11 @@ -timeout: 3600s options: + # Ignore Prow provided substitutions. substitution_option: ALLOW_LOOSE steps: - - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211118-2f2d816b90 - entrypoint: bash + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250116-2a05ea7e3d env: - - DOCKER_CLI_EXPERIMENTAL=enabled - - REGISTRY=gcr.io/k8s-staging-ingress-nginx - # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx - # set the home to /root explicitly to if using docker buildx - - HOME=/root + - REGISTRY=us-central1-docker.pkg.dev/k8s-staging-images/ingress-nginx + entrypoint: bash args: - - -c - - | - gcloud auth configure-docker \ - && cd images/test-runner && make push + - -c + - gcloud auth configure-docker && cd images/test-runner && make push diff --git a/images/test-runner/rootfs/Dockerfile b/images/test-runner/rootfs/Dockerfile index 161b6caf4..d871461bf 100644 --- a/images/test-runner/rootfs/Dockerfile +++ b/images/test-runner/rootfs/Dockerfile @@ -15,7 +15,7 @@ ARG BASE_IMAGE ARG GOLANG_VERSION ARG ETCD_VERSION -FROM golang:${GOLANG_VERSION}-alpine3.18 as GO +FROM golang:${GOLANG_VERSION}-alpine3.21 as GO FROM registry.k8s.io/etcd:${ETCD_VERSION} as etcd FROM ${BASE_IMAGE} @@ -48,7 +48,7 @@ RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" COPY --from=etcd /usr/local/bin/etcd /usr/local/bin/etcd -RUN echo "@testing https://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories +RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories RUN apk update && apk upgrade && apk add --no-cache \ bash \ @@ -66,7 +66,8 @@ RUN apk update && apk upgrade && apk add --no-cache \ openssl \ cfssl@testing \ tzdata \ - libc6-compat + libc6-compat \ + sqlite-dev RUN go install -v github.com/onsi/ginkgo/v2/ginkgo@v${GINKGO_VERSION} \ && go install golang.org/x/lint/golint@${GOLINT_VERSION} @@ -120,9 +121,21 @@ RUN wget -qO /tmp/helm.tgz \ && rm -rf /tmp/* # Install a YAML Linter -RUN pip install "yamllint==$YAML_LINT_VERSION" +# Pip not working. Check PR https://github.com/kubernetes/ingress-nginx/pull/10874 +# RUN pip install --user "yamllint==$YAML_LINT_VERSION" +RUN apk update -U \ + && apk add yamllint \ + && yamllint --version # Install Yamale YAML schema validator -RUN pip install "yamale==$YAMALE_VERSION" +# Commenting pip install yamale because broken cloudbuild https://github.com/kubernetes/ingress-nginx/pull/10885 +# RUN pip install --user "yamale==$YAMALE_VERSION" +RUN wget https://github.com/23andMe/Yamale/archive/master.zip \ + && unzip -d /tmp master.zip \ + && cd /tmp/Yamale-master \ + && python setup.py install \ + && yamale -V + +LABEL org.opencontainers.image.source=https://github.com/kubernetes/ingress-nginx WORKDIR $GOPATH diff --git a/ingress-nginx.yaml b/ingress-nginx.yaml deleted file mode 100644 index be66255e0..000000000 --- a/ingress-nginx.yaml +++ /dev/null @@ -1,68 +0,0 @@ -CURRENT_VERSION: "v1.5.1" -GOLANG_VERSION: "1.19.2" -GIT_TAG: "controller-v1.5.1" -NGINX_BASE_IMAGE: "registry.k8s.io/ingress-nginx/nginx:0b5e0685112e4537ee20a0bdbba451e9f6158aa3@sha256:3f5e28bb248d5170e77b77fc2a1a385724aeff41a0b34b5afad7dd9cf93de000" -NGINX_VERSION: "1.21.6" -VERSION_TABLE: - - "v1.5.1": - - Alpine: "3.16.2" - - Kubernetes: ["1.25","1.24","1.23"] - - NGINX: "1.21.6" - - CONTROLLER_IMAGE: "registry.k8s.io/ingress-nginx/controller:v1.5.1@sha256:4ba73c697770664c1e00e9f968de14e08f606ff961c76e5d7033a4a9c593c629" - - CHROOT_CONTROLLER_IMAGE: "registry.k8s.io/ingress-nginx/controller-chroot:v1.5.1@sha256:c1c091b88a6c936a83bd7b098662760a87868d12452529bad0d178fb36147345" - - "v1.4.0": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.3.1": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.3.0": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.2.1": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.1.3": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.1.2": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.1.1": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.1.0": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.0.5": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.0.4": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.0.3": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.0.2": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.0.1": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" - - "v1.0.0": - - Alpine: "3.16.2" - - Kubernetes: [ "1.24","1.23", "1.22", "1.21", "1.20" ] - - NGINX: "1.19.10" diff --git a/internal/admission/controller/server.go b/internal/admission/controller/server.go index 7fc61bcbb..74f55fd01 100644 --- a/internal/admission/controller/server.go +++ b/internal/admission/controller/server.go @@ -47,7 +47,7 @@ type AdmissionControllerServer struct { AdmissionController AdmissionController } -// NewAdmissionControllerServer instanciates an admission controller server with +// NewAdmissionControllerServer instantiates an admission controller server with // a default codec func NewAdmissionControllerServer(ac AdmissionController) *AdmissionControllerServer { return &AdmissionControllerServer{ diff --git a/internal/ingress/annotations/annotations.go b/internal/ingress/annotations/annotations.go index 38843c2db..e10cc9be1 100644 --- a/internal/ingress/annotations/annotations.go +++ b/internal/ingress/annotations/annotations.go @@ -17,18 +17,12 @@ limitations under the License. package annotations import ( - "github.com/imdario/mergo" - "k8s.io/ingress-nginx/internal/ingress/annotations/canary" - "k8s.io/ingress-nginx/internal/ingress/annotations/modsecurity" - "k8s.io/ingress-nginx/internal/ingress/annotations/opentelemetry" - "k8s.io/ingress-nginx/internal/ingress/annotations/proxyssl" - "k8s.io/ingress-nginx/internal/ingress/annotations/sslcipher" - "k8s.io/ingress-nginx/internal/ingress/annotations/streamsnippet" - "k8s.io/klog/v2" + "dario.cat/mergo" apiv1 "k8s.io/api/core/v1" networking "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/klog/v2" "k8s.io/ingress-nginx/internal/ingress/annotations/alias" "k8s.io/ingress-nginx/internal/ingress/annotations/auth" @@ -36,23 +30,27 @@ import ( "k8s.io/ingress-nginx/internal/ingress/annotations/authreqglobal" "k8s.io/ingress-nginx/internal/ingress/annotations/authtls" "k8s.io/ingress-nginx/internal/ingress/annotations/backendprotocol" + "k8s.io/ingress-nginx/internal/ingress/annotations/canary" "k8s.io/ingress-nginx/internal/ingress/annotations/clientbodybuffersize" "k8s.io/ingress-nginx/internal/ingress/annotations/connection" "k8s.io/ingress-nginx/internal/ingress/annotations/cors" + "k8s.io/ingress-nginx/internal/ingress/annotations/customheaders" "k8s.io/ingress-nginx/internal/ingress/annotations/customhttperrors" "k8s.io/ingress-nginx/internal/ingress/annotations/defaultbackend" + "k8s.io/ingress-nginx/internal/ingress/annotations/disableproxyintercepterrors" "k8s.io/ingress-nginx/internal/ingress/annotations/fastcgi" - "k8s.io/ingress-nginx/internal/ingress/annotations/globalratelimit" "k8s.io/ingress-nginx/internal/ingress/annotations/http2pushpreload" "k8s.io/ingress-nginx/internal/ingress/annotations/ipallowlist" "k8s.io/ingress-nginx/internal/ingress/annotations/ipdenylist" "k8s.io/ingress-nginx/internal/ingress/annotations/loadbalancing" "k8s.io/ingress-nginx/internal/ingress/annotations/log" "k8s.io/ingress-nginx/internal/ingress/annotations/mirror" - "k8s.io/ingress-nginx/internal/ingress/annotations/opentracing" + "k8s.io/ingress-nginx/internal/ingress/annotations/modsecurity" + "k8s.io/ingress-nginx/internal/ingress/annotations/opentelemetry" "k8s.io/ingress-nginx/internal/ingress/annotations/parser" "k8s.io/ingress-nginx/internal/ingress/annotations/portinredirect" "k8s.io/ingress-nginx/internal/ingress/annotations/proxy" + "k8s.io/ingress-nginx/internal/ingress/annotations/proxyssl" "k8s.io/ingress-nginx/internal/ingress/annotations/ratelimit" "k8s.io/ingress-nginx/internal/ingress/annotations/redirect" "k8s.io/ingress-nginx/internal/ingress/annotations/rewrite" @@ -61,7 +59,9 @@ import ( "k8s.io/ingress-nginx/internal/ingress/annotations/serviceupstream" "k8s.io/ingress-nginx/internal/ingress/annotations/sessionaffinity" "k8s.io/ingress-nginx/internal/ingress/annotations/snippet" + "k8s.io/ingress-nginx/internal/ingress/annotations/sslcipher" "k8s.io/ingress-nginx/internal/ingress/annotations/sslpassthrough" + "k8s.io/ingress-nginx/internal/ingress/annotations/streamsnippet" "k8s.io/ingress-nginx/internal/ingress/annotations/upstreamhashby" "k8s.io/ingress-nginx/internal/ingress/annotations/upstreamvhost" "k8s.io/ingress-nginx/internal/ingress/annotations/xforwardedprefix" @@ -75,47 +75,47 @@ const DeniedKeyName = "Denied" // Ingress defines the valid annotations present in one NGINX Ingress rule type Ingress struct { metav1.ObjectMeta - BackendProtocol string - Aliases []string - BasicDigestAuth auth.Config - Canary canary.Config - CertificateAuth authtls.Config - ClientBodyBufferSize string - ConfigurationSnippet string - Connection connection.Config - CorsConfig cors.Config - CustomHTTPErrors []int - DefaultBackend *apiv1.Service - FastCGI fastcgi.Config - Denied *string - ExternalAuth authreq.Config - EnableGlobalAuth bool - HTTP2PushPreload bool - Opentracing opentracing.Config - Opentelemetry opentelemetry.Config - Proxy proxy.Config - ProxySSL proxyssl.Config - RateLimit ratelimit.Config - GlobalRateLimit globalratelimit.Config - Redirect redirect.Config - Rewrite rewrite.Config - Satisfy string - ServerSnippet string - ServiceUpstream bool - SessionAffinity sessionaffinity.Config - SSLPassthrough bool - UsePortInRedirects bool - UpstreamHashBy upstreamhashby.Config - LoadBalancing string - UpstreamVhost string - Denylist ipdenylist.SourceRange - XForwardedPrefix string - SSLCipher sslcipher.Config - Logs log.Config - ModSecurity modsecurity.Config - Mirror mirror.Config - StreamSnippet string - Allowlist ipallowlist.SourceRange + BackendProtocol string + Aliases []string + BasicDigestAuth auth.Config + Canary canary.Config + CertificateAuth authtls.Config + ClientBodyBufferSize string + CustomHeaders customheaders.Config + ConfigurationSnippet string + Connection connection.Config + CorsConfig cors.Config + CustomHTTPErrors []int + DisableProxyInterceptErrors bool + DefaultBackend *apiv1.Service + FastCGI fastcgi.Config + Denied *string + ExternalAuth authreq.Config + EnableGlobalAuth bool + HTTP2PushPreload bool + Opentelemetry opentelemetry.Config + Proxy proxy.Config + ProxySSL proxyssl.Config + RateLimit ratelimit.Config + Redirect redirect.Config + Rewrite rewrite.Config + Satisfy string + ServerSnippet string + ServiceUpstream bool + SessionAffinity sessionaffinity.Config + SSLPassthrough bool + UsePortInRedirects bool + UpstreamHashBy upstreamhashby.Config + LoadBalancing string + UpstreamVhost string + Denylist ipdenylist.SourceRange + XForwardedPrefix string + SSLCipher sslcipher.Config + Logs log.Config + ModSecurity modsecurity.Config + Mirror mirror.Config + StreamSnippet string + Allowlist ipallowlist.SourceRange } // Extractor defines the annotation parsers to be used in the extraction of annotations @@ -123,51 +123,55 @@ type Extractor struct { annotations map[string]parser.IngressAnnotation } +func NewAnnotationFactory(cfg resolver.Resolver) map[string]parser.IngressAnnotation { + return map[string]parser.IngressAnnotation{ + "Aliases": alias.NewParser(cfg), + "BasicDigestAuth": auth.NewParser(auth.AuthDirectory, cfg), + "Canary": canary.NewParser(cfg), + "CertificateAuth": authtls.NewParser(cfg), + "ClientBodyBufferSize": clientbodybuffersize.NewParser(cfg), + "CustomHeaders": customheaders.NewParser(cfg), + "ConfigurationSnippet": snippet.NewParser(cfg), + "Connection": connection.NewParser(cfg), + "CorsConfig": cors.NewParser(cfg), + "CustomHTTPErrors": customhttperrors.NewParser(cfg), + "DisableProxyInterceptErrors": disableproxyintercepterrors.NewParser(cfg), + "DefaultBackend": defaultbackend.NewParser(cfg), + "FastCGI": fastcgi.NewParser(cfg), + "ExternalAuth": authreq.NewParser(cfg), + "EnableGlobalAuth": authreqglobal.NewParser(cfg), + "HTTP2PushPreload": http2pushpreload.NewParser(cfg), + "Opentelemetry": opentelemetry.NewParser(cfg), + "Proxy": proxy.NewParser(cfg), + "ProxySSL": proxyssl.NewParser(cfg), + "RateLimit": ratelimit.NewParser(cfg), + "Redirect": redirect.NewParser(cfg), + "Rewrite": rewrite.NewParser(cfg), + "Satisfy": satisfy.NewParser(cfg), + "ServerSnippet": serversnippet.NewParser(cfg), + "ServiceUpstream": serviceupstream.NewParser(cfg), + "SessionAffinity": sessionaffinity.NewParser(cfg), + "SSLPassthrough": sslpassthrough.NewParser(cfg), + "UsePortInRedirects": portinredirect.NewParser(cfg), + "UpstreamHashBy": upstreamhashby.NewParser(cfg), + "LoadBalancing": loadbalancing.NewParser(cfg), + "UpstreamVhost": upstreamvhost.NewParser(cfg), + "Allowlist": ipallowlist.NewParser(cfg), + "Denylist": ipdenylist.NewParser(cfg), + "XForwardedPrefix": xforwardedprefix.NewParser(cfg), + "SSLCipher": sslcipher.NewParser(cfg), + "Logs": log.NewParser(cfg), + "BackendProtocol": backendprotocol.NewParser(cfg), + "ModSecurity": modsecurity.NewParser(cfg), + "Mirror": mirror.NewParser(cfg), + "StreamSnippet": streamsnippet.NewParser(cfg), + } +} + // NewAnnotationExtractor creates a new annotations extractor func NewAnnotationExtractor(cfg resolver.Resolver) Extractor { return Extractor{ - map[string]parser.IngressAnnotation{ - "Aliases": alias.NewParser(cfg), - "BasicDigestAuth": auth.NewParser(auth.AuthDirectory, cfg), - "Canary": canary.NewParser(cfg), - "CertificateAuth": authtls.NewParser(cfg), - "ClientBodyBufferSize": clientbodybuffersize.NewParser(cfg), - "ConfigurationSnippet": snippet.NewParser(cfg), - "Connection": connection.NewParser(cfg), - "CorsConfig": cors.NewParser(cfg), - "CustomHTTPErrors": customhttperrors.NewParser(cfg), - "DefaultBackend": defaultbackend.NewParser(cfg), - "FastCGI": fastcgi.NewParser(cfg), - "ExternalAuth": authreq.NewParser(cfg), - "EnableGlobalAuth": authreqglobal.NewParser(cfg), - "HTTP2PushPreload": http2pushpreload.NewParser(cfg), - "Opentracing": opentracing.NewParser(cfg), - "Opentelemetry": opentelemetry.NewParser(cfg), - "Proxy": proxy.NewParser(cfg), - "ProxySSL": proxyssl.NewParser(cfg), - "RateLimit": ratelimit.NewParser(cfg), - "GlobalRateLimit": globalratelimit.NewParser(cfg), - "Redirect": redirect.NewParser(cfg), - "Rewrite": rewrite.NewParser(cfg), - "Satisfy": satisfy.NewParser(cfg), - "ServerSnippet": serversnippet.NewParser(cfg), - "ServiceUpstream": serviceupstream.NewParser(cfg), - "SessionAffinity": sessionaffinity.NewParser(cfg), - "SSLPassthrough": sslpassthrough.NewParser(cfg), - "UsePortInRedirects": portinredirect.NewParser(cfg), - "UpstreamHashBy": upstreamhashby.NewParser(cfg), - "LoadBalancing": loadbalancing.NewParser(cfg), - "UpstreamVhost": upstreamvhost.NewParser(cfg), - "Allowlist": ipallowlist.NewParser(cfg), - "Denylist": ipdenylist.NewParser(cfg), - "XForwardedPrefix": xforwardedprefix.NewParser(cfg), - "SSLCipher": sslcipher.NewParser(cfg), - "Logs": log.NewParser(cfg), - "BackendProtocol": backendprotocol.NewParser(cfg), - "ModSecurity": modsecurity.NewParser(cfg), - "Mirror": mirror.NewParser(cfg), - "StreamSnippet": streamsnippet.NewParser(cfg), - }, + NewAnnotationFactory(cfg), } } diff --git a/internal/ingress/annotations/annotations_test.go b/internal/ingress/annotations/annotations_test.go index 5f8128e0d..5df3cdc0e 100644 --- a/internal/ingress/annotations/annotations_test.go +++ b/internal/ingress/annotations/annotations_test.go @@ -43,16 +43,20 @@ var ( annotationAffinityCookieName = parser.GetAnnotationWithPrefix("session-cookie-name") annotationUpstreamHashBy = parser.GetAnnotationWithPrefix("upstream-hash-by") annotationCustomHTTPErrors = parser.GetAnnotationWithPrefix("custom-http-errors") + annotationCustomHeaders = parser.GetAnnotationWithPrefix("custom-headers") ) type mockCfg struct { resolver.Mock - MockSecrets map[string]*apiv1.Secret - MockServices map[string]*apiv1.Service + MockSecrets map[string]*apiv1.Secret + MockServices map[string]*apiv1.Service + MockConfigMaps map[string]*apiv1.ConfigMap } func (m mockCfg) GetDefaultBackend() defaults.Backend { - return defaults.Backend{} + return defaults.Backend{ + AllowedResponseHeaders: []string{"Content-Type"}, + } } func (m mockCfg) GetSecret(name string) (*apiv1.Secret, error) { @@ -63,6 +67,10 @@ func (m mockCfg) GetService(name string) (*apiv1.Service, error) { return m.MockServices[name], nil } +func (m mockCfg) GetConfigMap(name string) (*apiv1.ConfigMap, error) { + return m.MockConfigMaps[name], nil +} + func (m mockCfg) GetAuthCertificate(name string) (*resolver.AuthSSLCert, error) { secret, err := m.GetSecret(name) if err != nil { @@ -125,6 +133,7 @@ func TestSSLPassthrough(t *testing.T) { ec := NewAnnotationExtractor(mockCfg{}) ing := buildIngress() + //nolint:goconst //already a constant fooAnns := []struct { annotations map[string]string er bool @@ -316,3 +325,44 @@ func TestCustomHTTPErrors(t *testing.T) { } } } + +func TestCustomResponseHeaders(t *testing.T) { + mockObj := mockCfg{} + mockObj.MockConfigMaps = map[string]*apiv1.ConfigMap{} + mockObj.MockConfigMaps["custom-headers"] = &apiv1.ConfigMap{Data: map[string]string{"Content-Type": "application/json"}} + mockObj.MockConfigMaps["empty-custom-headers"] = &apiv1.ConfigMap{Data: map[string]string{}} + + ec := NewAnnotationExtractor(mockObj) + ing := buildIngress() + fooAnns := []struct { + annotations map[string]string + headers map[string]string + }{ + {map[string]string{annotationCustomHeaders: "custom-headers"}, map[string]string{"Content-Type": "application/json"}}, + {map[string]string{annotationCustomHeaders: "empty-custom-headers"}, map[string]string{}}, + {nil, map[string]string{}}, + } + + for _, foo := range fooAnns { + ing.SetAnnotations(foo.annotations) + rann, err := ec.Extract(ing) + if err != nil { + t.Errorf("error should be null: %v", err) + } + r := rann.CustomHeaders.Headers + + // Check that expected headers were created + for i := range foo.headers { + if r[i] != foo.headers[i] { + t.Errorf("Returned %v but expected %v", r, foo.headers) + } + } + + // Check that no unexpected headers were created + for i := range r { + if r[i] != foo.headers[i] { + t.Errorf("Returned %v but expected %v", r, foo.headers) + } + } + } +} diff --git a/internal/ingress/annotations/authreq/main.go b/internal/ingress/annotations/authreq/main.go index c66b0ed47..ad38c36b1 100644 --- a/internal/ingress/annotations/authreq/main.go +++ b/internal/ingress/annotations/authreq/main.go @@ -416,7 +416,7 @@ func (a authReq) Parse(ing *networking.Ingress) (interface{}, error) { harr := strings.Split(hstr, ",") for _, header := range harr { header = strings.TrimSpace(header) - if len(header) > 0 { + if header != "" { if !ValidHeader(header) { return nil, ing_errors.NewLocationDenied("invalid headers list") } @@ -505,7 +505,7 @@ func ParseStringToCacheDurations(input string) ([]string, error) { arr := strings.Split(input, ",") for _, duration := range arr { duration = strings.TrimSpace(duration) - if len(duration) > 0 { + if duration != "" { if !ValidCacheDuration(duration) { authCacheDuration = []string{DefaultCacheDuration} return authCacheDuration, ing_errors.NewLocationDenied(fmt.Sprintf("invalid cache duration: %s", duration)) diff --git a/internal/ingress/annotations/authreq/main_test.go b/internal/ingress/annotations/authreq/main_test.go index 3e6df3d3b..c261795c6 100644 --- a/internal/ingress/annotations/authreq/main_test.go +++ b/internal/ingress/annotations/authreq/main_test.go @@ -99,13 +99,13 @@ func TestAnnotations(t *testing.T) { {"no scheme", "bar", "bar", "", "", "", "", "", false, true}, {"invalid host", "http://", "http://", "", "", "", "", "", false, true}, {"invalid host (multiple dots)", "http://foo..bar.com", "http://foo..bar.com", "", "", "", "", "", false, true}, - {"valid URL", "http://bar.foo.com/external-auth", "http://bar.foo.com/external-auth", "", "", "", "", "", false, false}, - {"valid URL - send body", "http://foo.com/external-auth", "http://foo.com/external-auth", "", "POST", "", "", "", false, false}, - {"valid URL - send body", "http://foo.com/external-auth", "http://foo.com/external-auth", "", "GET", "", "", "", false, false}, - {"valid URL - request redirect", "http://foo.com/external-auth", "http://foo.com/external-auth", "", "GET", "http://foo.com/redirect-me", "", "", false, false}, - {"auth snippet", "http://foo.com/external-auth", "http://foo.com/external-auth", "", "", "", "proxy_set_header My-Custom-Header 42;", "", false, false}, - {"auth cache ", "http://foo.com/external-auth", "http://foo.com/external-auth", "", "", "", "", "$foo$bar", false, false}, - {"redirect param", "http://bar.foo.com/external-auth", "http://bar.foo.com/external-auth", "origUrl", "", "", "", "", true, false}, + {"valid URL", "http://bar.foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://bar.foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "", "", "", "", "", false, false}, + {"valid URL - send body", "http://foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "", "POST", "", "", "", false, false}, + {"valid URL - send body", "http://foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "", "GET", "", "", "", false, false}, + {"valid URL - request redirect", "http://foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "", "GET", "http://foo.com/redirect-me", "", "", false, false}, + {"auth snippet", "http://foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "", "", "", "proxy_set_header My-Custom-Header 42;", "", false, false}, + {"auth cache ", "http://foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "", "", "", "", "$foo$bar", false, false}, + {"redirect param", "http://bar.foo.com/external-auth/auth?allowed_groups=snow-group,rain-group", "http://bar.foo.com/external-auth/start?rd=https://$host$escaped_request_uri", "origUrl", "", "", "", "", true, false}, } for _, test := range tests { diff --git a/internal/ingress/annotations/authtls/main.go b/internal/ingress/annotations/authtls/main.go index adedb084a..de4d1cc1d 100644 --- a/internal/ingress/annotations/authtls/main.go +++ b/internal/ingress/annotations/authtls/main.go @@ -41,10 +41,8 @@ const ( ) var ( - regexChars = regexp.QuoteMeta(`()|=`) - authVerifyClientRegex = regexp.MustCompile(`on|off|optional|optional_no_ca`) - commonNameRegex = regexp.MustCompile(`^CN=[/\-.\_\~a-zA-Z0-9` + regexChars + `]*$`) - redirectRegex = regexp.MustCompile(`^((https?://)?[A-Za-z0-9\-.]*(:\d+)?/[A-Za-z0-9\-.]*)?$`) + authVerifyClientRegex = regexp.MustCompile(`^(on|off|optional|optional_no_ca)$`) + redirectRegex = regexp.MustCompile(`^((https?://)?[A-Za-z0-9\-.]+(:\d+)?)?(/[A-Za-z0-9\-_.]+)*/?$`) ) var authTLSAnnotations = parser.Annotation{ @@ -81,7 +79,7 @@ var authTLSAnnotations = parser.Annotation{ Documentation: `This annotation defines if the received certificates should be passed or not to the upstream server in the header "ssl-client-cert"`, }, annotationAuthTLSMatchCN: { - Validator: parser.ValidateRegex(commonNameRegex, true), + Validator: parser.CommonNameAnnotationValidator, Scope: parser.AnnotationScopeLocation, Risk: parser.AnnotationRiskHigh, Documentation: `This annotation adds a sanity check for the CN of the client certificate that is sent over using a string / regex starting with "CN="`, @@ -124,6 +122,9 @@ func (assl1 *Config) Equal(assl2 *Config) bool { if assl1.PassCertToUpstream != assl2.PassCertToUpstream { return false } + if assl1.MatchCN != assl2.MatchCN { + return false + } return true } diff --git a/internal/ingress/annotations/authtls/main_test.go b/internal/ingress/annotations/authtls/main_test.go index 0dd442e4f..37342e513 100644 --- a/internal/ingress/annotations/authtls/main_test.go +++ b/internal/ingress/annotations/authtls/main_test.go @@ -333,6 +333,15 @@ func TestEquals(t *testing.T) { } cfg2.PassCertToUpstream = true + // Different MatchCN + cfg1.MatchCN = "CN=(hello-app|goodbye)" + cfg2.MatchCN = "CN=(hello-app)" + result = cfg1.Equal(cfg2) + if result != false { + t.Errorf("Expected false") + } + cfg2.MatchCN = "CN=(hello-app|goodbye)" + // Equal Configs result = cfg1.Equal(cfg2) if result != true { diff --git a/internal/ingress/annotations/canary/main.go b/internal/ingress/annotations/canary/main.go index be5761675..ccfe14261 100644 --- a/internal/ingress/annotations/canary/main.go +++ b/internal/ingress/annotations/canary/main.go @@ -177,8 +177,8 @@ func (c canary) Parse(ing *networking.Ingress) (interface{}, error) { config.Cookie = "" } - if !config.Enabled && (config.Weight > 0 || len(config.Header) > 0 || len(config.HeaderValue) > 0 || len(config.Cookie) > 0 || - len(config.HeaderPattern) > 0) { + if !config.Enabled && (config.Weight > 0 || config.Header != "" || config.HeaderValue != "" || config.Cookie != "" || + config.HeaderPattern != "") { return nil, errors.NewInvalidAnnotationConfiguration(canaryAnnotation, "configured but not enabled") } diff --git a/internal/ingress/annotations/cors/main.go b/internal/ingress/annotations/cors/main.go index 39e02f21b..cef4fb1b2 100644 --- a/internal/ingress/annotations/cors/main.go +++ b/internal/ingress/annotations/cors/main.go @@ -40,12 +40,12 @@ var ( // that could cause the Response to contain some internal value/variable (like returning $pid, $upstream_addr, etc) // Origin must contain a http/s Origin (including or not the port) or the value '*' // This Regex is composed of the following: - // * Sets a group that can be (https?://)?*?.something.com:port? + // * Sets a group that can be (https?://)?*?.something.com:port? OR null // * Allows this to be repeated as much as possible, and separated by comma // Otherwise it should be '*' - corsOriginRegexValidator = regexp.MustCompile(`^((((https?://)?(\*\.)?[A-Za-z0-9\-.]*(:\d+)?,?)+)|\*)?$`) + corsOriginRegexValidator = regexp.MustCompile(`^((((([a-z]+://)?(\*\.)?[A-Za-z0-9\-.]*(:\d+)?,?)|null)+)|\*)?$`) // corsOriginRegex defines the regex for validation inside Parse - corsOriginRegex = regexp.MustCompile(`^(https?://(\*\.)?[A-Za-z0-9\-.]*(:\d+)?|\*)?$`) + corsOriginRegex = regexp.MustCompile(`^([a-z]+://(\*\.)?[A-Za-z0-9\-.]*(:\d+)?|\*|null)?$`) // Method must contain valid methods list (PUT, GET, POST, BLA) // May contain or not spaces between each verb corsMethodsRegex = regexp.MustCompile(`^([A-Za-z]+,?\s?)+$`) @@ -78,8 +78,9 @@ var corsAnnotation = parser.Annotation{ Scope: parser.AnnotationScopeIngress, Risk: parser.AnnotationRiskMedium, Documentation: `This annotation controls what's the accepted Origin for CORS. - This is a multi-valued field, separated by ','. It must follow this format: http(s)://origin-site.com or http(s)://origin-site.com:port - It also supports single level wildcard subdomains and follows this format: http(s)://*.foo.bar, http(s)://*.bar.foo:8080 or http(s)://*.abc.bar.foo:9000`, + This is a multi-valued field, separated by ','. It must follow this format: protocol://origin-site.com, protocol://origin-site.com:port, null, or *. + It also supports single level wildcard subdomains and follows this format: https://*.foo.bar, http://*.bar.foo:8080 or myprotocol://*.abc.bar.foo:9000 + Protocol can be any lowercase string, like http, https, or mycustomprotocol.`, }, corsAllowHeadersAnnotation: { Validator: parser.ValidateRegex(parser.HeadersVariable, true), @@ -201,6 +202,10 @@ func (c cors) Parse(ing *networking.Ingress) (interface{}, error) { origins := strings.Split(unparsedOrigins, ",") for _, origin := range origins { origin = strings.TrimSpace(origin) + if origin == "" { + continue + } + if origin == "*" { config.CorsAllowOrigin = []string{"*"} break diff --git a/internal/ingress/annotations/cors/main_test.go b/internal/ingress/annotations/cors/main_test.go index d371d183b..0b6b3671b 100644 --- a/internal/ingress/annotations/cors/main_test.go +++ b/internal/ingress/annotations/cors/main_test.go @@ -17,6 +17,7 @@ limitations under the License. package cors import ( + "reflect" "testing" api "k8s.io/api/core/v1" @@ -26,6 +27,8 @@ import ( "k8s.io/ingress-nginx/internal/ingress/resolver" ) +const enableAnnotation = "true" + func buildIngress() *networking.Ingress { defaultBackend := networking.IngressBackend{ Service: &networking.IngressServiceBackend{ @@ -75,11 +78,11 @@ func TestIngressCorsConfigValid(t *testing.T) { data := map[string]string{} // Valid - data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)] = "true" + data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)] = enableAnnotation data[parser.GetAnnotationWithPrefix(corsAllowHeadersAnnotation)] = "DNT,X-CustomHeader, Keep-Alive,User-Agent" data[parser.GetAnnotationWithPrefix(corsAllowCredentialsAnnotation)] = "false" data[parser.GetAnnotationWithPrefix(corsAllowMethodsAnnotation)] = "GET, PATCH" - data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "https://origin123.test.com:4443" + data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "null, https://origin123.test.com:4443" data[parser.GetAnnotationWithPrefix(corsExposeHeadersAnnotation)] = "*, X-CustomResponseHeader" data[parser.GetAnnotationWithPrefix(corsMaxAgeAnnotation)] = "600" ing.SetAnnotations(data) @@ -110,7 +113,7 @@ func TestIngressCorsConfigValid(t *testing.T) { t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsAllowMethodsAnnotation)], nginxCors.CorsAllowMethods) } - if nginxCors.CorsAllowOrigin[0] != "https://origin123.test.com:4443" { + if !reflect.DeepEqual(nginxCors.CorsAllowOrigin, []string{"null", "https://origin123.test.com:4443"}) { t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)], nginxCors.CorsAllowOrigin) } @@ -172,3 +175,93 @@ func TestIngressCorsConfigInvalid(t *testing.T) { t.Errorf("expected %v but returned %v", defaultCorsMaxAge, nginxCors.CorsMaxAge) } } + +func TestIngressCorsConfigAllowOriginWithTrailingComma(t *testing.T) { + ing := buildIngress() + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)] = enableAnnotation + + // Include a trailing comma and an empty value between the commas. + data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "https://origin123.test.com:4443, ,https://origin321.test.com:4443," + ing.SetAnnotations(data) + + corst, err := NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("error parsing annotations: %v", err) + } + + nginxCors, ok := corst.(*Config) + if !ok { + t.Errorf("expected a Config type but returned %t", corst) + } + + if !nginxCors.CorsEnabled { + t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)], nginxCors.CorsEnabled) + } + + expectedCorsAllowOrigins := []string{"https://origin123.test.com:4443", "https://origin321.test.com:4443"} + if !reflect.DeepEqual(nginxCors.CorsAllowOrigin, expectedCorsAllowOrigins) { + t.Errorf("expected %v but returned %v", expectedCorsAllowOrigins, nginxCors.CorsAllowOrigin) + } +} + +func TestIngressCorsConfigAllowOriginNull(t *testing.T) { + ing := buildIngress() + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)] = enableAnnotation + + // Include a trailing comma and an empty value between the commas. + data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "https://origin123.test.com:4443,null,https://origin321.test.com:4443" + ing.SetAnnotations(data) + + corst, err := NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("error parsing annotations: %v", err) + } + + nginxCors, ok := corst.(*Config) + if !ok { + t.Errorf("expected a Config type but returned %t", corst) + } + + if !nginxCors.CorsEnabled { + t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)], nginxCors.CorsEnabled) + } + + expectedCorsAllowOrigins := []string{"https://origin123.test.com:4443", "null", "https://origin321.test.com:4443"} + if !reflect.DeepEqual(nginxCors.CorsAllowOrigin, expectedCorsAllowOrigins) { + t.Errorf("expected %v but returned %v", expectedCorsAllowOrigins, nginxCors.CorsAllowOrigin) + } +} + +func TestIngressCorsConfigAllowOriginWithNonHttpProtocol(t *testing.T) { + ing := buildIngress() + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)] = enableAnnotation + + // Include a trailing comma and an empty value between the commas. + data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "test://localhost" + ing.SetAnnotations(data) + + corst, err := NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("error parsing annotations: %v", err) + } + + nginxCors, ok := corst.(*Config) + if !ok { + t.Errorf("expected a Config type but returned %t", corst) + } + + if !nginxCors.CorsEnabled { + t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)], nginxCors.CorsEnabled) + } + + expectedCorsAllowOrigins := []string{"test://localhost"} + if !reflect.DeepEqual(nginxCors.CorsAllowOrigin, expectedCorsAllowOrigins) { + t.Errorf("expected %v but returned %v", expectedCorsAllowOrigins, nginxCors.CorsAllowOrigin) + } +} diff --git a/internal/ingress/annotations/customheaders/main.go b/internal/ingress/annotations/customheaders/main.go new file mode 100644 index 000000000..d48018d8c --- /dev/null +++ b/internal/ingress/annotations/customheaders/main.go @@ -0,0 +1,137 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package customheaders + +import ( + "fmt" + "reflect" + "regexp" + "slices" + + "k8s.io/klog/v2" + + networking "k8s.io/api/networking/v1" + + "k8s.io/ingress-nginx/internal/ingress/annotations/parser" + ing_errors "k8s.io/ingress-nginx/internal/ingress/errors" + "k8s.io/ingress-nginx/internal/ingress/resolver" +) + +// Config returns the custom response headers for an Ingress rule +type Config struct { + Headers map[string]string `json:"headers,omitempty"` +} + +// Equal tests for equality between two Config types +func (c1 *Config) Equal(c2 *Config) bool { + if c1 == c2 { + return true + } + if c1 == nil || c2 == nil { + return false + } + + return reflect.DeepEqual(c1.Headers, c2.Headers) +} + +var ( + headerRegexp = regexp.MustCompile(`^[a-zA-Z\d\-_]+$`) + valueRegexp = regexp.MustCompile(`^[a-zA-Z\d_ :;.,\\/"'?!(){}\[\]@<>=\-+*#$&\x60|~^%]+$`) +) + +// ValidHeader checks is the provided string satisfies the header's name regex +func ValidHeader(header string) bool { + return headerRegexp.MatchString(header) +} + +// ValidValue checks is the provided string satisfies the value regex +func ValidValue(header string) bool { + return valueRegexp.MatchString(header) +} + +const ( + customHeadersConfigMapAnnotation = "custom-headers" +) + +var customHeadersAnnotation = parser.Annotation{ + Group: "backend", + Annotations: parser.AnnotationFields{ + customHeadersConfigMapAnnotation: { + Validator: parser.ValidateRegex(parser.BasicCharsRegex, true), + Scope: parser.AnnotationScopeLocation, + Risk: parser.AnnotationRiskMedium, + Documentation: `This annotation sets the name of a ConfigMap that specifies headers to pass to the client. + Only ConfigMaps on the same namespace are allowed`, + }, + }, +} + +type customHeaders struct { + r resolver.Resolver + annotationConfig parser.Annotation +} + +// NewParser creates a new custom response headers annotation parser +func NewParser(r resolver.Resolver) parser.IngressAnnotation { + return customHeaders{r: r, annotationConfig: customHeadersAnnotation} +} + +func (a customHeaders) GetDocumentation() parser.AnnotationFields { + return a.annotationConfig.Annotations +} + +// Parse parses the annotations contained in the ingress to use +// custom response headers +func (a customHeaders) Parse(ing *networking.Ingress) (interface{}, error) { + clientHeadersConfigMapName, err := parser.GetStringAnnotation(customHeadersConfigMapAnnotation, ing, a.annotationConfig.Annotations) + if err != nil { + klog.V(3).InfoS("client-headers annotation is undefined and will not be set") + } + + var headers map[string]string + defBackend := a.r.GetDefaultBackend() + + if clientHeadersConfigMapName != "" { + clientHeadersMapContents, err := a.r.GetConfigMap(clientHeadersConfigMapName) + if err != nil { + return nil, ing_errors.NewLocationDenied(fmt.Sprintf("unable to find configMap %q", clientHeadersConfigMapName)) + } + + for header, value := range clientHeadersMapContents.Data { + if !ValidHeader(header) { + return nil, ing_errors.NewLocationDenied("invalid header name in configmap") + } + if !ValidValue(value) { + return nil, ing_errors.NewLocationDenied("invalid header value in configmap") + } + if !slices.Contains(defBackend.AllowedResponseHeaders, header) { + return nil, ing_errors.NewLocationDenied(fmt.Sprintf("header %s is not allowed, defined allowed headers inside global-allowed-response-headers %v", header, defBackend.AllowedResponseHeaders)) + } + } + + headers = clientHeadersMapContents.Data + } + + return &Config{ + Headers: headers, + }, nil +} + +func (a customHeaders) Validate(anns map[string]string) error { + maxrisk := parser.StringRiskToRisk(a.r.GetSecurityConfiguration().AnnotationsRiskLevel) + return parser.CheckAnnotationRisk(anns, maxrisk, customHeadersAnnotation.Annotations) +} diff --git a/internal/ingress/annotations/customheaders/main_test.go b/internal/ingress/annotations/customheaders/main_test.go new file mode 100644 index 000000000..81c0b795a --- /dev/null +++ b/internal/ingress/annotations/customheaders/main_test.go @@ -0,0 +1,113 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package customheaders + +import ( + "reflect" + "testing" + + api "k8s.io/api/core/v1" + networking "k8s.io/api/networking/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/ingress-nginx/internal/ingress/annotations/parser" + "k8s.io/ingress-nginx/internal/ingress/defaults" + "k8s.io/ingress-nginx/internal/ingress/resolver" +) + +func buildIngress() *networking.Ingress { + return &networking.Ingress{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "foo", + Namespace: api.NamespaceDefault, + }, + Spec: networking.IngressSpec{ + DefaultBackend: &networking.IngressBackend{ + Service: &networking.IngressServiceBackend{ + Name: "default-backend", + Port: networking.ServiceBackendPort{ + Number: 80, + }, + }, + }, + }, + } +} + +type mockBackend struct { + resolver.Mock +} + +// GetDefaultBackend returns the backend that must be used as default +func (m mockBackend) GetDefaultBackend() defaults.Backend { + return defaults.Backend{ + AllowedResponseHeaders: []string{"Content-Type", "Access-Control-Max-Age"}, + } +} + +func TestCustomHeadersParseInvalidAnnotations(t *testing.T) { + ing := buildIngress() + configMapResolver := mockBackend{} + configMapResolver.ConfigMaps = map[string]*api.ConfigMap{} + + _, err := NewParser(configMapResolver).Parse(ing) + if err != nil { + t.Errorf("expected error parsing ingress with custom-response-headers") + } + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix("custom-headers")] = "custom-headers-configmap" + ing.SetAnnotations(data) + i, err := NewParser(&resolver.Mock{}).Parse(ing) + if err == nil { + t.Errorf("expected error parsing ingress with custom-response-headers") + } + if i != nil { + t.Errorf("expected %v but got %v", nil, i) + } +} + +func TestCustomHeadersParseAnnotations(t *testing.T) { + ing := buildIngress() + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix("custom-headers")] = "custom-headers-configmap" + ing.SetAnnotations(data) + + configMapResolver := mockBackend{} + configMapResolver.ConfigMaps = map[string]*api.ConfigMap{} + + configMapResolver.ConfigMaps["custom-headers-configmap"] = &api.ConfigMap{Data: map[string]string{"Content-Type": "application/json", "Access-Control-Max-Age": "600"}} + + i, err := NewParser(configMapResolver).Parse(ing) + if err != nil { + t.Errorf("unexpected error parsing ingress with custom-response-headers: %s", err) + } + val, ok := i.(*Config) + if !ok { + t.Errorf("expected a *Config type") + } + + expectedResponseHeaders := map[string]string{} + expectedResponseHeaders["Content-Type"] = "application/json" + expectedResponseHeaders["Access-Control-Max-Age"] = "600" + + c := &Config{expectedResponseHeaders} + + if !reflect.DeepEqual(c, val) { + t.Errorf("expected %v but got %v", c, val) + } +} diff --git a/internal/ingress/annotations/disableproxyintercepterrors/main.go b/internal/ingress/annotations/disableproxyintercepterrors/main.go new file mode 100644 index 000000000..650d29707 --- /dev/null +++ b/internal/ingress/annotations/disableproxyintercepterrors/main.go @@ -0,0 +1,76 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package disableproxyintercepterrors + +import ( + networking "k8s.io/api/networking/v1" + + "k8s.io/ingress-nginx/internal/ingress/annotations/parser" + "k8s.io/ingress-nginx/internal/ingress/errors" + "k8s.io/ingress-nginx/internal/ingress/resolver" +) + +const ( + disableProxyInterceptErrorsAnnotation = "disable-proxy-intercept-errors" +) + +var disableProxyInterceptErrorsAnnotations = parser.Annotation{ + Group: "backend", + Annotations: parser.AnnotationFields{ + disableProxyInterceptErrorsAnnotation: { + Validator: parser.ValidateBool, + Scope: parser.AnnotationScopeLocation, + Risk: parser.AnnotationRiskLow, + Documentation: `This annotation allows to disable NGINX proxy-intercept-errors when custom-http-errors are set. + If a default backend annotation is specified on the ingress, the errors will be routed to that annotation's default backend service (instead of the global default backend). + Different ingresses can specify different sets of errors codes and there are UseCases where NGINX shall not intercept all errors returned from upstream.`, + }, + }, +} + +type disableProxyInterceptErrors struct { + r resolver.Resolver + annotationConfig parser.Annotation +} + +func (pie disableProxyInterceptErrors) GetDocumentation() parser.AnnotationFields { + return pie.annotationConfig.Annotations +} + +func (pie disableProxyInterceptErrors) Validate(anns map[string]string) error { + maxrisk := parser.StringRiskToRisk(pie.r.GetSecurityConfiguration().AnnotationsRiskLevel) + return parser.CheckAnnotationRisk(anns, maxrisk, disableProxyInterceptErrorsAnnotations.Annotations) +} + +// NewParser creates a new disableProxyInterceptErrors annotation parser +func NewParser(r resolver.Resolver) parser.IngressAnnotation { + return disableProxyInterceptErrors{ + r: r, + annotationConfig: disableProxyInterceptErrorsAnnotations, + } +} + +func (pie disableProxyInterceptErrors) Parse(ing *networking.Ingress) (interface{}, error) { + val, err := parser.GetBoolAnnotation(disableProxyInterceptErrorsAnnotation, ing, pie.annotationConfig.Annotations) + + // A missing annotation is not a problem, just use the default + if err == errors.ErrMissingAnnotations { + return false, nil // default is false + } + + return val, nil +} diff --git a/internal/ingress/annotations/disableproxyintercepterrors/main_test.go b/internal/ingress/annotations/disableproxyintercepterrors/main_test.go new file mode 100644 index 000000000..1238bb4e0 --- /dev/null +++ b/internal/ingress/annotations/disableproxyintercepterrors/main_test.go @@ -0,0 +1,64 @@ +/* +Copyright 2022 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package disableproxyintercepterrors + +import ( + "testing" + + api "k8s.io/api/core/v1" + networking "k8s.io/api/networking/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/ingress-nginx/internal/ingress/annotations/parser" + "k8s.io/ingress-nginx/internal/ingress/resolver" +) + +func buildIngress() *networking.Ingress { + return &networking.Ingress{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "foo", + Namespace: api.NamespaceDefault, + }, + Spec: networking.IngressSpec{ + DefaultBackend: &networking.IngressBackend{ + Service: &networking.IngressServiceBackend{ + Name: "default-backend", + Port: networking.ServiceBackendPort{ + Number: 80, + }, + }, + }, + }, + } +} + +func TestParseAnnotations(t *testing.T) { + ing := buildIngress() + + _, err := NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix("disable-proxy-intercept-errors")] = "true" + ing.SetAnnotations(data) + // test ingress using the annotation without a TLS section + _, err = NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("unexpected error parsing ingress with disable-proxy-intercept-errors") + } +} diff --git a/internal/ingress/annotations/fastcgi/main.go b/internal/ingress/annotations/fastcgi/main.go index 52384a969..9e7ab3c61 100644 --- a/internal/ingress/annotations/fastcgi/main.go +++ b/internal/ingress/annotations/fastcgi/main.go @@ -36,7 +36,10 @@ const ( ) // fast-cgi valid parameters is just a single file name (like index.php) -var regexValidIndexAnnotationAndKey = regexp.MustCompile(`^[A-Za-z0-9.\-\_]+$`) +var ( + regexValidIndexAnnotationAndKey = regexp.MustCompile(`^[A-Za-z0-9.\-\_]+$`) + validFCGIValue = regexp.MustCompile(`^[A-Za-z0-9\-\_\$\{\}/.]*$`) +) var fastCGIAnnotations = parser.Annotation{ Group: "fastcgi", @@ -142,7 +145,7 @@ func (a fastcgi) Parse(ing *networking.Ingress) (interface{}, error) { } for k, v := range cmap.Data { - if !regexValidIndexAnnotationAndKey.MatchString(k) || !parser.NGINXVariable.MatchString(v) { + if !regexValidIndexAnnotationAndKey.MatchString(k) || !validFCGIValue.MatchString(v) { klog.ErrorS(fmt.Errorf("fcgi contains invalid key or value"), "fcgi annotation error", "configmap", cmap.Name, "namespace", cmap.Namespace, "key", k, "value", v) return fcgiConfig, ing_errors.NewValidationError(fastCGIParamsAnnotation) } diff --git a/internal/ingress/annotations/fastcgi/main_test.go b/internal/ingress/annotations/fastcgi/main_test.go index bc5e2755f..f0bbc9d65 100644 --- a/internal/ingress/annotations/fastcgi/main_test.go +++ b/internal/ingress/annotations/fastcgi/main_test.go @@ -371,6 +371,18 @@ func Test_fastcgi_Parse(t *testing.T) { want: Config{Index: "indexxpto-92123.php"}, wantErr: true, }, + { + name: "invalid configmap values val", + index: "indexxpto-92123.php", + configmapname: "default/fcgiconfig", + configmap: map[string]string{ + "SCRIPT_FILENAME": "/app/src/index.php", + }, + want: Config{Index: "indexxpto-92123.php", Params: map[string]string{ + "SCRIPT_FILENAME": "/app/src/index.php", + }}, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/ingress/annotations/globalratelimit/main.go b/internal/ingress/annotations/globalratelimit/main.go deleted file mode 100644 index 0aec29f66..000000000 --- a/internal/ingress/annotations/globalratelimit/main.go +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package globalratelimit - -import ( - "fmt" - "strings" - "time" - - networking "k8s.io/api/networking/v1" - "k8s.io/klog/v2" - - "k8s.io/ingress-nginx/internal/ingress/annotations/parser" - ing_errors "k8s.io/ingress-nginx/internal/ingress/errors" - "k8s.io/ingress-nginx/internal/ingress/resolver" - "k8s.io/ingress-nginx/internal/net" - "k8s.io/ingress-nginx/pkg/util/sets" -) - -const defaultKey = "$remote_addr" - -const ( - globalRateLimitAnnotation = "global-rate-limit" - globalRateLimitWindowAnnotation = "global-rate-limit-window" - globalRateLimitKeyAnnotation = "global-rate-limit-key" - globalRateLimitIgnoredCidrsAnnotation = "global-rate-limit-ignored-cidrs" -) - -var globalRateLimitAnnotationConfig = parser.Annotation{ - Group: "ratelimit", - Annotations: parser.AnnotationFields{ - globalRateLimitAnnotation: { - Validator: parser.ValidateInt, - Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskLow, - Documentation: `This annotation configures maximum allowed number of requests per window`, - }, - globalRateLimitWindowAnnotation: { - Validator: parser.ValidateDuration, - Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskLow, - Documentation: `Configures a time window (i.e 1m) that the limit is applied`, - }, - globalRateLimitKeyAnnotation: { - Validator: parser.ValidateRegex(parser.NGINXVariable, true), - Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskHigh, - Documentation: `This annotation Configures a key for counting the samples. Defaults to $remote_addr. - You can also combine multiple NGINX variables here, like ${remote_addr}-${http_x_api_client} which would mean the limit will be applied to - requests coming from the same API client (indicated by X-API-Client HTTP request header) with the same source IP address`, - }, - globalRateLimitIgnoredCidrsAnnotation: { - Validator: parser.ValidateCIDRs, - Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskMedium, - Documentation: `This annotation defines a comma separated list of IPs and CIDRs to match client IP against. - When there's a match request is not considered for rate limiting.`, - }, - }, -} - -// Config encapsulates all global rate limit attributes -type Config struct { - Namespace string `json:"namespace"` - Limit int `json:"limit"` - WindowSize int `json:"window-size"` - Key string `json:"key"` - IgnoredCIDRs []string `json:"ignored-cidrs"` -} - -// Equal tests for equality between two Config types -func (l *Config) Equal(r *Config) bool { - if l.Namespace != r.Namespace { - return false - } - if l.Limit != r.Limit { - return false - } - if l.WindowSize != r.WindowSize { - return false - } - if l.Key != r.Key { - return false - } - if len(l.IgnoredCIDRs) != len(r.IgnoredCIDRs) || !sets.StringElementsMatch(l.IgnoredCIDRs, r.IgnoredCIDRs) { - return false - } - - return true -} - -type globalratelimit struct { - r resolver.Resolver - annotationConfig parser.Annotation -} - -// NewParser creates a new globalratelimit annotation parser -func NewParser(r resolver.Resolver) parser.IngressAnnotation { - return globalratelimit{ - r: r, - annotationConfig: globalRateLimitAnnotationConfig, - } -} - -// Parse extracts globalratelimit annotations from the given ingress -// and returns them structured as Config type -func (a globalratelimit) Parse(ing *networking.Ingress) (interface{}, error) { - config := &Config{} - - limit, err := parser.GetIntAnnotation(globalRateLimitAnnotation, ing, a.annotationConfig.Annotations) - if err != nil && ing_errors.IsInvalidContent(err) { - return nil, err - } - rawWindowSize, err := parser.GetStringAnnotation(globalRateLimitWindowAnnotation, ing, a.annotationConfig.Annotations) - if err != nil && ing_errors.IsValidationError(err) { - return config, ing_errors.LocationDeniedError{ - Reason: fmt.Errorf("failed to parse 'global-rate-limit-window' value: %w", err), - } - } - - if limit == 0 || rawWindowSize == "" { - return config, nil - } - - windowSize, err := time.ParseDuration(rawWindowSize) - if err != nil { - return config, ing_errors.LocationDeniedError{ - Reason: fmt.Errorf("failed to parse 'global-rate-limit-window' value: %w", err), - } - } - - key, err := parser.GetStringAnnotation(globalRateLimitKeyAnnotation, ing, a.annotationConfig.Annotations) - if err != nil { - klog.Warningf("invalid %s, defaulting to %s", globalRateLimitKeyAnnotation, defaultKey) - } - if key == "" { - key = defaultKey - } - - rawIgnoredCIDRs, err := parser.GetStringAnnotation(globalRateLimitIgnoredCidrsAnnotation, ing, a.annotationConfig.Annotations) - if err != nil && ing_errors.IsInvalidContent(err) { - return nil, err - } - ignoredCIDRs, err := net.ParseCIDRs(rawIgnoredCIDRs) - if err != nil { - return nil, err - } - - config.Namespace = strings.ReplaceAll(string(ing.UID), "-", "") - config.Limit = limit - config.WindowSize = int(windowSize.Seconds()) - config.Key = key - config.IgnoredCIDRs = ignoredCIDRs - - return config, nil -} - -func (a globalratelimit) GetDocumentation() parser.AnnotationFields { - return a.annotationConfig.Annotations -} - -func (a globalratelimit) Validate(anns map[string]string) error { - maxrisk := parser.StringRiskToRisk(a.r.GetSecurityConfiguration().AnnotationsRiskLevel) - return parser.CheckAnnotationRisk(anns, maxrisk, globalRateLimitAnnotationConfig.Annotations) -} diff --git a/internal/ingress/annotations/globalratelimit/main_test.go b/internal/ingress/annotations/globalratelimit/main_test.go deleted file mode 100644 index b1a7ab71b..000000000 --- a/internal/ingress/annotations/globalratelimit/main_test.go +++ /dev/null @@ -1,211 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package globalratelimit - -import ( - "encoding/json" - "fmt" - "testing" - - api "k8s.io/api/core/v1" - networking "k8s.io/api/networking/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "k8s.io/ingress-nginx/internal/ingress/annotations/parser" - ing_errors "k8s.io/ingress-nginx/internal/ingress/errors" - "k8s.io/ingress-nginx/internal/ingress/resolver" -) - -const ( - UID = "31285d47-b150-4dcf-bd6f-12c46d769f6e" - expectedUID = "31285d47b1504dcfbd6f12c46d769f6e" -) - -func buildIngress() *networking.Ingress { - defaultBackend := networking.IngressBackend{ - Service: &networking.IngressServiceBackend{ - Name: "default-backend", - Port: networking.ServiceBackendPort{ - Number: 80, - }, - }, - } - - return &networking.Ingress{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: "foo", - Namespace: api.NamespaceDefault, - UID: UID, - }, - Spec: networking.IngressSpec{ - DefaultBackend: &networking.IngressBackend{ - Service: &networking.IngressServiceBackend{ - Name: "default-backend", - Port: networking.ServiceBackendPort{ - Number: 80, - }, - }, - }, - Rules: []networking.IngressRule{ - { - Host: "foo.bar.com", - IngressRuleValue: networking.IngressRuleValue{ - HTTP: &networking.HTTPIngressRuleValue{ - Paths: []networking.HTTPIngressPath{ - { - Path: "/foo", - Backend: defaultBackend, - }, - }, - }, - }, - }, - }, - }, - } -} - -type mockBackend struct { - resolver.Mock -} - -func TestGlobalRateLimiting(t *testing.T) { - ing := buildIngress() - - annRateLimit := parser.GetAnnotationWithPrefix("global-rate-limit") - annRateLimitWindow := parser.GetAnnotationWithPrefix("global-rate-limit-window") - annRateLimitKey := parser.GetAnnotationWithPrefix("global-rate-limit-key") - annRateLimitIgnoredCIDRs := parser.GetAnnotationWithPrefix("global-rate-limit-ignored-cidrs") - - testCases := []struct { - title string - annotations map[string]string - expectedConfig *Config - expectedErr error - }{ - { - "no annotation", - nil, - &Config{}, - nil, - }, - { - "minimum required annotations", - map[string]string{ - annRateLimit: "100", - annRateLimitWindow: "2m", - }, - &Config{ - Namespace: expectedUID, - Limit: 100, - WindowSize: 120, - Key: "$remote_addr", - IgnoredCIDRs: make([]string, 0), - }, - nil, - }, - { - "global-rate-limit-key annotation", - map[string]string{ - annRateLimit: "100", - annRateLimitWindow: "2m", - annRateLimitKey: "$http_x_api_user", - }, - &Config{ - Namespace: expectedUID, - Limit: 100, - WindowSize: 120, - Key: "$http_x_api_user", - IgnoredCIDRs: make([]string, 0), - }, - nil, - }, - { - "global-rate-limit-ignored-cidrs annotation", - map[string]string{ - annRateLimit: "100", - annRateLimitWindow: "2m", - annRateLimitKey: "$http_x_api_user", - annRateLimitIgnoredCIDRs: "127.0.0.1, 200.200.24.0/24", - }, - &Config{ - Namespace: expectedUID, - Limit: 100, - WindowSize: 120, - Key: "$http_x_api_user", - IgnoredCIDRs: []string{"127.0.0.1", "200.200.24.0/24"}, - }, - nil, - }, - { - "global-rate-limit-complex-key", - map[string]string{ - annRateLimit: "100", - annRateLimitWindow: "2m", - annRateLimitKey: "${http_x_api_user}${otherinfo}", - }, - &Config{ - Namespace: expectedUID, - Limit: 100, - WindowSize: 120, - Key: "${http_x_api_user}${otherinfo}", - IgnoredCIDRs: make([]string, 0), - }, - nil, - }, - { - "incorrect duration for window", - map[string]string{ - annRateLimit: "100", - annRateLimitWindow: "2mb", - annRateLimitKey: "$http_x_api_user", - }, - &Config{}, - ing_errors.ValidationError{ - Reason: fmt.Errorf("failed to parse 'global-rate-limit-window' value: annotation nginx.ingress.kubernetes.io/global-rate-limit-window contains invalid value"), - }, - }, - } - - for _, testCase := range testCases { - ing.SetAnnotations(testCase.annotations) - - i, actualErr := NewParser(mockBackend{}).Parse(ing) - if (testCase.expectedErr == nil || actualErr == nil) && testCase.expectedErr != actualErr { - t.Errorf("%s expected error '%v' but got '%v'", testCase.title, testCase.expectedErr, actualErr) - } else if testCase.expectedErr != nil && actualErr != nil && - testCase.expectedErr.Error() != actualErr.Error() { - t.Errorf("expected error '%v' but got '%v'", testCase.expectedErr, actualErr) - } - - actualConfig, ok := i.(*Config) - if !ok { - t.Errorf("expected Config type but got %T", i) - } - if !testCase.expectedConfig.Equal(actualConfig) { - expectedJSON, err := json.Marshal(testCase.expectedConfig) - if err != nil { - t.Errorf("failed to marshal expected config: %v", err) - } - actualJSON, err := json.Marshal(actualConfig) - if err != nil { - t.Errorf("failed to marshal actual config: %v", err) - } - t.Errorf("%v: expected config '%s' but got '%s'", testCase.title, expectedJSON, actualJSON) - } - } -} diff --git a/internal/ingress/annotations/loadbalancing/main.go b/internal/ingress/annotations/loadbalancing/main.go index ee89d2c1b..0e5ca8bd8 100644 --- a/internal/ingress/annotations/loadbalancing/main.go +++ b/internal/ingress/annotations/loadbalancing/main.go @@ -23,22 +23,22 @@ import ( "k8s.io/ingress-nginx/internal/ingress/resolver" ) -// LB Alghorithms are defined in https://github.com/kubernetes/ingress-nginx/blob/d3e75b056f77be54e01bdb18675f1bb46caece31/rootfs/etc/nginx/lua/balancer.lua#L28 +// LB Algorithms are defined in https://github.com/kubernetes/ingress-nginx/blob/d3e75b056f77be54e01bdb18675f1bb46caece31/rootfs/etc/nginx/lua/balancer.lua#L28 const ( - loadBalanceAlghoritmAnnotation = "load-balance" + loadBalanceAlgorithmAnnotation = "load-balance" ) -var loadBalanceAlghoritms = []string{"round_robin", "chash", "chashsubset", "sticky_balanced", "sticky_persistent", "ewma"} +var loadBalanceAlgorithms = []string{"round_robin", "chash", "chashsubset", "sticky_balanced", "sticky_persistent", "ewma"} var loadBalanceAnnotations = parser.Annotation{ Group: "backend", Annotations: parser.AnnotationFields{ - loadBalanceAlghoritmAnnotation: { - Validator: parser.ValidateOptions(loadBalanceAlghoritms, true, true), + loadBalanceAlgorithmAnnotation: { + Validator: parser.ValidateOptions(loadBalanceAlgorithms, true, true), Scope: parser.AnnotationScopeLocation, Risk: parser.AnnotationRiskLow, - Documentation: `This annotation allows setting the load balancing alghorithm that should be used. If none is specified, defaults to + Documentation: `This annotation allows setting the load balancing algorithm that should be used. If none is specified, defaults to the default configured by Ingress admin, otherwise to round_robin`, }, }, @@ -61,7 +61,7 @@ func NewParser(r resolver.Resolver) parser.IngressAnnotation { // used to indicate if the location/s contains a fragment of // configuration to be included inside the paths of the rules func (a loadbalancing) Parse(ing *networking.Ingress) (interface{}, error) { - return parser.GetStringAnnotation(loadBalanceAlghoritmAnnotation, ing, a.annotationConfig.Annotations) + return parser.GetStringAnnotation(loadBalanceAlgorithmAnnotation, ing, a.annotationConfig.Annotations) } func (a loadbalancing) GetDocumentation() parser.AnnotationFields { diff --git a/internal/ingress/annotations/mirror/main_test.go b/internal/ingress/annotations/mirror/main_test.go index 1f6b44d61..805f1ef6d 100644 --- a/internal/ingress/annotations/mirror/main_test.go +++ b/internal/ingress/annotations/mirror/main_test.go @@ -90,7 +90,7 @@ func TestParse(t *testing.T) { Target: "http://some.test.env.com:2121/$someparam=1&$someotherparam=2", Host: "some.test.env.com", }}, - {map[string]string{backendURL: "http://some.test.env.com", host: "someInvalidParm.%^&*()_=!@#'\""}, &Config{ + {map[string]string{backendURL: "http://some.test.env.com", host: "someInvalidParam.%^&*()_=!@#'\""}, &Config{ Source: ngxURI, RequestBody: "on", Target: "http://some.test.env.com", diff --git a/internal/ingress/annotations/opentracing/main.go b/internal/ingress/annotations/opentracing/main.go deleted file mode 100644 index 9d7995a8a..000000000 --- a/internal/ingress/annotations/opentracing/main.go +++ /dev/null @@ -1,113 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package opentracing - -import ( - networking "k8s.io/api/networking/v1" - - "k8s.io/ingress-nginx/internal/ingress/annotations/parser" - "k8s.io/ingress-nginx/internal/ingress/resolver" -) - -const ( - enableOpentracingAnnotation = "enable-opentracing" - opentracingTrustSpanAnnotation = "opentracing-trust-incoming-span" -) - -var opentracingAnnotations = parser.Annotation{ - Group: "opentracing", - Annotations: parser.AnnotationFields{ - enableOpentracingAnnotation: { - Validator: parser.ValidateBool, - Scope: parser.AnnotationScopeLocation, - Risk: parser.AnnotationRiskLow, - Documentation: `This annotation defines if Opentracing collector should be enable for this location. Opentracing should - already be configured by Ingress administrator`, - }, - opentracingTrustSpanAnnotation: { - Validator: parser.ValidateBool, - Scope: parser.AnnotationScopeLocation, - Risk: parser.AnnotationRiskLow, - Documentation: `This annotation enables or disables using spans from incoming requests as parent for created ones`, - }, - }, -} - -type opentracing struct { - r resolver.Resolver - annotationConfig parser.Annotation -} - -// Config contains the configuration to be used in the Ingress -type Config struct { - Enabled bool `json:"enabled"` - Set bool `json:"set"` - TrustEnabled bool `json:"trust-enabled"` - TrustSet bool `json:"trust-set"` -} - -// Equal tests for equality between two Config types -func (bd1 *Config) Equal(bd2 *Config) bool { - if bd1.Set != bd2.Set { - return false - } - - if bd1.Enabled != bd2.Enabled { - return false - } - - if bd1.TrustSet != bd2.TrustSet { - return false - } - - if bd1.TrustEnabled != bd2.TrustEnabled { - return false - } - - return true -} - -// NewParser creates a new serviceUpstream annotation parser -func NewParser(r resolver.Resolver) parser.IngressAnnotation { - return opentracing{ - r: r, - annotationConfig: opentracingAnnotations, - } -} - -func (o opentracing) Parse(ing *networking.Ingress) (interface{}, error) { - enabled, err := parser.GetBoolAnnotation(enableOpentracingAnnotation, ing, o.annotationConfig.Annotations) - if err != nil { - return &Config{}, nil - } - - trustSpan, err := parser.GetBoolAnnotation(opentracingTrustSpanAnnotation, ing, o.annotationConfig.Annotations) - if err != nil { - return &Config{Set: true, Enabled: enabled}, nil - } - - return &Config{Set: true, Enabled: enabled, TrustSet: true, TrustEnabled: trustSpan}, nil -} - -func (o opentracing) GetDocumentation() parser.AnnotationFields { - return o.annotationConfig.Annotations -} - -func (o opentracing) Validate(anns map[string]string) error { - maxrisk := parser.StringRiskToRisk(o.r.GetSecurityConfiguration().AnnotationsRiskLevel) - return parser.CheckAnnotationRisk(anns, maxrisk, opentracingAnnotations.Annotations) -} diff --git a/internal/ingress/annotations/opentracing/main_test.go b/internal/ingress/annotations/opentracing/main_test.go deleted file mode 100644 index f59e60438..000000000 --- a/internal/ingress/annotations/opentracing/main_test.go +++ /dev/null @@ -1,159 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package opentracing - -import ( - "testing" - - api "k8s.io/api/core/v1" - networking "k8s.io/api/networking/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/ingress-nginx/internal/ingress/annotations/parser" - "k8s.io/ingress-nginx/internal/ingress/resolver" -) - -const enableAnnotation = "true" - -func buildIngress() *networking.Ingress { - defaultBackend := networking.IngressBackend{ - Service: &networking.IngressServiceBackend{ - Name: "default-backend", - Port: networking.ServiceBackendPort{ - Number: 80, - }, - }, - } - - return &networking.Ingress{ - ObjectMeta: meta_v1.ObjectMeta{ - Name: "foo", - Namespace: api.NamespaceDefault, - }, - Spec: networking.IngressSpec{ - DefaultBackend: &networking.IngressBackend{ - Service: &networking.IngressServiceBackend{ - Name: "default-backend", - Port: networking.ServiceBackendPort{ - Number: 80, - }, - }, - }, - Rules: []networking.IngressRule{ - { - Host: "foo.bar.com", - IngressRuleValue: networking.IngressRuleValue{ - HTTP: &networking.HTTPIngressRuleValue{ - Paths: []networking.HTTPIngressPath{ - { - Path: "/foo", - Backend: defaultBackend, - }, - }, - }, - }, - }, - }, - }, - } -} - -func TestIngressAnnotationOpentracingSetTrue(t *testing.T) { - ing := buildIngress() - - data := map[string]string{} - data[parser.GetAnnotationWithPrefix(enableOpentracingAnnotation)] = enableAnnotation - ing.SetAnnotations(data) - - val, err := NewParser(&resolver.Mock{}).Parse(ing) - if err != nil { - t.Errorf("unexpected error %v", err) - } - openTracing, ok := val.(*Config) - if !ok { - t.Errorf("expected a Config type") - } - - if !openTracing.Enabled { - t.Errorf("expected annotation value to be true, got false") - } -} - -func TestIngressAnnotationOpentracingSetFalse(t *testing.T) { - ing := buildIngress() - - // Test with explicitly set to false - data := map[string]string{} - data[parser.GetAnnotationWithPrefix(enableOpentracingAnnotation)] = "false" - ing.SetAnnotations(data) - - val, err := NewParser(&resolver.Mock{}).Parse(ing) - if err != nil { - t.Errorf("unexpected error %v", err) - } - openTracing, ok := val.(*Config) - if !ok { - t.Errorf("expected a Config type") - } - - if openTracing.Enabled { - t.Errorf("expected annotation value to be false, got true") - } -} - -func TestIngressAnnotationOpentracingTrustSetTrue(t *testing.T) { - ing := buildIngress() - - data := map[string]string{} - data[parser.GetAnnotationWithPrefix(enableOpentracingAnnotation)] = enableAnnotation - data[parser.GetAnnotationWithPrefix(opentracingTrustSpanAnnotation)] = enableAnnotation - ing.SetAnnotations(data) - - val, err := NewParser(&resolver.Mock{}).Parse(ing) - if err != nil { - t.Errorf("unexpected error %v", err) - } - openTracing, ok := val.(*Config) - if !ok { - t.Errorf("expected a Config type") - } - - if !openTracing.Enabled { - t.Errorf("expected annotation value to be true, got false") - } - - if !openTracing.TrustEnabled { - t.Errorf("expected annotation value to be true, got false") - } -} - -func TestIngressAnnotationOpentracingUnset(t *testing.T) { - ing := buildIngress() - - // Test with no annotation specified - data := map[string]string{} - ing.SetAnnotations(data) - - val, err := NewParser(&resolver.Mock{}).Parse(ing) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - _, ok := val.(*Config) - if !ok { - t.Errorf("expected a Config type") - } -} diff --git a/internal/ingress/annotations/parser/main.go b/internal/ingress/annotations/parser/main.go index 554ad9dde..3137afbfd 100644 --- a/internal/ingress/annotations/parser/main.go +++ b/internal/ingress/annotations/parser/main.go @@ -210,6 +210,21 @@ func StringRiskToRisk(risk string) AnnotationRisk { } } +func (a AnnotationRisk) ToString() string { + switch a { + case AnnotationRiskCritical: + return "Critical" + case AnnotationRiskHigh: + return "High" + case AnnotationRiskMedium: + return "Medium" + case AnnotationRiskLow: + return "Low" + default: + return "Unknown" + } +} + func normalizeString(input string) string { trimmedContent := []string{} for _, line := range strings.Split(input, "\n") { diff --git a/internal/ingress/annotations/parser/validators.go b/internal/ingress/annotations/parser/validators.go index ab9b4799f..3c724a311 100644 --- a/internal/ingress/annotations/parser/validators.go +++ b/internal/ingress/annotations/parser/validators.go @@ -44,11 +44,13 @@ var ( alphaNumericChars = `\-\.\_\~a-zA-Z0-9\/:` extendedAlphaNumeric = alphaNumericChars + ", " regexEnabledChars = regexp.QuoteMeta(`^$[](){}*+?|&=\`) - urlEnabledChars = regexp.QuoteMeta(`:?&=`) + urlEnabledChars = regexp.QuoteMeta(`,:?&=`) ) // IsValidRegex checks if the tested string can be used as a regex, but without any weird character. // It includes regex characters for paths that may contain regexes +// +//nolint:goconst //already a constant var IsValidRegex = regexp.MustCompile("^[/" + alphaNumericChars + regexEnabledChars + "]*$") // SizeRegex validates sizes understood by NGINX, like 1000, 100k, 1000M @@ -71,12 +73,14 @@ var ( NGINXVariable = regexp.MustCompile(`^[A-Za-z0-9\-\_\$\{\}]*$`) // RegexPathWithCapture allows entries that SHOULD start with "/" and may contain alphanumeric + capture // character for regex based paths, like /something/$1/anything/$2 - RegexPathWithCapture = regexp.MustCompile(`^/[` + alphaNumericChars + `\/\$]*$`) + RegexPathWithCapture = regexp.MustCompile(`^/?[` + alphaNumericChars + `\/\$]*$`) // HeadersVariable defines a regex that allows headers separated by comma HeadersVariable = regexp.MustCompile(`^[A-Za-z0-9-_, ]*$`) // URLWithNginxVariableRegex defines a url that can contain nginx variables. // It is a risky operation - URLWithNginxVariableRegex = regexp.MustCompile("^[" + alphaNumericChars + urlEnabledChars + "$]*$") + URLWithNginxVariableRegex = regexp.MustCompile("^[" + extendedAlphaNumeric + urlEnabledChars + "$]*$") + // MaliciousRegex defines chars that are known to inject RCE + MaliciousRegex = regexp.MustCompile(`\r|\n`) ) // ValidateArrayOfServerName validates if all fields on a Server name annotation are @@ -111,10 +115,28 @@ func ValidateRegex(regex *regexp.Regexp, removeSpace bool) AnnotationValidator { if !regex.MatchString(s) { return fmt.Errorf("value %s is invalid", s) } + if MaliciousRegex.MatchString(s) { + return fmt.Errorf("value %s contains malicious string", s) + } + return nil } } +// CommonNameAnnotationValidator checks whether the annotation value starts with +// 'CN=' and is followed by a valid regex. +func CommonNameAnnotationValidator(s string) error { + if !strings.HasPrefix(s, "CN=") { + return fmt.Errorf("value %s is not a valid Common Name annotation: missing prefix 'CN='", s) + } + + if _, err := regexp.Compile(s[3:]); err != nil { + return fmt.Errorf("value %s is not a valid regex: %w", s, err) + } + + return nil +} + // ValidateOptions receives an array of valid options that can be the value of annotation. // If no valid option is found, it will return an error func ValidateOptions(options []string, caseSensitive, trimSpace bool) AnnotationValidator { @@ -174,7 +196,7 @@ func ValidateServiceName(value string) error { return nil } -// checkAnnotations will check each annotation for: +// checkAnnotation will check each annotation for: // 1 - Does it contain the internal validation and docs config? // 2 - Does the ingress contains annotations? (validate null pointers) // 3 - Does it contains a validator? Should it contain a validator (not containing is a bug!) diff --git a/internal/ingress/annotations/parser/validators_test.go b/internal/ingress/annotations/parser/validators_test.go index e7aeb15ca..49923ba76 100644 --- a/internal/ingress/annotations/parser/validators_test.go +++ b/internal/ingress/annotations/parser/validators_test.go @@ -55,11 +55,21 @@ func TestValidateArrayOfServerName(t *testing.T) { value: "*.so*mething.com,bla.com", wantErr: false, }, + { + name: "should allow comma separated query params", + value: "https://oauth.example/oauth2/auth?allowed_groups=gid1,gid2", + wantErr: false, + }, { name: "should deny names with weird characters", value: "something.com,lolo;xpto.com,nothing.com", wantErr: true, }, + { + name: "should deny names with malicous chars", + value: "http://something.com/#;\nournewinjection", + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -104,7 +114,7 @@ func Test_checkAnnotation(t *testing.T) { }, fields: AnnotationFields{ "otherannotation": AnnotationConfig{ - Validator: func(value string) error { return nil }, + Validator: func(_ string) error { return nil }, }, }, }, @@ -307,3 +317,59 @@ func TestCheckAnnotationRisk(t *testing.T) { }) } } + +func TestCommonNameAnnotationValidator(t *testing.T) { + tests := []struct { + name string + annotation string + wantErr bool + }{ + { + name: "correct example", + annotation: `CN=(my\.common\.name)`, + wantErr: false, + }, + { + name: "no CN= prefix", + annotation: `(my\.common\.name)`, + wantErr: true, + }, + { + name: "invalid prefix", + annotation: `CN(my\.common\.name)`, + wantErr: true, + }, + { + name: "invalid regex", + annotation: `CN=(my\.common\.name]`, + wantErr: true, + }, + { + name: "wildcard regex", + annotation: `CN=(my\..*\.name)`, + wantErr: false, + }, + { + name: "somewhat complex regex", + annotation: "CN=(my\\.app\\.dev|.*\\.bbb\\.aaaa\\.tld)", + wantErr: false, + }, + { + name: "another somewhat complex regex", + annotation: `CN=(my-app.*\.c\.defg\.net|other.app.com)`, + wantErr: false, + }, + { + name: "nested parenthesis regex", + annotation: `CN=(api-one\.(asdf)?qwer\.webpage\.organization\.org)`, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := CommonNameAnnotationValidator(tt.annotation); (err != nil) != tt.wantErr { + t.Errorf("CommonNameAnnotationValidator() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/ingress/annotations/proxy/main.go b/internal/ingress/annotations/proxy/main.go index 9d2646261..aaa093eaf 100644 --- a/internal/ingress/annotations/proxy/main.go +++ b/internal/ingress/annotations/proxy/main.go @@ -31,6 +31,7 @@ const ( proxyReadTimeoutAnnotation = "proxy-read-timeout" proxyBuffersNumberAnnotation = "proxy-buffers-number" proxyBufferSizeAnnotation = "proxy-buffer-size" + proxyBusyBuffersSizeAnnotation = "proxy-busy-buffers-size" proxyCookiePathAnnotation = "proxy-cookie-path" proxyCookieDomainAnnotation = "proxy-cookie-domain" proxyBodySizeAnnotation = "proxy-body-size" @@ -82,6 +83,12 @@ var proxyAnnotations = parser.Annotation{ Documentation: `This annotation sets the size of the buffer proxy_buffer_size used for reading the first part of the response received from the proxied server. By default proxy buffer size is set as "4k".`, }, + proxyBusyBuffersSizeAnnotation: { + Validator: parser.ValidateRegex(parser.SizeRegex, true), + Scope: parser.AnnotationScopeLocation, + Risk: parser.AnnotationRiskLow, + Documentation: `This annotation limits the total size of buffers that can be busy sending a response to the client while the response is not yet fully read. By default proxy busy buffers size is set as "8k".`, + }, proxyCookiePathAnnotation: { Validator: parser.ValidateRegex(parser.URLIsValidRegex, true), Scope: parser.AnnotationScopeLocation, @@ -167,6 +174,7 @@ type Config struct { ReadTimeout int `json:"readTimeout"` BuffersNumber int `json:"buffersNumber"` BufferSize string `json:"bufferSize"` + BusyBuffersSize string `json:"busyBuffersSize"` CookieDomain string `json:"cookieDomain"` CookiePath string `json:"cookiePath"` NextUpstream string `json:"nextUpstream"` @@ -206,6 +214,9 @@ func (l1 *Config) Equal(l2 *Config) bool { if l1.BufferSize != l2.BufferSize { return false } + if l1.BusyBuffersSize != l2.BusyBuffersSize { + return false + } if l1.CookieDomain != l2.CookieDomain { return false } @@ -290,6 +301,11 @@ func (a proxy) Parse(ing *networking.Ingress) (interface{}, error) { config.BufferSize = defBackend.ProxyBufferSize } + config.BusyBuffersSize, err = parser.GetStringAnnotation(proxyBusyBuffersSizeAnnotation, ing, a.annotationConfig.Annotations) + if err != nil { + config.BusyBuffersSize = defBackend.ProxyBusyBuffersSize + } + config.CookiePath, err = parser.GetStringAnnotation(proxyCookiePathAnnotation, ing, a.annotationConfig.Annotations) if err != nil { config.CookiePath = defBackend.ProxyCookiePath diff --git a/internal/ingress/annotations/proxy/main_test.go b/internal/ingress/annotations/proxy/main_test.go index 9446ae970..b6ce07fb2 100644 --- a/internal/ingress/annotations/proxy/main_test.go +++ b/internal/ingress/annotations/proxy/main_test.go @@ -88,6 +88,7 @@ func (m mockBackend) GetDefaultBackend() defaults.Backend { ProxyReadTimeout: 20, ProxyBuffersNumber: 4, ProxyBufferSize: "10k", + ProxyBusyBuffersSize: "15k", ProxyBodySize: "3k", ProxyNextUpstream: "error", ProxyNextUpstreamTimeout: 0, @@ -108,6 +109,7 @@ func TestProxy(t *testing.T) { data[parser.GetAnnotationWithPrefix("proxy-read-timeout")] = "3" data[parser.GetAnnotationWithPrefix("proxy-buffers-number")] = "8" data[parser.GetAnnotationWithPrefix("proxy-buffer-size")] = "1k" + data[parser.GetAnnotationWithPrefix("proxy-busy-buffers-size")] = "4k" data[parser.GetAnnotationWithPrefix("proxy-body-size")] = "2k" data[parser.GetAnnotationWithPrefix("proxy-next-upstream")] = off data[parser.GetAnnotationWithPrefix("proxy-next-upstream-timeout")] = "5" @@ -141,6 +143,9 @@ func TestProxy(t *testing.T) { if p.BufferSize != "1k" { t.Errorf("expected 1k as buffer-size but returned %v", p.BufferSize) } + if p.BusyBuffersSize != "4k" { + t.Errorf("expected 4k as busy-buffers-size but returned %v", p.BusyBuffersSize) + } if p.BodySize != "2k" { t.Errorf("expected 2k as body-size but returned %v", p.BodySize) } @@ -176,6 +181,7 @@ func TestProxyComplex(t *testing.T) { data[parser.GetAnnotationWithPrefix("proxy-read-timeout")] = "3" data[parser.GetAnnotationWithPrefix("proxy-buffers-number")] = "8" data[parser.GetAnnotationWithPrefix("proxy-buffer-size")] = "1k" + data[parser.GetAnnotationWithPrefix("proxy-busy-buffers-size")] = "4k" data[parser.GetAnnotationWithPrefix("proxy-body-size")] = "2k" data[parser.GetAnnotationWithPrefix("proxy-next-upstream")] = "error http_502" data[parser.GetAnnotationWithPrefix("proxy-next-upstream-timeout")] = "5" @@ -209,6 +215,9 @@ func TestProxyComplex(t *testing.T) { if p.BufferSize != "1k" { t.Errorf("expected 1k as buffer-size but returned %v", p.BufferSize) } + if p.BusyBuffersSize != "4k" { + t.Errorf("expected 4k as buffer-size but returned %v", p.BusyBuffersSize) + } if p.BodySize != "2k" { t.Errorf("expected 2k as body-size but returned %v", p.BodySize) } @@ -264,6 +273,9 @@ func TestProxyWithNoAnnotation(t *testing.T) { if p.BufferSize != "10k" { t.Errorf("expected 10k as buffer-size but returned %v", p.BufferSize) } + if p.BusyBuffersSize != "15k" { + t.Errorf("expected 15k as buffer-size but returned %v", p.BusyBuffersSize) + } if p.BodySize != "3k" { t.Errorf("expected 3k as body-size but returned %v", p.BodySize) } diff --git a/internal/ingress/annotations/proxyssl/main.go b/internal/ingress/annotations/proxyssl/main.go index 0e854cd21..c40bc85e0 100644 --- a/internal/ingress/annotations/proxyssl/main.go +++ b/internal/ingress/annotations/proxyssl/main.go @@ -32,7 +32,7 @@ import ( const ( defaultProxySSLCiphers = "DEFAULT" - defaultProxySSLProtocols = "TLSv1 TLSv1.1 TLSv1.2" + defaultProxySSLProtocols = "TLSv1.2" defaultProxySSLVerify = "off" defaultProxySSLVerifyDepth = 1 defaultProxySSLServerName = "off" @@ -40,7 +40,7 @@ const ( var ( proxySSLOnOffRegex = regexp.MustCompile(`^(on|off)$`) - proxySSLProtocolRegex = regexp.MustCompile(`^(SSLv2|SSLv3|TLSv1|TLSv1\.1|TLSv1\.2|TLSv1\.3| )*$`) + proxySSLProtocolRegex = regexp.MustCompile(`^(TLSv1\.2|TLSv1\.3| )*$`) proxySSLCiphersRegex = regexp.MustCompile(`^[A-Za-z0-9\+:\_\-!]*$`) ) diff --git a/internal/ingress/annotations/proxyssl/main_test.go b/internal/ingress/annotations/proxyssl/main_test.go index a20c6813d..cfa31f1d1 100644 --- a/internal/ingress/annotations/proxyssl/main_test.go +++ b/internal/ingress/annotations/proxyssl/main_test.go @@ -32,7 +32,7 @@ const ( proxySslCiphers = "HIGH:-SHA" off = "off" sslServerName = "w00t" - defaultProtocol = "SSLv2 TLSv1 TLSv1.2 TLSv1.3" + defaultProtocol = "TLSv1.2 TLSv1.3" ) func buildIngress() *networking.Ingress { @@ -103,7 +103,7 @@ func TestAnnotations(t *testing.T) { data[parser.GetAnnotationWithPrefix(proxySSLSecretAnnotation)] = defaultDemoSecret data[parser.GetAnnotationWithPrefix("proxy-ssl-ciphers")] = proxySslCiphers data[parser.GetAnnotationWithPrefix("proxy-ssl-name")] = "$host" - data[parser.GetAnnotationWithPrefix("proxy-ssl-protocols")] = "TLSv1.3 SSLv2 TLSv1 TLSv1.2" + data[parser.GetAnnotationWithPrefix("proxy-ssl-protocols")] = "TLSv1.3 TLSv1.2" data[parser.GetAnnotationWithPrefix("proxy-ssl-server-name")] = "on" data[parser.GetAnnotationWithPrefix("proxy-ssl-session-reuse")] = off data[parser.GetAnnotationWithPrefix("proxy-ssl-verify")] = "on" diff --git a/internal/ingress/annotations/redirect/redirect.go b/internal/ingress/annotations/redirect/redirect.go index b58e35171..edc3d279c 100644 --- a/internal/ingress/annotations/redirect/redirect.go +++ b/internal/ingress/annotations/redirect/redirect.go @@ -28,20 +28,26 @@ import ( "k8s.io/ingress-nginx/internal/ingress/resolver" ) -const defaultPermanentRedirectCode = http.StatusMovedPermanently +const ( + defaultPermanentRedirectCode = http.StatusMovedPermanently + defaultTemporalRedirectCode = http.StatusFound +) // Config returns the redirect configuration for an Ingress rule type Config struct { URL string `json:"url"` Code int `json:"code"` FromToWWW bool `json:"fromToWWW"` + Relative bool `json:"relative"` } const ( fromToWWWRedirAnnotation = "from-to-www-redirect" temporalRedirectAnnotation = "temporal-redirect" + temporalRedirectAnnotationCode = "temporal-redirect-code" permanentRedirectAnnotation = "permanent-redirect" permanentRedirectAnnotationCode = "permanent-redirect-code" + relativeRedirectsAnnotation = "relative-redirects" ) var redirectAnnotations = parser.Annotation{ @@ -51,7 +57,7 @@ var redirectAnnotations = parser.Annotation{ Validator: parser.ValidateBool, Scope: parser.AnnotationScopeLocation, Risk: parser.AnnotationRiskLow, // Low, as it allows just a set of options - Documentation: `In some scenarios is required to redirect from www.domain.com to domain.com or vice versa. To enable this feature use this annotation.`, + Documentation: `In some scenarios, it is required to redirect from www.domain.com to domain.com or vice versa, which way the redirect is performed depends on the configured host value in the Ingress object.`, }, temporalRedirectAnnotation: { Validator: parser.ValidateRegex(parser.URLIsValidRegex, false), @@ -60,6 +66,12 @@ var redirectAnnotations = parser.Annotation{ Documentation: `This annotation allows you to return a temporal redirect (Return Code 302) instead of sending data to the upstream. For example setting this annotation to https://www.google.com would redirect everything to Google with a Return Code of 302 (Moved Temporarily).`, }, + temporalRedirectAnnotationCode: { + Validator: parser.ValidateInt, + Scope: parser.AnnotationScopeLocation, + Risk: parser.AnnotationRiskLow, // Low, as it allows just a set of options + Documentation: `This annotation allows you to modify the status code used for temporal redirects.`, + }, permanentRedirectAnnotation: { Validator: parser.ValidateRegex(parser.URLIsValidRegex, false), Scope: parser.AnnotationScopeLocation, @@ -73,6 +85,12 @@ var redirectAnnotations = parser.Annotation{ Risk: parser.AnnotationRiskLow, // Low, as it allows just a set of options Documentation: `This annotation allows you to modify the status code used for permanent redirects.`, }, + relativeRedirectsAnnotation: { + Validator: parser.ValidateBool, + Scope: parser.AnnotationScopeLocation, + Risk: parser.AnnotationRiskLow, + Documentation: `If enabled, redirects issued by nginx will be relative. See https://nginx.org/en/docs/http/ngx_http_core_module.html#absolute_redirect`, + }, }, } @@ -99,20 +117,35 @@ func (r redirect) Parse(ing *networking.Ingress) (interface{}, error) { return nil, err } + rr, err := parser.GetBoolAnnotation(relativeRedirectsAnnotation, ing, r.annotationConfig.Annotations) + if err != nil && !errors.IsMissingAnnotations(err) { + return nil, err + } + tr, err := parser.GetStringAnnotation(temporalRedirectAnnotation, ing, r.annotationConfig.Annotations) if err != nil && !errors.IsMissingAnnotations(err) { return nil, err } if tr != "" { + trc, err := parser.GetIntAnnotation(temporalRedirectAnnotationCode, ing, r.annotationConfig.Annotations) + if err != nil && !errors.IsMissingAnnotations(err) { + return nil, err + } + + if trc < http.StatusMultipleChoices || trc > http.StatusTemporaryRedirect { + trc = defaultTemporalRedirectCode + } + if err := isValidURL(tr); err != nil { return nil, err } return &Config{ URL: tr, - Code: http.StatusFound, + Code: trc, FromToWWW: r3w, + Relative: rr, }, nil } @@ -135,6 +168,13 @@ func (r redirect) Parse(ing *networking.Ingress) (interface{}, error) { URL: pr, Code: prc, FromToWWW: r3w, + Relative: rr, + }, nil + } + + if rr { + return &Config{ + Relative: rr, }, nil } @@ -158,6 +198,9 @@ func (r1 *Config) Equal(r2 *Config) bool { if r1.FromToWWW != r2.FromToWWW { return false } + if r1.Relative != r2.Relative { + return false + } return true } diff --git a/internal/ingress/annotations/redirect/redirect_test.go b/internal/ingress/annotations/redirect/redirect_test.go index bd2f98211..f4734ae5b 100644 --- a/internal/ingress/annotations/redirect/redirect_test.go +++ b/internal/ingress/annotations/redirect/redirect_test.go @@ -103,7 +103,7 @@ func TestPermanentRedirectWithCustomCode(t *testing.T) { } } -func TestTemporalRedirect(t *testing.T) { +func TestTemporalRedirectWithDefaultCode(t *testing.T) { rp := NewParser(resolver.Mock{}) if rp == nil { t.Fatalf("Expected a parser.IngressAnnotation but returned nil") @@ -128,10 +128,49 @@ func TestTemporalRedirect(t *testing.T) { t.Errorf("Expected %v as redirect but returned %s", defRedirectURL, redirect.URL) } if redirect.Code != http.StatusFound { - t.Errorf("Expected %v as redirect to have a code %d but had %d", defRedirectURL, defaultPermanentRedirectCode, redirect.Code) + t.Errorf("Expected %v as redirect to have a code %d but had %d", defRedirectURL, http.StatusFound, redirect.Code) } - if redirect.FromToWWW != true { - t.Errorf("Expected %v as redirect to have from-to-www as %v but got %v", defRedirectURL, true, redirect.FromToWWW) +} + +func TestTemporalRedirectWithCustomCode(t *testing.T) { + rp := NewParser(resolver.Mock{}) + if rp == nil { + t.Fatalf("Expected a parser.IngressAnnotation but returned nil") + } + + testCases := map[string]struct { + input int + expectOutput int + }{ + "valid code": {http.StatusTemporaryRedirect, http.StatusTemporaryRedirect}, + "invalid code": {http.StatusTeapot, http.StatusFound}, + } + + for n, tc := range testCases { + t.Run(n, func(t *testing.T) { + ing := new(networking.Ingress) + + data := make(map[string]string, 2) + data[parser.GetAnnotationWithPrefix(fromToWWWRedirAnnotation)] = "true" + data[parser.GetAnnotationWithPrefix(temporalRedirectAnnotation)] = defRedirectURL + data[parser.GetAnnotationWithPrefix(temporalRedirectAnnotationCode)] = strconv.Itoa(tc.input) + ing.SetAnnotations(data) + + i, err := rp.Parse(ing) + if err != nil { + t.Errorf("Unexpected error with ingress: %v", err) + } + redirect, ok := i.(*Config) + if !ok { + t.Errorf("Expected a Redirect type") + } + if redirect.URL != defRedirectURL { + t.Errorf("Expected %v as redirect but returned %s", defRedirectURL, redirect.URL) + } + if redirect.Code != tc.expectOutput { + t.Errorf("Expected %v as redirect to have a code %d but had %d", defRedirectURL, tc.expectOutput, redirect.Code) + } + }) } } @@ -154,3 +193,22 @@ func TestIsValidURL(t *testing.T) { t.Errorf("expected nil but got %v", err) } } + +func TestParseAnnotations(t *testing.T) { + ing := new(networking.Ingress) + + data := map[string]string{} + data[parser.GetAnnotationWithPrefix(relativeRedirectsAnnotation)] = "true" + ing.SetAnnotations(data) + + _, err := NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + // test ingress using the annotation without a TLS section + _, err = NewParser(&resolver.Mock{}).Parse(ing) + if err != nil { + t.Errorf("unexpected error parsing ingress with relative-redirects") + } +} diff --git a/internal/ingress/annotations/rewrite/main.go b/internal/ingress/annotations/rewrite/main.go index cd9ed3993..d78a004b9 100644 --- a/internal/ingress/annotations/rewrite/main.go +++ b/internal/ingress/annotations/rewrite/main.go @@ -152,14 +152,14 @@ func (a rewrite) Parse(ing *networking.Ingress) (interface{}, error) { config.SSLRedirect, err = parser.GetBoolAnnotation(sslRedirectAnnotation, ing, a.annotationConfig.Annotations) if err != nil { if errors.IsValidationError(err) { - klog.Warningf("%sis invalid, defaulting to '%s'", sslRedirectAnnotation, a.r.GetDefaultBackend().SSLRedirect) + klog.Warningf("%s is invalid, defaulting to '%t'", sslRedirectAnnotation, a.r.GetDefaultBackend().SSLRedirect) } config.SSLRedirect = a.r.GetDefaultBackend().SSLRedirect } config.PreserveTrailingSlash, err = parser.GetBoolAnnotation(preserveTrailingSlashAnnotation, ing, a.annotationConfig.Annotations) if err != nil { if errors.IsValidationError(err) { - klog.Warningf("%sis invalid, defaulting to '%s'", preserveTrailingSlashAnnotation, a.r.GetDefaultBackend().PreserveTrailingSlash) + klog.Warningf("%s is invalid, defaulting to '%t'", preserveTrailingSlashAnnotation, a.r.GetDefaultBackend().PreserveTrailingSlash) } config.PreserveTrailingSlash = a.r.GetDefaultBackend().PreserveTrailingSlash } @@ -167,7 +167,7 @@ func (a rewrite) Parse(ing *networking.Ingress) (interface{}, error) { config.ForceSSLRedirect, err = parser.GetBoolAnnotation(forceSSLRedirectAnnotation, ing, a.annotationConfig.Annotations) if err != nil { if errors.IsValidationError(err) { - klog.Warningf("%sis invalid, defaulting to '%s'", forceSSLRedirectAnnotation, a.r.GetDefaultBackend().ForceSSLRedirect) + klog.Warningf("%s is invalid, defaulting to '%t'", forceSSLRedirectAnnotation, a.r.GetDefaultBackend().ForceSSLRedirect) } config.ForceSSLRedirect = a.r.GetDefaultBackend().ForceSSLRedirect } @@ -175,7 +175,7 @@ func (a rewrite) Parse(ing *networking.Ingress) (interface{}, error) { config.UseRegex, err = parser.GetBoolAnnotation(useRegexAnnotation, ing, a.annotationConfig.Annotations) if err != nil { if errors.IsValidationError(err) { - klog.Warningf("%sis invalid, defaulting to 'false'", useRegexAnnotation) + klog.Warningf("%s is invalid, defaulting to 'false'", useRegexAnnotation) } config.UseRegex = false } diff --git a/internal/ingress/annotations/serversnippet/main.go b/internal/ingress/annotations/serversnippet/main.go index aa15608d0..bce764e69 100644 --- a/internal/ingress/annotations/serversnippet/main.go +++ b/internal/ingress/annotations/serversnippet/main.go @@ -33,7 +33,7 @@ var serverSnippetAnnotations = parser.Annotation{ serverSnippetAnnotation: { Validator: parser.ValidateNull, Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskCritical, // Critical, this annotation is not validated at all and allows arbitrary configutations + Risk: parser.AnnotationRiskCritical, // Critical, this annotation is not validated at all and allows arbitrary configurations Documentation: `This annotation allows setting a custom NGINX configuration on a server block. This annotation does not contain any validation and it's usage is not recommended!`, }, }, diff --git a/internal/ingress/annotations/serviceupstream/main.go b/internal/ingress/annotations/serviceupstream/main.go index d1851bc7b..7819d87d8 100644 --- a/internal/ingress/annotations/serviceupstream/main.go +++ b/internal/ingress/annotations/serviceupstream/main.go @@ -34,7 +34,7 @@ var serviceUpstreamAnnotations = parser.Annotation{ serviceUpstreamAnnotation: { Validator: parser.ValidateBool, Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskLow, // Critical, this annotation is not validated at all and allows arbitrary configutations + Risk: parser.AnnotationRiskLow, // Critical, this annotation is not validated at all and allows arbitrary configurations Documentation: `This annotation makes NGINX use Service's Cluster IP and Port instead of Endpoints as the backend endpoints`, }, }, diff --git a/internal/ingress/annotations/sessionaffinity/main.go b/internal/ingress/annotations/sessionaffinity/main.go index cc2095de4..bee4a2094 100644 --- a/internal/ingress/annotations/sessionaffinity/main.go +++ b/internal/ingress/annotations/sessionaffinity/main.go @@ -129,7 +129,7 @@ var sessionAffinityAnnotations = parser.Annotation{ Documentation: `This annotation defines the Domain attribute of the sticky cookie.`, }, annotationAffinityCookieSameSite: { - Validator: parser.ValidateOptions([]string{"None", "Lax", "Strict"}, false, true), + Validator: parser.ValidateOptions([]string{"none", "lax", "strict"}, false, true), Scope: parser.AnnotationScopeIngress, Risk: parser.AnnotationRiskLow, Documentation: `This annotation is used to apply a SameSite attribute to the sticky cookie. diff --git a/internal/ingress/annotations/sessionaffinity/main_test.go b/internal/ingress/annotations/sessionaffinity/main_test.go index cecf8cf8f..4b7ea5e61 100644 --- a/internal/ingress/annotations/sessionaffinity/main_test.go +++ b/internal/ingress/annotations/sessionaffinity/main_test.go @@ -79,6 +79,7 @@ func TestIngressAffinityCookieConfig(t *testing.T) { data[parser.GetAnnotationWithPrefix(annotationAffinityCookieMaxAge)] = "3000" data[parser.GetAnnotationWithPrefix(annotationAffinityCookiePath)] = "/foo" data[parser.GetAnnotationWithPrefix(annotationAffinityCookieDomain)] = "foo.bar" + data[parser.GetAnnotationWithPrefix(annotationAffinityCookieSameSite)] = "Strict" data[parser.GetAnnotationWithPrefix(annotationAffinityCookieChangeOnFailure)] = "true" data[parser.GetAnnotationWithPrefix(annotationAffinityCookieSecure)] = "true" ing.SetAnnotations(data) @@ -121,6 +122,10 @@ func TestIngressAffinityCookieConfig(t *testing.T) { t.Errorf("expected foo.bar as session-cookie-domain but returned %v", nginxAffinity.Cookie.Domain) } + if nginxAffinity.Cookie.SameSite != "Strict" { + t.Errorf("expected Strict as session-cookie-same-site but returned %v", nginxAffinity.Cookie.SameSite) + } + if !nginxAffinity.Cookie.ChangeOnFailure { t.Errorf("expected change of failure parameter set to true but returned %v", nginxAffinity.Cookie.ChangeOnFailure) } diff --git a/internal/ingress/annotations/snippet/main.go b/internal/ingress/annotations/snippet/main.go index 2406093c5..c2df84cdd 100644 --- a/internal/ingress/annotations/snippet/main.go +++ b/internal/ingress/annotations/snippet/main.go @@ -33,7 +33,7 @@ var configurationSnippetAnnotations = parser.Annotation{ configurationSnippetAnnotation: { Validator: parser.ValidateNull, Scope: parser.AnnotationScopeLocation, - Risk: parser.AnnotationRiskCritical, // Critical, this annotation is not validated at all and allows arbitrary configutations + Risk: parser.AnnotationRiskCritical, // Critical, this annotation is not validated at all and allows arbitrary configurations Documentation: `This annotation allows setting a custom NGINX configuration on a location block. This annotation does not contain any validation and it's usage is not recommended!`, }, }, diff --git a/internal/ingress/annotations/sslcipher/main.go b/internal/ingress/annotations/sslcipher/main.go index 685ef90bf..3cfd903bd 100644 --- a/internal/ingress/annotations/sslcipher/main.go +++ b/internal/ingress/annotations/sslcipher/main.go @@ -32,7 +32,8 @@ const ( ) // Should cover something like "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP" -var regexValidSSLCipher = regexp.MustCompile(`^[A-Za-z0-9!:+\-]*$`) +// (?:@STRENGTH) is included twice so it can appear before or after @SECLEVEL=n +var regexValidSSLCipher = regexp.MustCompile(`^(?:(?:[A-Za-z0-9!:+\-])*(?:@STRENGTH)*(?:@SECLEVEL=[0-5])*(?:@STRENGTH)*)*$`) var sslCipherAnnotations = parser.Annotation{ Group: "backend", @@ -42,7 +43,7 @@ var sslCipherAnnotations = parser.Annotation{ Scope: parser.AnnotationScopeIngress, Risk: parser.AnnotationRiskLow, Documentation: `The following annotation will set the ssl_prefer_server_ciphers directive at the server level. - This configuration specifies that server ciphers should be preferred over client ciphers when using the SSLv3 and TLS protocols.`, + This configuration specifies that server ciphers should be preferred over client ciphers when using the TLS protocols.`, }, sslCipherAnnotation: { Validator: parser.ValidateRegex(regexValidSSLCipher, true), diff --git a/internal/ingress/annotations/sslcipher/main_test.go b/internal/ingress/annotations/sslcipher/main_test.go index 20cb4d7af..f1675d4c7 100644 --- a/internal/ingress/annotations/sslcipher/main_test.go +++ b/internal/ingress/annotations/sslcipher/main_test.go @@ -42,6 +42,10 @@ func TestParse(t *testing.T) { expectErr bool }{ {map[string]string{annotationSSLCiphers: "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP"}, Config{"ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP", ""}, false}, + {map[string]string{annotationSSLCiphers: "ALL:!aNULL:!EXPORT56@SECLEVEL=2:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP"}, Config{"ALL:!aNULL:!EXPORT56@SECLEVEL=2:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP", ""}, false}, + {map[string]string{annotationSSLCiphers: "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP@STRENGTH"}, Config{"ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP@STRENGTH", ""}, false}, + {map[string]string{annotationSSLCiphers: "ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP@STRENGTH@SECLEVEL=3"}, Config{"ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP@STRENGTH@SECLEVEL=3", ""}, false}, + {map[string]string{annotationSSLCiphers: "ALL:!aNULL:!EXPORT56:RC4+RSA@STRENGTH:+HIGH@SECLEVEL=5:+MEDIUM:+LOW:+SSLv2:+EXP"}, Config{"ALL:!aNULL:!EXPORT56:RC4+RSA@STRENGTH:+HIGH@SECLEVEL=5:+MEDIUM:+LOW:+SSLv2:+EXP", ""}, false}, { map[string]string{annotationSSLCiphers: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"}, Config{"ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256", ""}, diff --git a/internal/ingress/annotations/streamsnippet/main.go b/internal/ingress/annotations/streamsnippet/main.go index 71ff3b140..7743d3fee 100644 --- a/internal/ingress/annotations/streamsnippet/main.go +++ b/internal/ingress/annotations/streamsnippet/main.go @@ -33,7 +33,7 @@ var streamSnippetAnnotations = parser.Annotation{ streamSnippetAnnotation: { Validator: parser.ValidateNull, Scope: parser.AnnotationScopeIngress, - Risk: parser.AnnotationRiskCritical, // Critical, this annotation is not validated at all and allows arbitrary configutations + Risk: parser.AnnotationRiskCritical, // Critical, this annotation is not validated at all and allows arbitrary configurations Documentation: `This annotation allows setting a custom NGINX configuration on a stream block. This annotation does not contain any validation and it's usage is not recommended!`, }, }, diff --git a/internal/ingress/annotations/xforwardedprefix/main.go b/internal/ingress/annotations/xforwardedprefix/main.go index 530afbb01..54bb7199a 100644 --- a/internal/ingress/annotations/xforwardedprefix/main.go +++ b/internal/ingress/annotations/xforwardedprefix/main.go @@ -31,10 +31,11 @@ var xForwardedForAnnotations = parser.Annotation{ Group: "backend", Annotations: parser.AnnotationFields{ xForwardedForPrefixAnnotation: { - Validator: parser.ValidateRegex(parser.BasicCharsRegex, true), - Scope: parser.AnnotationScopeLocation, - Risk: parser.AnnotationRiskLow, // Low, as it allows regexes but on a very limited set - Documentation: `This annotation can be used to add the non-standard X-Forwarded-Prefix header to the upstream request with a string value`, + Validator: parser.ValidateRegex(parser.RegexPathWithCapture, true), + Scope: parser.AnnotationScopeLocation, + Risk: parser.AnnotationRiskMedium, + Documentation: `This annotation can be used to add the non-standard X-Forwarded-Prefix header to the upstream request with a string value. It can + contain regular characters and captured groups specified as '$1', '$2', etc.`, }, }, } diff --git a/internal/ingress/annotations/xforwardedprefix/main_test.go b/internal/ingress/annotations/xforwardedprefix/main_test.go index f28b6b10e..977e7d372 100644 --- a/internal/ingress/annotations/xforwardedprefix/main_test.go +++ b/internal/ingress/annotations/xforwardedprefix/main_test.go @@ -40,6 +40,7 @@ func TestParse(t *testing.T) { {map[string]string{annotation: "true"}, "true"}, {map[string]string{annotation: "1"}, "1"}, {map[string]string{annotation: ""}, ""}, + {map[string]string{annotation: "/$1"}, "/$1"}, {map[string]string{}, ""}, {nil, ""}, } diff --git a/internal/ingress/controller/checker_test.go b/internal/ingress/controller/checker_test.go index 5fb6b09fd..a8a0b67ad 100644 --- a/internal/ingress/controller/checker_test.go +++ b/internal/ingress/controller/checker_test.go @@ -53,7 +53,7 @@ func TestNginxCheck(t *testing.T) { server := &httptest.Server{ Listener: listener, Config: &http.Server{ - Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + Handler: http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "ok") }), diff --git a/internal/ingress/controller/config/config.go b/internal/ingress/controller/config/config.go index 56fd2699f..beac1405d 100644 --- a/internal/ingress/controller/config/config.go +++ b/internal/ingress/controller/config/config.go @@ -20,9 +20,8 @@ import ( "strconv" "time" - "k8s.io/klog/v2" - apiv1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" "k8s.io/ingress-nginx/internal/ingress/defaults" "k8s.io/ingress-nginx/pkg/apis/ingress" @@ -46,7 +45,7 @@ const ( // that tell browsers that it should only be communicated with using HTTPS, instead of using HTTP. // https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security // max-age is the time, in seconds, that the browser should remember that this site is only to be accessed using HTTPS. - hstsMaxAge = "15724800" + hstsMaxAge = "31536000" gzipTypes = "application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component" @@ -120,7 +119,7 @@ type Configuration struct { // By default this is disabled AllowBackendServerHeader bool `json:"allow-backend-server-header"` - // AccessLogParams sets additionals params for access_log + // AccessLogParams sets additional params for access_log // http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log // By default it's empty AccessLogParams string `json:"access-log-params,omitempty"` @@ -319,11 +318,6 @@ type Configuration struct { NginxStatusIpv4Whitelist []string `json:"nginx-status-ipv4-whitelist,omitempty"` NginxStatusIpv6Whitelist []string `json:"nginx-status-ipv6-whitelist,omitempty"` - // Plugins configures plugins to use placed in the directory /etc/nginx/lua/plugins. - // Every plugin has to have main.lua in the root. Every plugin has to bundle all of its dependencies. - // The execution order follows the definition. - Plugins []string `json:"plugins,omitempty"` - // If UseProxyProtocol is enabled ProxyRealIPCIDR defines the default the IP/network address // of your external load balancer ProxyRealIPCIDR []string `json:"proxy-real-ip-cidr,omitempty"` @@ -424,7 +418,7 @@ type Configuration struct { // Example '60s' ProxyProtocolHeaderTimeout time.Duration `json:"proxy-protocol-header-timeout,omitempty"` - // Enables or disables the directive aio_write that writes files files asynchronously + // Enables or disables the directive aio_write that writes files asynchronously // https://nginx.org/en/docs/http/ngx_http_core_module.html#aio_write EnableAioWrite bool `json:"enable-aio-write,omitempty"` @@ -432,14 +426,14 @@ type Configuration struct { // http://nginx.org/en/docs/http/ngx_http_gzip_module.html UseGzip bool `json:"use-gzip,omitempty"` - // Enables or disables the use of the nginx geoip module that creates variables with values depending on the client IP - // http://nginx.org/en/docs/http/ngx_http_geoip_module.html - UseGeoIP bool `json:"use-geoip,omitempty"` - // UseGeoIP2 enables the geoip2 module for NGINX // By default this is disabled UseGeoIP2 bool `json:"use-geoip2,omitempty"` + // GeoIP2AutoReloadMinutes enables autoreload on geoip2 setting the interval in minutes + // By default this is disabled using 0 + GeoIP2AutoReloadMinutes int `json:"geoip2-autoreload-in-minutes,omitempty"` + // Enables or disables the use of the NGINX Brotli Module for compression // https://github.com/google/ngx_brotli EnableBrotli bool `json:"enable-brotli,omitempty"` @@ -478,6 +472,13 @@ type Configuration struct { // http://nginx.org/en/docs/ngx_core_module.html#worker_processes WorkerProcesses string `json:"worker-processes,omitempty"` + // Defines whether multiple concurrent reloads of worker processes should occur. + // Set this to false to prevent more than n x 2 workers to exist at any time, to avoid potential OOM situations and high CPU load + // With this setting on false, configuration changes in the queue will be re-queued with an exponential backoff, until the number of worker process is the expected value. + // By default new worker processes are spawned every time there's a change that cannot be applied dynamically with no upper limit to the number of running workers + // http://nginx.org/en/docs/ngx_core_module.html#worker_processes + WorkerSerialReloads bool `json:"enable-serial-reloads,omitempty"` + // Defines a timeout for a graceful shutdown of worker processes // http://nginx.org/en/docs/ngx_core_module.html#worker_shutdown_timeout WorkerShutdownTimeout string `json:"worker-shutdown-timeout,omitempty"` @@ -544,6 +545,14 @@ type Configuration struct { // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version ProxyHTTPVersion string `json:"proxy-http-version"` + // Disables NGINX proxy-intercept-errors when error_page/custom-http-errors are set + // https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors + DisableProxyInterceptErrors bool `json:"disable-proxy-intercept-errors,omitempty"` + + // Disable absolute redirects and enables relative redirects. + // https://nginx.org/en/docs/http/ngx_http_core_module.html#absolute_redirect + RelativeRedirects bool `json:"relative-redirects"` + // Sets the ipv4 addresses on which the server will accept requests. BindAddressIpv4 []string `json:"bind-address-ipv4,omitempty"` @@ -572,22 +581,6 @@ type Configuration struct { // Default: true ProxyAddOriginalURIHeader bool `json:"proxy-add-original-uri-header"` - // EnableOpentracing enables the nginx Opentracing extension - // https://github.com/opentracing-contrib/nginx-opentracing - // By default this is disabled - EnableOpentracing bool `json:"enable-opentracing"` - - // OpentracingOperationName specifies a custom name for the server span - OpentracingOperationName string `json:"opentracing-operation-name"` - - // OpentracingOperationName specifies a custom name for the location span - OpentracingLocationOperationName string `json:"opentracing-location-operation-name"` - - // OpentracingTrustIncomingSpan sets whether or not to trust incoming trace spans - // If false, incoming span headers will be rejected - // Default: true - OpentracingTrustIncomingSpan bool `json:"opentracing-trust-incoming-span"` - // EnableOpentelemetry enables the nginx Opentelemetry extension // By default this is disabled EnableOpentelemetry bool `json:"enable-opentelemetry"` @@ -623,7 +616,7 @@ type Configuration struct { // Default: 0.01 OtelSamplerRatio float32 `json:"otel-sampler-ratio"` - // OtelSamplerParentBased specifies the parent based sampler to be use for any traces created + // OtelSamplerParentBased specifies the parent based sampler to be used for any traces created // Default: true OtelSamplerParentBased bool `json:"otel-sampler-parent-based"` @@ -639,94 +632,6 @@ type Configuration struct { // Default: 512 OtelMaxExportBatchSize int32 `json:"otel-max-export-batch-size"` - // ZipkinCollectorHost specifies the host to use when uploading traces - ZipkinCollectorHost string `json:"zipkin-collector-host"` - - // ZipkinCollectorPort specifies the port to use when uploading traces - // Default: 9411 - ZipkinCollectorPort int `json:"zipkin-collector-port"` - - // ZipkinServiceName specifies the service name to use for any traces created - // Default: nginx - ZipkinServiceName string `json:"zipkin-service-name"` - - // ZipkinSampleRate specifies sampling rate for traces - // Default: 1.0 - ZipkinSampleRate float32 `json:"zipkin-sample-rate"` - - // JaegerCollectorHost specifies the host to use when uploading traces - JaegerCollectorHost string `json:"jaeger-collector-host"` - - // JaegerCollectorPort specifies the port to use when uploading traces - // Default: 6831 - JaegerCollectorPort int `json:"jaeger-collector-port"` - - // JaegerEndpoint specifies the enpoint to use when uploading traces to a collector over TCP - JaegerEndpoint string `json:"jaeger-endpoint"` - - // JaegerServiceName specifies the service name to use for any traces created - // Default: nginx - JaegerServiceName string `json:"jaeger-service-name"` - - // JaegerPropagationFormat specifies the traceparent/tracestate propagation format - JaegerPropagationFormat string `json:"jaeger-propagation-format"` - - // JaegerSamplerType specifies the sampler to be used when sampling traces. - // The available samplers are: const, probabilistic, ratelimiting, remote - // Default: const - JaegerSamplerType string `json:"jaeger-sampler-type"` - - // JaegerSamplerParam specifies the argument to be passed to the sampler constructor - // Default: 1 - JaegerSamplerParam string `json:"jaeger-sampler-param"` - - // JaegerSamplerHost specifies the host used for remote sampling consultation - // Default: http://127.0.0.1 - JaegerSamplerHost string `json:"jaeger-sampler-host"` - - // JaegerSamplerHost specifies the host used for remote sampling consultation - // Default: 5778 - JaegerSamplerPort int `json:"jaeger-sampler-port"` - - // JaegerTraceContextHeaderName specifies the header name used for passing trace context - // Default: uber-trace-id - JaegerTraceContextHeaderName string `json:"jaeger-trace-context-header-name"` - - // JaegerDebugHeader specifies the header name used for force sampling - // Default: jaeger-debug-id - JaegerDebugHeader string `json:"jaeger-debug-header"` - - // JaegerBaggageHeader specifies the header name used to submit baggage if there is no root span - // Default: jaeger-baggage - JaegerBaggageHeader string `json:"jaeger-baggage-header"` - - // TraceBaggageHeaderPrefix specifies the header prefix used to propagate baggage - // Default: uberctx- - JaegerTraceBaggageHeaderPrefix string `json:"jaeger-tracer-baggage-header-prefix"` - - // DatadogCollectorHost specifies the datadog agent host to use when uploading traces - DatadogCollectorHost string `json:"datadog-collector-host"` - - // DatadogCollectorPort specifies the port to use when uploading traces - // Default: 8126 - DatadogCollectorPort int `json:"datadog-collector-port"` - - // DatadogEnvironment specifies the environment this trace belongs to. - // Default: prod - DatadogEnvironment string `json:"datadog-environment"` - - // DatadogServiceName specifies the service name to use for any traces created - // Default: nginx - DatadogServiceName string `json:"datadog-service-name"` - - // DatadogOperationNameOverride overrides the operation naem to use for any traces crated - // Default: nginx.handle - DatadogOperationNameOverride string `json:"datadog-operation-name-override"` - - // DatadogSampleRate specifies sample rate for any traces created. - // Default: use a dynamic rate instead - DatadogSampleRate *float32 `json:"datadog-sample-rate,omitempty"` - // MainSnippet adds custom configuration to the main section of the nginx configuration MainSnippet string `json:"main-snippet"` @@ -808,7 +713,7 @@ type Configuration struct { DefaultSSLCertificate *ingress.SSLCert `json:"-"` // ProxySSLLocationOnly controls whether the proxy-ssl parameters defined in the - // proxy-ssl-* annotations are applied on on location level only in the nginx.conf file + // proxy-ssl-* annotations are applied on location level only in the nginx.conf file // Default is that those are applied on server level, too ProxySSLLocationOnly bool `json:"proxy-ssl-location-only"` @@ -817,31 +722,6 @@ type Configuration struct { // Default: text/html DefaultType string `json:"default-type"` - // GlobalRateLimitMemcachedHost configures memcached host. - GlobalRateLimitMemcachedHost string `json:"global-rate-limit-memcached-host"` - - // GlobalRateLimitMemcachedPort configures memcached port. - GlobalRateLimitMemcachedPort int `json:"global-rate-limit-memcached-port"` - - // GlobalRateLimitMemcachedConnectTimeout configures timeout when connecting to memcached. - // The unit is millisecond. - GlobalRateLimitMemcachedConnectTimeout int `json:"global-rate-limit-memcached-connect-timeout"` - - // GlobalRateLimitMemcachedMaxIdleTimeout configured how long connections - // should be kept alive in idle state. The unit is millisecond. - GlobalRateLimitMemcachedMaxIdleTimeout int `json:"global-rate-limit-memcached-max-idle-timeout"` - - // GlobalRateLimitMemcachedPoolSize configures how many connections - // should be kept alive in the pool. - // Note that this is per NGINX worker. Make sure your memcached server can - // handle `MemcachedPoolSize * * ` - // simultaneous connections. - GlobalRateLimitMemcachedPoolSize int `json:"global-rate-limit-memcached-pool-size"` - - // GlobalRateLimitStatucCode determines the HTTP status code to return - // when limit is exceeding during global rate limiting. - GlobalRateLimitStatucCode int `json:"global-rate-limit-status-code"` - // DebugConnections Enables debugging log for selected client connections // http://nginx.org/en/docs/ngx_core_module.html#debug_connection // Default: "" @@ -852,6 +732,11 @@ type Configuration struct { // alphanumeric chars, "-", "_", "/".In case of additional characters, // like used on Rewrite configurations the user should use pathType as ImplementationSpecific StrictValidatePathType bool `json:"strict-validate-path-type"` + + // GRPCBufferSizeKb Sets the size of the buffer used for reading the response received + // from the gRPC server. The response is passed to the client synchronously, + // as soon as it is received. + GRPCBufferSizeKb int `json:"grpc-buffer-size-kb"` } // NewDefault returns the default nginx configuration @@ -870,10 +755,10 @@ func NewDefault() Configuration { cfg := Configuration{ AllowSnippetAnnotations: false, - AllowCrossNamespaceResources: true, + AllowCrossNamespaceResources: false, AllowBackendServerHeader: false, AnnotationValueWordBlocklist: "", - AnnotationsRiskLevel: "Critical", + AnnotationsRiskLevel: "High", AccessLogPath: "/var/log/nginx/access.log", AccessLogParams: "", EnableAccessLogForDefaultBackend: false, @@ -944,93 +829,80 @@ func NewDefault() Configuration { EnableBrotli: false, EnableAioWrite: true, UseGzip: false, - UseGeoIP: true, UseGeoIP2: false, + GeoIP2AutoReloadMinutes: 0, WorkerProcesses: strconv.Itoa(runtime.NumCPU()), + WorkerSerialReloads: false, WorkerShutdownTimeout: "240s", VariablesHashBucketSize: 256, VariablesHashMaxSize: 2048, UseHTTP2: true, + DisableProxyInterceptErrors: false, + RelativeRedirects: false, ProxyStreamTimeout: "600s", ProxyStreamNextUpstream: true, ProxyStreamNextUpstreamTimeout: "600s", ProxyStreamNextUpstreamTries: 3, Backend: defaults.Backend{ - ProxyBodySize: bodySize, - ProxyConnectTimeout: 5, - ProxyReadTimeout: 60, - ProxySendTimeout: 60, - ProxyBuffersNumber: 4, - ProxyBufferSize: "4k", - ProxyCookieDomain: "off", - ProxyCookiePath: "off", - ProxyNextUpstream: "error timeout", - ProxyNextUpstreamTimeout: 0, - ProxyNextUpstreamTries: 3, - ProxyRequestBuffering: "on", - ProxyRedirectFrom: "off", - ProxyRedirectTo: "off", - PreserveTrailingSlash: false, - SSLRedirect: true, - CustomHTTPErrors: []int{}, - DenylistSourceRange: []string{}, - WhitelistSourceRange: []string{}, - SkipAccessLogURLs: []string{}, - LimitRate: 0, - LimitRateAfter: 0, - ProxyBuffering: "off", - ProxyHTTPVersion: "1.1", - ProxyMaxTempFileSize: "1024m", - ServiceUpstream: false, + ProxyBodySize: bodySize, + ProxyConnectTimeout: 5, + ProxyReadTimeout: 60, + ProxySendTimeout: 60, + ProxyBuffersNumber: 4, + ProxyBufferSize: "4k", + ProxyBusyBuffersSize: "8k", + ProxyCookieDomain: "off", + ProxyCookiePath: "off", + ProxyNextUpstream: "error timeout", + ProxyNextUpstreamTimeout: 0, + ProxyNextUpstreamTries: 3, + ProxyRequestBuffering: "on", + ProxyRedirectFrom: "off", + ProxyRedirectTo: "off", + PreserveTrailingSlash: false, + SSLRedirect: true, + CustomHTTPErrors: []int{}, + DisableProxyInterceptErrors: false, + RelativeRedirects: false, + DenylistSourceRange: []string{}, + WhitelistSourceRange: []string{}, + SkipAccessLogURLs: []string{}, + LimitRate: 0, + LimitRateAfter: 0, + ProxyBuffering: "off", + ProxyHTTPVersion: "1.1", + ProxyMaxTempFileSize: "1024m", + ServiceUpstream: false, + AllowedResponseHeaders: []string{}, }, - UpstreamKeepaliveConnections: 320, - UpstreamKeepaliveTime: "1h", - UpstreamKeepaliveTimeout: 60, - UpstreamKeepaliveRequests: 10000, - LimitConnZoneVariable: defaultLimitConnZoneVariable, - BindAddressIpv4: defBindAddress, - BindAddressIpv6: defBindAddress, - OpentracingTrustIncomingSpan: true, - OpentelemetryTrustIncomingSpan: true, - OpentelemetryConfig: "/etc/nginx/opentelemetry.toml", - OtlpCollectorPort: "4317", - OtelServiceName: "nginx", - OtelSampler: "AlwaysOn", - OtelSamplerRatio: 0.01, - OtelSamplerParentBased: true, - OtelScheduleDelayMillis: 5000, - OtelMaxExportBatchSize: 512, - OtelMaxQueueSize: 2048, - ZipkinCollectorPort: 9411, - ZipkinServiceName: "nginx", - ZipkinSampleRate: 1.0, - JaegerCollectorPort: 6831, - JaegerPropagationFormat: "jaeger", - JaegerServiceName: "nginx", - JaegerSamplerType: "const", - JaegerSamplerParam: "1", - JaegerSamplerPort: 5778, - JaegerSamplerHost: "http://127.0.0.1", - DatadogServiceName: "nginx", - DatadogEnvironment: "prod", - DatadogCollectorPort: 8126, - DatadogOperationNameOverride: "nginx.handle", - DatadogSampleRate: nil, - LimitReqStatusCode: 503, - LimitConnStatusCode: 503, - SyslogPort: 514, - NoTLSRedirectLocations: "/.well-known/acme-challenge", - NoAuthLocations: "/.well-known/acme-challenge", - GlobalExternalAuth: defGlobalExternalAuth, - ProxySSLLocationOnly: false, - DefaultType: "text/html", - GlobalRateLimitMemcachedPort: 11211, - GlobalRateLimitMemcachedConnectTimeout: 50, - GlobalRateLimitMemcachedMaxIdleTimeout: 10000, - GlobalRateLimitMemcachedPoolSize: 50, - GlobalRateLimitStatucCode: 429, - DebugConnections: []string{}, - StrictValidatePathType: false, // TODO: This will be true in future releases + UpstreamKeepaliveConnections: 320, + UpstreamKeepaliveTime: "1h", + UpstreamKeepaliveTimeout: 60, + UpstreamKeepaliveRequests: 10000, + LimitConnZoneVariable: defaultLimitConnZoneVariable, + BindAddressIpv4: defBindAddress, + BindAddressIpv6: defBindAddress, + OpentelemetryTrustIncomingSpan: true, + OpentelemetryConfig: "/etc/ingress-controller/telemetry/opentelemetry.toml", + OtlpCollectorPort: "4317", + OtelServiceName: "nginx", + OtelSampler: "AlwaysOn", + OtelSamplerRatio: 0.01, + OtelSamplerParentBased: true, + OtelScheduleDelayMillis: 5000, + OtelMaxExportBatchSize: 512, + OtelMaxQueueSize: 2048, + LimitReqStatusCode: 503, + LimitConnStatusCode: 503, + SyslogPort: 514, + NoTLSRedirectLocations: "/.well-known/acme-challenge", + NoAuthLocations: "/.well-known/acme-challenge", + GlobalExternalAuth: defGlobalExternalAuth, + ProxySSLLocationOnly: false, + DefaultType: "text/html", + DebugConnections: []string{}, + StrictValidatePathType: true, + GRPCBufferSizeKb: 0, } if klog.V(5).Enabled() { diff --git a/internal/ingress/controller/controller.go b/internal/ingress/controller/controller.go index bbcde1d4f..652a80e49 100644 --- a/internal/ingress/controller/controller.go +++ b/internal/ingress/controller/controller.go @@ -91,6 +91,7 @@ type Configuration struct { UpdateStatus bool UseNodeInternalIP bool ElectionID string + ElectionTTL time.Duration UpdateStatusOnShutdown bool HealthCheckHost string @@ -100,13 +101,18 @@ type Configuration struct { EnableSSLPassthrough bool + DisableLeaderElection bool + EnableProfiling bool - EnableMetrics bool - MetricsPerHost bool - MetricsBuckets *collectors.HistogramBuckets - ReportStatusClasses bool - ExcludeSocketMetrics []string + EnableMetrics bool + MetricsPerHost bool + MetricsPerUndefinedHost bool + MetricsBuckets *collectors.HistogramBuckets + MetricsBucketFactor float64 + MetricsMaxBuckets uint32 + ReportStatusClasses bool + ExcludeSocketMetrics []string FakeCertificate *ingress.SSLCert @@ -250,9 +256,8 @@ func (n *NGINXController) syncIngress(interface{}) error { } ri := utilingress.GetRemovedIngresses(n.runningConfig, pcfg) - re := utilingress.GetRemovedHosts(n.runningConfig, pcfg) rc := utilingress.GetRemovedCertificateSerialNumbers(n.runningConfig, pcfg) - n.metricCollector.RemoveMetrics(ri, re, rc) + n.metricCollector.RemoveMetrics(ri, rc) n.runningConfig = pcfg @@ -375,10 +380,6 @@ func (n *NGINXController) CheckIngress(ing *networking.Ingress) error { if !cfg.AllowSnippetAnnotations && strings.HasSuffix(key, "-snippet") { return fmt.Errorf("%s annotation cannot be used. Snippet directives are disabled by the Ingress administrator", key) } - - if cfg.GlobalRateLimitMemcachedHost == "" && strings.HasPrefix(key, fmt.Sprintf("%s/%s", parser.AnnotationsPrefix, "global-rate-limit")) { - return fmt.Errorf("'global-rate-limit*' annotations require 'global-rate-limit-memcached-host' settings configured in the global configmap") - } } k8s.SetDefaultNGINXPathType(ing) @@ -1254,6 +1255,7 @@ func (n *NGINXController) createServers(data []*ingress.Ingress, ReadTimeout: bdef.ProxyReadTimeout, BuffersNumber: bdef.ProxyBuffersNumber, BufferSize: bdef.ProxyBufferSize, + BusyBuffersSize: bdef.ProxyBusyBuffersSize, CookieDomain: bdef.ProxyCookieDomain, CookiePath: bdef.ProxyCookiePath, NextUpstream: bdef.ProxyNextUpstream, @@ -1502,17 +1504,16 @@ func (n *NGINXController) createServers(data []*ingress.Ingress, func locationApplyAnnotations(loc *ingress.Location, anns *annotations.Ingress) { loc.BasicDigestAuth = anns.BasicDigestAuth loc.ClientBodyBufferSize = anns.ClientBodyBufferSize + loc.CustomHeaders = anns.CustomHeaders loc.ConfigurationSnippet = anns.ConfigurationSnippet loc.CorsConfig = anns.CorsConfig loc.ExternalAuth = anns.ExternalAuth loc.EnableGlobalAuth = anns.EnableGlobalAuth loc.HTTP2PushPreload = anns.HTTP2PushPreload - loc.Opentracing = anns.Opentracing loc.Opentelemetry = anns.Opentelemetry loc.Proxy = anns.Proxy loc.ProxySSL = anns.ProxySSL loc.RateLimit = anns.RateLimit - loc.GlobalRateLimit = anns.GlobalRateLimit loc.Redirect = anns.Redirect loc.Rewrite = anns.Rewrite loc.UpstreamVhost = anns.UpstreamVhost @@ -1527,6 +1528,7 @@ func locationApplyAnnotations(loc *ingress.Location, anns *annotations.Ingress) loc.BackendProtocol = anns.BackendProtocol loc.FastCGI = anns.FastCGI loc.CustomHTTPErrors = anns.CustomHTTPErrors + loc.DisableProxyInterceptErrors = anns.DisableProxyInterceptErrors loc.ModSecurity = anns.ModSecurity loc.Satisfy = anns.Satisfy loc.Mirror = anns.Mirror @@ -1591,7 +1593,11 @@ func mergeAlternativeBackends(ing *ingress.Ingress, upstreams map[string]*ingres altEqualsPri := false for _, loc := range servers[defServerName].Locations { - priUps := upstreams[loc.Backend] + priUps, ok := upstreams[loc.Backend] + if !ok { + klog.Warningf("cannot find primary backend %s for location %s%s", loc.Backend, servers[defServerName].Hostname, loc.Path) + continue + } altEqualsPri = altUps.Name == priUps.Name if altEqualsPri { klog.Warningf("alternative upstream %s in Ingress %s/%s is primary upstream in Other Ingress for location %s%s!", @@ -1650,7 +1656,11 @@ func mergeAlternativeBackends(ing *ingress.Ingress, upstreams map[string]*ingres // find matching paths for _, loc := range server.Locations { - priUps := upstreams[loc.Backend] + priUps, ok := upstreams[loc.Backend] + if !ok { + klog.Warningf("cannot find primary backend %s for location %s%s", loc.Backend, server.Hostname, loc.Path) + continue + } altEqualsPri = altUps.Name == priUps.Name if altEqualsPri { klog.Warningf("alternative upstream %s in Ingress %s/%s is primary upstream in Other Ingress for location %s%s!", diff --git a/internal/ingress/controller/controller_test.go b/internal/ingress/controller/controller_test.go index c07fcfadf..9d3fea470 100644 --- a/internal/ingress/controller/controller_test.go +++ b/internal/ingress/controller/controller_test.go @@ -170,7 +170,7 @@ func (fakeTemplate) Write(conf *ngx_config.TemplateConfig) ([]byte, error) { func TestCheckIngress(t *testing.T) { defer func() { - err := filepath.Walk(os.TempDir(), func(path string, info os.FileInfo, err error) error { + err := filepath.Walk(os.TempDir(), func(path string, info os.FileInfo, _ error) error { if info.IsDir() && os.TempDir() != path { return filepath.SkipDir } @@ -1292,6 +1292,74 @@ func TestMergeAlternativeBackends(t *testing.T) { }, }, }, + "alternative backend does not merge for missing upstream": { + &ingress.Ingress{ + Ingress: networking.Ingress{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "example", + }, + Spec: networking.IngressSpec{ + Rules: []networking.IngressRule{ + { + Host: "example.com", + IngressRuleValue: networking.IngressRuleValue{ + HTTP: &networking.HTTPIngressRuleValue{ + Paths: []networking.HTTPIngressPath{ + { + Path: "/", + PathType: &pathTypePrefix, + Backend: networking.IngressBackend{ + Service: &networking.IngressServiceBackend{ + Name: "http-svc-canary", + Port: networking.ServiceBackendPort{ + Number: 80, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + map[string]*ingress.Backend{ + "example-http-svc-canary-80": { + Name: "example-http-svc-canary-80", + NoServer: true, + TrafficShapingPolicy: ingress.TrafficShapingPolicy{ + Weight: 20, + }, + }, + }, + map[string]*ingress.Server{ + "example.com": { + Hostname: "example.com", + Locations: []*ingress.Location{ + { + Path: "/", + PathType: &pathTypePrefix, + Backend: "example-http-svc-80", + }, + }, + }, + }, + map[string]*ingress.Backend{}, + map[string]*ingress.Server{ + "example.com": { + Hostname: "example.com", + Locations: []*ingress.Location{ + { + Path: "/", + PathType: &pathTypePrefix, + Backend: "example-http-svc-80", + }, + }, + }, + }, + }, } for title, tc := range testCases { @@ -1573,7 +1641,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 1 { t.Errorf("servers count should be 1, got %d", len(servers)) return @@ -1640,7 +1708,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 1 { t.Errorf("servers count should be 1, got %d", len(servers)) return @@ -1700,7 +1768,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 1 { t.Errorf("servers count should be 1, got %d", len(servers)) return @@ -1799,7 +1867,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 2 { t.Errorf("servers count should be 2, got %d", len(servers)) return @@ -2059,7 +2127,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 2 { t.Errorf("servers count should be 2, got %d", len(servers)) return @@ -2190,7 +2258,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(ingresses []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 2 { t.Errorf("servers count should be 2, got %d", len(servers)) return @@ -2298,7 +2366,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(ingresses []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 2 { t.Errorf("servers count should be 2, got %d", len(servers)) return @@ -2367,7 +2435,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 2 { t.Errorf("servers count should be 1, got %d", len(servers)) return @@ -2437,7 +2505,7 @@ func TestGetBackendServers(t *testing.T) { }, }, }, - Validate: func(ingresses []*ingress.Ingress, upstreams []*ingress.Backend, servers []*ingress.Server) { + Validate: func(_ []*ingress.Ingress, _ []*ingress.Backend, servers []*ingress.Server) { if len(servers) != 2 { t.Errorf("servers count should be 2, got %d", len(servers)) return diff --git a/internal/ingress/controller/endpointslices.go b/internal/ingress/controller/endpointslices.go index 4f98e3ce7..ed46e2c85 100644 --- a/internal/ingress/controller/endpointslices.go +++ b/internal/ingress/controller/endpointslices.go @@ -115,7 +115,7 @@ func getEndpointsFromSlices(s *corev1.Service, port *corev1.ServicePort, proto c useTopologyHints = false if zoneForHints != emptyZone { useTopologyHints = true - // check if all endpointslices has zone hints + // check if all endpointslices have zone hints for _, ep := range eps.Endpoints { if ep.Hints == nil || len(ep.Hints.ForZones) == 0 { useTopologyHints = false diff --git a/internal/ingress/controller/location.go b/internal/ingress/controller/location.go index 9776f8c87..221c089c2 100644 --- a/internal/ingress/controller/location.go +++ b/internal/ingress/controller/location.go @@ -100,7 +100,7 @@ func normalizePrefixPath(path string) string { } func needsRewrite(location *ingress.Location) bool { - if len(location.Rewrite.Target) > 0 && location.Rewrite.Target != location.Path { + if location.Rewrite.Target != "" && location.Rewrite.Target != location.Path { return true } diff --git a/internal/ingress/controller/nginx.go b/internal/ingress/controller/nginx.go index 30f785586..20fad5afb 100644 --- a/internal/ingress/controller/nginx.go +++ b/internal/ingress/controller/nginx.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "io/fs" "net" "net/http" "os" @@ -34,6 +35,7 @@ import ( "syscall" "text/template" "time" + "unicode" proxyproto "github.com/armon/go-proxyproto" "github.com/eapache/channels" @@ -86,9 +88,10 @@ func NewNGINXController(config *Configuration, mc metric.Collector) *NGINXContro n := &NGINXController{ isIPV6Enabled: ing_net.IsIPv6Enabled(), - resolver: h, - cfg: config, - syncRateLimiter: flowcontrol.NewTokenBucketRateLimiter(config.SyncRateLimit, 1), + resolver: h, + cfg: config, + syncRateLimiter: flowcontrol.NewTokenBucketRateLimiter(config.SyncRateLimit, 1), + workersReloading: false, recorder: eventBroadcaster.NewRecorder(scheme.Scheme, apiv1.EventSource{ Component: "nginx-ingress-controller", @@ -180,7 +183,11 @@ func NewNGINXController(config *Configuration, mc metric.Collector) *NGINXContro } filesToWatch := []string{} - err = filepath.Walk("/etc/nginx/geoip/", func(path string, info os.FileInfo, err error) error { + + if err := os.Mkdir("/etc/ingress-controller/geoip/", 0o755); err != nil && !os.IsExist(err) { + klog.Fatalf("Error creating geoip dir: %v", err) + } + err = filepath.WalkDir("/etc/ingress-controller/geoip/", func(path string, info fs.DirEntry, err error) error { if err != nil { return err } @@ -192,14 +199,16 @@ func NewNGINXController(config *Configuration, mc metric.Collector) *NGINXContro filesToWatch = append(filesToWatch, path) return nil }) - if err != nil { klog.Fatalf("Error creating file watchers: %v", err) } for _, f := range filesToWatch { + // This redeclaration is necessary for the closure to get the correct value for the iteration in go versions <1.22 + // See https://go.dev/blog/loopvar-preview + f := f _, err = file.NewFileWatcher(f, func() { - klog.InfoS("File changed detected. Reloading NGINX", "path", f) + klog.InfoS("File change detected. Reloading NGINX", "path", f) n.syncQueue.EnqueueTask(task.GetDummyObject("file-change")) }) if err != nil { @@ -222,6 +231,8 @@ type NGINXController struct { syncRateLimiter flowcontrol.RateLimiter + workersReloading bool + // stopLock is used to enforce that only a single call to Stop send at // a given time. We allow stopping through an HTTP endpoint and // allowing concurrent stoppers leads to stack traces. @@ -266,26 +277,29 @@ func (n *NGINXController) Start() { // TODO: For now, as the the IngressClass logics has changed, is up to the // cluster admin to create different Leader Election IDs. // Should revisit this in a future - electionID := n.cfg.ElectionID - setupLeaderElection(&leaderElectionConfig{ - Client: n.cfg.Client, - ElectionID: electionID, - OnStartedLeading: func(stopCh chan struct{}) { - if n.syncStatus != nil { - go n.syncStatus.Run(stopCh) - } + if !n.cfg.DisableLeaderElection { + electionID := n.cfg.ElectionID + setupLeaderElection(&leaderElectionConfig{ + Client: n.cfg.Client, + ElectionID: electionID, + ElectionTTL: n.cfg.ElectionTTL, + OnStartedLeading: func(stopCh chan struct{}) { + if n.syncStatus != nil { + go n.syncStatus.Run(stopCh) + } - n.metricCollector.OnStartedLeading(electionID) - // manually update SSL expiration metrics - // (to not wait for a reload) - n.metricCollector.SetSSLExpireTime(n.runningConfig.Servers) - n.metricCollector.SetSSLInfo(n.runningConfig.Servers) - }, - OnStoppedLeading: func() { - n.metricCollector.OnStoppedLeading(electionID) - }, - }) + n.metricCollector.OnStartedLeading(electionID) + // manually update SSL expiration metrics + // (to not wait for a reload) + n.metricCollector.SetSSLExpireTime(n.runningConfig.Servers) + n.metricCollector.SetSSLInfo(n.runningConfig.Servers) + }, + OnStoppedLeading: func() { + n.metricCollector.OnStoppedLeading(electionID) + }, + }) + } cmd := n.command.ExecCommand() @@ -629,8 +643,7 @@ func (n *NGINXController) testTemplate(cfg []byte) error { if len(cfg) == 0 { return fmt.Errorf("invalid NGINX configuration (empty)") } - tmpDir := os.TempDir() + "/nginx" - tmpfile, err := os.CreateTemp(tmpDir, tempNginxPattern) + tmpfile, err := os.CreateTemp(filepath.Join(os.TempDir(), "nginx"), tempNginxPattern) if err != nil { return err } @@ -666,16 +679,20 @@ func (n *NGINXController) OnUpdate(ingressCfg ingress.Configuration) error { cfg := n.store.GetBackendConfiguration() cfg.Resolver = n.resolver + workerSerialReloads := cfg.WorkerSerialReloads + if workerSerialReloads && n.workersReloading { + return errors.New("worker reload already in progress, requeuing reload") + } + content, err := n.generateTemplate(cfg, ingressCfg) if err != nil { return err } - err = createOpentracingCfg(&cfg) + err = n.createLuaConfig(&cfg) if err != nil { return err } - err = createOpentelemetryCfg(&cfg) if err != nil { return err @@ -733,9 +750,41 @@ func (n *NGINXController) OnUpdate(ingressCfg ingress.Configuration) error { return fmt.Errorf("%v\n%v", err, string(o)) } + // Reload status checking runs in a separate goroutine to avoid blocking the sync queue + if workerSerialReloads { + go n.awaitWorkersReload() + } + return nil } +// awaitWorkersReload checks if the number of workers has returned to the expected count +func (n *NGINXController) awaitWorkersReload() { + n.workersReloading = true + defer func() { n.workersReloading = false }() + + expectedWorkers := n.store.GetBackendConfiguration().WorkerProcesses + var numWorkers string + klog.V(3).Infof("waiting for worker count to be equal to %s", expectedWorkers) + for numWorkers != expectedWorkers { + time.Sleep(time.Second) + o, err := exec.Command("/bin/sh", "-c", "pgrep worker | wc -l").Output() + if err != nil { + klog.ErrorS(err, numWorkers) + return + } + // cleanup any non-printable chars from shell output + numWorkers = strings.Map(func(r rune) rune { + if unicode.IsPrint(r) { + return r + } + return -1 + }, string(o)) + + klog.V(3).Infof("Currently running nginx worker processes: %s, expected %s", numWorkers, expectedWorkers) + } +} + // nginxHashBucketSize computes the correct NGINX hash_bucket_size for a hash // with the given longest key. func nginxHashBucketSize(longestString int) int { @@ -996,33 +1045,6 @@ func configureCertificates(rawServers []*ingress.Server) error { return nil } -const zipkinTmpl = `{ - "service_name": "{{ .ZipkinServiceName }}", - "collector_host": "{{ .ZipkinCollectorHost }}", - "collector_port": {{ .ZipkinCollectorPort }}, - "sample_rate": {{ .ZipkinSampleRate }} -}` - -const jaegerTmpl = `{ - "service_name": "{{ .JaegerServiceName }}", - "propagation_format": "{{ .JaegerPropagationFormat }}", - "sampler": { - "type": "{{ .JaegerSamplerType }}", - "param": {{ .JaegerSamplerParam }}, - "samplingServerURL": "{{ .JaegerSamplerHost }}:{{ .JaegerSamplerPort }}/sampling" - }, - "reporter": { - "endpoint": "{{ .JaegerEndpoint }}", - "localAgentHostPort": "{{ .JaegerCollectorHost }}:{{ .JaegerCollectorPort }}" - }, - "headers": { - "TraceContextHeaderName": "{{ .JaegerTraceContextHeaderName }}", - "jaegerDebugHeader": "{{ .JaegerDebugHeader }}", - "jaegerBaggageHeader": "{{ .JaegerBaggageHeader }}", - "traceBaggageHeaderPrefix": "{{ .JaegerTraceBaggageHeaderPrefix }}" - } -}` - const otelTmpl = ` exporter = "otlp" processor = "batch" @@ -1046,70 +1068,6 @@ ratio = {{ .OtelSamplerRatio }} parent_based = {{ .OtelSamplerParentBased }} ` -func datadogOpentracingCfg(cfg *ngx_config.Configuration) (string, error) { - m := map[string]interface{}{ - "service": cfg.DatadogServiceName, - "agent_host": cfg.DatadogCollectorHost, - "agent_port": cfg.DatadogCollectorPort, - "environment": cfg.DatadogEnvironment, - "operation_name_override": cfg.DatadogOperationNameOverride, - } - - // Omit "sample_rate" if the configuration's sample rate is unset (nil). - // Omitting "sample_rate" from the plugin JSON indicates to the tracer that - // it should use dynamic rates instead of a configured rate. - if cfg.DatadogSampleRate != nil { - m["sample_rate"] = *cfg.DatadogSampleRate - } - - buf, err := json.Marshal(m) - if err != nil { - return "", err - } - - return string(buf), nil -} - -func opentracingCfgFromTemplate(cfg *ngx_config.Configuration, tmplName, tmplText string) (string, error) { - tmpl, err := template.New(tmplName).Parse(tmplText) - if err != nil { - return "", err - } - - tmplBuf := bytes.NewBuffer(make([]byte, 0)) - err = tmpl.Execute(tmplBuf, cfg) - if err != nil { - return "", err - } - - return tmplBuf.String(), nil -} - -func createOpentracingCfg(cfg *ngx_config.Configuration) error { - var configData string - var err error - - switch { - case cfg.ZipkinCollectorHost != "": - configData, err = opentracingCfgFromTemplate(cfg, "zipkin", zipkinTmpl) - case cfg.JaegerCollectorHost != "" || cfg.JaegerEndpoint != "": - configData, err = opentracingCfgFromTemplate(cfg, "jaeger", jaegerTmpl) - case cfg.DatadogCollectorHost != "": - configData, err = datadogOpentracingCfg(cfg) - default: - configData = "{}" - } - - if err != nil { - return err - } - - // Expand possible environment variables before writing the configuration to file. - expanded := os.ExpandEnv(configData) - - return os.WriteFile("/etc/nginx/opentracing.json", []byte(expanded), file.ReadWriteByUser) -} - func createOpentelemetryCfg(cfg *ngx_config.Configuration) error { tmpl, err := template.New("otel").Parse(otelTmpl) if err != nil { @@ -1124,14 +1082,40 @@ func createOpentelemetryCfg(cfg *ngx_config.Configuration) error { return os.WriteFile(cfg.OpentelemetryConfig, tmplBuf.Bytes(), file.ReadWriteByUser) } +func (n *NGINXController) createLuaConfig(cfg *ngx_config.Configuration) error { + luaconfigs := &ngx_template.LuaConfig{ + EnableMetrics: n.cfg.EnableMetrics, + ListenPorts: ngx_template.LuaListenPorts{ + HTTPSPort: strconv.Itoa(n.cfg.ListenPorts.HTTPS), + StatusPort: strconv.Itoa(nginx.StatusPort), + SSLProxyPort: strconv.Itoa(n.cfg.ListenPorts.SSLProxy), + }, + UseProxyProtocol: cfg.UseProxyProtocol, + UseForwardedHeaders: cfg.UseForwardedHeaders, + IsSSLPassthroughEnabled: n.cfg.EnableSSLPassthrough, + HTTPRedirectCode: cfg.HTTPRedirectCode, + EnableOCSP: cfg.EnableOCSP, + MonitorBatchMaxSize: n.cfg.MonitorMaxBatchSize, + HSTS: cfg.HSTS, + HSTSMaxAge: cfg.HSTSMaxAge, + HSTSIncludeSubdomains: cfg.HSTSIncludeSubdomains, + HSTSPreload: cfg.HSTSPreload, + } + jsonCfg, err := json.Marshal(luaconfigs) + if err != nil { + return err + } + return os.WriteFile(luaCfgPath, jsonCfg, file.ReadWriteByUser) +} + func cleanTempNginxCfg() error { var files []string - err := filepath.Walk(os.TempDir(), func(path string, info os.FileInfo, err error) error { + err := filepath.Walk(filepath.Join(os.TempDir(), "nginx"), func(path string, info os.FileInfo, err error) error { if err != nil { return err } - if info.IsDir() && os.TempDir() != path { + if info.IsDir() && path != filepath.Join(os.TempDir(), "nginx") { return filepath.SkipDir } @@ -1150,7 +1134,7 @@ func cleanTempNginxCfg() error { } for _, file := range files { - err := os.Remove(file) + err = os.Remove(file) if err != nil { return err } diff --git a/internal/ingress/controller/nginx_test.go b/internal/ingress/controller/nginx_test.go index c68b0b188..fc0a5b6d2 100644 --- a/internal/ingress/controller/nginx_test.go +++ b/internal/ingress/controller/nginx_test.go @@ -361,10 +361,11 @@ func TestCleanTempNginxCfg(t *testing.T) { t.Fatal(err) } - tmpfile, err := os.CreateTemp("", tempNginxPattern) + tmpfile, err := os.CreateTemp(filepath.Join(os.TempDir(), "nginx"), tempNginxPattern) if err != nil { t.Fatal(err) } + expectedDeletedFile := tmpfile.Name() defer tmpfile.Close() dur, err := time.ParseDuration("-10m") @@ -378,10 +379,11 @@ func TestCleanTempNginxCfg(t *testing.T) { t.Fatal(err) } - tmpfile, err = os.CreateTemp("", tempNginxPattern) + tmpfile, err = os.CreateTemp(filepath.Join(os.TempDir(), "nginx"), tempNginxPattern) if err != nil { t.Fatal(err) } + expectedFile := tmpfile.Name() defer tmpfile.Close() err = cleanTempNginxCfg() @@ -391,8 +393,8 @@ func TestCleanTempNginxCfg(t *testing.T) { var files []string - err = filepath.Walk(os.TempDir(), func(path string, info os.FileInfo, err error) error { - if info.IsDir() && os.TempDir() != path { + err = filepath.Walk(filepath.Join(os.TempDir(), "nginx"), func(path string, info os.FileInfo, _ error) error { + if info.IsDir() && filepath.Join(os.TempDir(), "nginx") != path { return filepath.SkipDir } @@ -405,12 +407,22 @@ func TestCleanTempNginxCfg(t *testing.T) { t.Fatal(err) } - if len(files) != 1 { - t.Errorf("expected one file but %d were found", len(files)) + // some other files can be created by other tests + var found bool + for _, file := range files { + if file == expectedDeletedFile { + t.Errorf("file %s should be deleted", file) + } + if file == expectedFile { + found = true + } + } + if !found { + t.Errorf("file %s should not be deleted", expectedFile) } } -//nolint:unparam // Ingnore `network` always receives `"tcp"` error +//nolint:unparam // Ignore `network` always receives `"tcp"` error func tryListen(network, address string) (l net.Listener, err error) { condFunc := func() (bool, error) { l, err = net.Listen(network, address) diff --git a/internal/ingress/controller/status.go b/internal/ingress/controller/status.go index e061b2cb7..5a169e1c3 100644 --- a/internal/ingress/controller/status.go +++ b/internal/ingress/controller/status.go @@ -36,7 +36,8 @@ import ( type leaderElectionConfig struct { Client clientset.Interface - ElectionID string + ElectionID string + ElectionTTL time.Duration OnStartedLeading func(chan struct{}) OnStoppedLeading func() @@ -59,7 +60,7 @@ func setupLeaderElection(config *leaderElectionConfig) { var stopCh chan struct{} callbacks := leaderelection.LeaderCallbacks{ - OnStartedLeading: func(ctx context.Context) { + OnStartedLeading: func(_ context.Context) { klog.V(2).InfoS("I am the new leader") stopCh = make(chan struct{}) @@ -107,13 +108,11 @@ func setupLeaderElection(config *leaderElectionConfig) { LockConfig: resourceLockConfig, } - ttl := 30 * time.Second - elector, err = leaderelection.NewLeaderElector(leaderelection.LeaderElectionConfig{ Lock: lock, - LeaseDuration: ttl, - RenewDeadline: ttl / 2, - RetryPeriod: ttl / 4, + LeaseDuration: config.ElectionTTL, + RenewDeadline: config.ElectionTTL / 2, + RetryPeriod: config.ElectionTTL / 4, Callbacks: callbacks, }) diff --git a/internal/ingress/controller/store/endpointslice_test.go b/internal/ingress/controller/store/endpointslice_test.go index 5d423a3a6..0bdb3aa33 100644 --- a/internal/ingress/controller/store/endpointslice_test.go +++ b/internal/ingress/controller/store/endpointslice_test.go @@ -88,7 +88,7 @@ func TestEndpointSliceLister(t *testing.T) { } eps, err := el.MatchByKey(key) if err != nil { - t.Errorf("unexpeted error %v", err) + t.Errorf("unexpected error %v", err) } if err == nil && len(eps) != 1 { t.Errorf("expected one slice %v, error, got %d slices", endpointSlice, len(eps)) @@ -130,7 +130,7 @@ func TestEndpointSliceLister(t *testing.T) { } eps, err := el.MatchByKey(key) if err != nil { - t.Errorf("unexpeted error %v", err) + t.Errorf("unexpected error %v", err) } if len(eps) != 1 { t.Errorf("expected one slice %v, error, got %d slices", endpointSlice, len(eps)) diff --git a/internal/ingress/controller/store/store.go b/internal/ingress/controller/store/store.go index 918dfd41a..d4bd6136f 100644 --- a/internal/ingress/controller/store/store.go +++ b/internal/ingress/controller/store/store.go @@ -240,6 +240,8 @@ type k8sStore struct { backendConfigMu *sync.RWMutex defaultSSLCertificate string + + recorder record.EventRecorder } // New creates a new object store to be used in the ingress controller. @@ -279,6 +281,7 @@ func New( recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{ Component: "nginx-ingress-controller", }) + store.recorder = recorder // k8sStore fulfills resolver.Resolver interface store.annotations = annotations.NewAnnotationExtractor(store) @@ -292,7 +295,7 @@ func New( // the memory consumption of nginx-ingress-controller explode. // In order to avoid that we filter out labels OWNER=TILLER. labelsTweakListOptionsFunc := func(options *metav1.ListOptions) { - if len(options.LabelSelector) > 0 { + if options.LabelSelector != "" { options.LabelSelector += ",OWNER!=TILLER" } else { options.LabelSelector = "OWNER!=TILLER" @@ -938,6 +941,9 @@ func (s *k8sStore) syncIngress(ing *networkingv1.Ingress) { klog.Error(err) return } + if parsed.Denied != nil { + s.recorder.Eventf(ing, corev1.EventTypeWarning, "AnnotationParsingFailed", fmt.Sprintf("Error parsing annotations: %v", *parsed.Denied)) + } err = s.listers.IngressWithAnnotation.Update(&ingress.Ingress{ Ingress: *copyIng, ParsedAnnotations: parsed, @@ -1215,7 +1221,7 @@ func (s *k8sStore) setConfig(cmap *corev1.ConfigMap) { s.backendConfig.UseGeoIP2 = false } - s.writeSSLSessionTicketKey(cmap, "/etc/nginx/tickets.key") + s.writeSSLSessionTicketKey(cmap, "/etc/ingress-controller/tickets.key") } // Run initiates the synchronization of the informers and the initial diff --git a/internal/ingress/controller/store/store_test.go b/internal/ingress/controller/store/store_test.go index 317c0f36c..9c719af3b 100644 --- a/internal/ingress/controller/store/store_test.go +++ b/internal/ingress/controller/store/store_test.go @@ -1208,13 +1208,13 @@ func TestStore(t *testing.T) { } }(updateCh) - namesapceSelector, err := labels.Parse("foo=bar") + namespaceSelector, err := labels.Parse("foo=bar") if err != nil { t.Errorf("unexpected error: %v", err) } storer := New( ns, - namesapceSelector, + namespaceSelector, fmt.Sprintf("%v/config", ns), fmt.Sprintf("%v/tcp", ns), fmt.Sprintf("%v/udp", ns), @@ -1274,7 +1274,7 @@ func TestStore(t *testing.T) { t.Errorf("expected 0 events of type Delete but %v occurred", del) } }) - // test add ingress with secret it doesn't exists and then add secret + // test add ingress with secret it doesn't exist and then add secret // check secret is generated on fs // check ocsp // check invalid secret (missing crt) diff --git a/internal/ingress/controller/template/configmap.go b/internal/ingress/controller/template/configmap.go index 9dc019bcc..febf20be0 100644 --- a/internal/ingress/controller/template/configmap.go +++ b/internal/ingress/controller/template/configmap.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/ingress-nginx/internal/ingress/annotations/authreq" + "k8s.io/ingress-nginx/internal/ingress/annotations/customheaders" "k8s.io/ingress-nginx/internal/ingress/annotations/parser" "k8s.io/ingress-nginx/internal/ingress/controller/config" ing_net "k8s.io/ingress-nginx/internal/net" @@ -54,6 +55,7 @@ const ( nginxStatusIpv6Whitelist = "nginx-status-ipv6-whitelist" proxyHeaderTimeout = "proxy-protocol-header-timeout" workerProcesses = "worker-processes" + globalAllowedResponseHeaders = "global-allowed-response-headers" globalAuthURL = "global-auth-url" globalAuthMethod = "global-auth-method" globalAuthSignin = "global-auth-signin" @@ -65,8 +67,8 @@ const ( globalAuthCacheDuration = "global-auth-cache-duration" globalAuthAlwaysSetCookie = "global-auth-always-set-cookie" luaSharedDictsKey = "lua-shared-dicts" - plugins = "plugins" debugConnections = "debug-connections" + workerSerialReloads = "enable-serial-reloads" ) var ( @@ -80,7 +82,6 @@ var ( "balancer_ewma_locks": 1024, "certificate_servers": 5120, "ocsp_response_cache": 5120, // keep this same as certificate_servers - "global_throttle_cache": 10240, } defaultGlobalAuthRedirectParam = "rd" ) @@ -115,6 +116,7 @@ func ReadConfig(src map[string]string) config.Configuration { blockUserAgentList := make([]string, 0) blockRefererList := make([]string, 0) responseHeaders := make([]string, 0) + allowedResponseHeaders := make([]string, 0) luaSharedDicts := make(map[string]int) debugConnectionsList := make([]string, 0) @@ -123,8 +125,11 @@ func ReadConfig(src map[string]string) config.Configuration { delete(conf, luaSharedDictsKey) lsd := splitAndTrimSpace(val, ",") for _, v := range lsd { - v = strings.ReplaceAll(v, " ", "") - results := strings.SplitN(v, ":", 2) + results := strings.SplitN(strings.ReplaceAll(v, " ", ""), ":", 2) + if len(results) != 2 { + klog.Errorf("Ignoring poorly formatted Lua dictionary %v", v) + continue + } dictName := results[0] size := dictStrToKb(results[1]) if size < 0 { @@ -248,6 +253,22 @@ func ReadConfig(src map[string]string) config.Configuration { } } + // Verify that the configured global external authorization response headers are valid. if not, set the default value + if val, ok := conf[globalAllowedResponseHeaders]; ok { + delete(conf, globalAllowedResponseHeaders) + + if val != "" { + harr := splitAndTrimSpace(val, ",") + for _, header := range harr { + if !customheaders.ValidHeader(header) { + klog.Warningf("Global allowed response headers denied - %s.", header) + } else { + allowedResponseHeaders = append(allowedResponseHeaders, header) + } + } + } + } + // Verify that the configured global external authorization method is a valid HTTP method. if not, set the default value if val, ok := conf[globalAuthMethod]; ok { delete(conf, globalAuthMethod) @@ -385,9 +406,15 @@ func ReadConfig(src map[string]string) config.Configuration { delete(conf, workerProcesses) } - if val, ok := conf[plugins]; ok { - to.Plugins = splitAndTrimSpace(val, ",") - delete(conf, plugins) + if val, ok := conf[workerSerialReloads]; ok { + boolVal, err := strconv.ParseBool(val) + if err != nil { + to.WorkerSerialReloads = false + klog.Warningf("failed to parse enable-serial-reloads setting, valid values are true or false, found %s", val) + } else { + to.WorkerSerialReloads = boolVal + } + delete(conf, workerSerialReloads) } if val, ok := conf[debugConnections]; ok { @@ -422,6 +449,7 @@ func ReadConfig(src map[string]string) config.Configuration { to.ProxyStreamResponses = streamResponses to.DisableIpv6DNS = !ing_net.IsIPv6Enabled() to.LuaSharedDicts = luaSharedDicts + to.Backend.AllowedResponseHeaders = allowedResponseHeaders decoderConfig := &mapstructure.DecoderConfig{ Metadata: nil, diff --git a/internal/ingress/controller/template/configmap_test.go b/internal/ingress/controller/template/configmap_test.go index dad841694..6c7468303 100644 --- a/internal/ingress/controller/template/configmap_test.go +++ b/internal/ingress/controller/template/configmap_test.go @@ -390,6 +390,11 @@ func TestLuaSharedDictsParsing(t *testing.T) { entry: map[string]string{"lua-shared-dicts": "configuration_data: 10, my_random_dict:15 , another_example:2"}, expect: map[string]int{"configuration_data": 10240, "my_random_dict": 15360, "another_example": 2048}, }, + { + name: "invalid format", + entry: map[string]string{"lua-shared-dicts": "mydict: 10, invalid_dict 100"}, + expect: map[string]int{"mydict": 10240}, + }, { name: "invalid size value should be ignored", entry: map[string]string{"lua-shared-dicts": "mydict: 10, invalid_dict: 1a, bad_mb_dict:10mb"}, diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index 6702e08db..ed052e4ec 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -136,6 +136,13 @@ func cleanConf(in, out *bytes.Buffer) error { case ' ', '\t': needOutput = lineStarted case '\r': + rest := in.Bytes() + if len(rest) > 0 { + if rest[0] != '\n' { + c = ' ' + needOutput = lineStarted + } + } case '\n': needOutput = !(!lineStarted && emptyLineWritten) nextLineStarted = false @@ -150,6 +157,13 @@ func cleanConf(in, out *bytes.Buffer) error { case stateComment: switch c { case '\r': + rest := in.Bytes() + if len(rest) > 0 { + if rest[0] != '\n' { + c = ' ' + needOutput = lineStarted + } + } case '\n': needOutput = true nextLineStarted = false @@ -180,6 +194,41 @@ func cleanConf(in, out *bytes.Buffer) error { } } +/* LuaConfig defines the structure that will be written as a config for lua scripts +The json format should follow what's expected by lua: + use_forwarded_headers = %t, + use_proxy_protocol = %t, + is_ssl_passthrough_enabled = %t, + http_redirect_code = %v, + listen_ports = { ssl_proxy = "%v", https = "%v" }, + + hsts = %t, + hsts_max_age = %v, + hsts_include_subdomains = %t, + hsts_preload = %t, +*/ + +type LuaConfig struct { + EnableMetrics bool `json:"enable_metrics"` + ListenPorts LuaListenPorts `json:"listen_ports"` + UseForwardedHeaders bool `json:"use_forwarded_headers"` + UseProxyProtocol bool `json:"use_proxy_protocol"` + IsSSLPassthroughEnabled bool `json:"is_ssl_passthrough_enabled"` + HTTPRedirectCode int `json:"http_redirect_code"` + EnableOCSP bool `json:"enable_ocsp"` + MonitorBatchMaxSize int `json:"monitor_batch_max_size"` + HSTS bool `json:"hsts"` + HSTSMaxAge string `json:"hsts_max_age"` + HSTSIncludeSubdomains bool `json:"hsts_include_subdomains"` + HSTSPreload bool `json:"hsts_preload"` +} + +type LuaListenPorts struct { + HTTPSPort string `json:"https"` + StatusPort string `json:"status_port"` + SSLProxyPort string `json:"ssl_proxy"` +} + // Write populates a buffer using a template with NGINX configuration // and the servers and upstreams created by Ingress rules func (t *Template) Write(conf *config.TemplateConfig) ([]byte, error) { @@ -242,7 +291,6 @@ var funcMap = text_template.FuncMap{ "filterRateLimits": filterRateLimits, "buildRateLimitZones": buildRateLimitZones, "buildRateLimit": buildRateLimit, - "configForLua": configForLua, "locationConfigForLua": locationConfigForLua, "buildResolvers": buildResolvers, "buildUpstreamName": buildUpstreamName, @@ -268,7 +316,6 @@ var funcMap = text_template.FuncMap{ "buildForwardedFor": buildForwardedFor, "buildAuthSignURL": buildAuthSignURL, "buildAuthSignURLLocation": buildAuthSignURLLocation, - "buildOpentracing": buildOpentracing, "buildOpentelemetry": buildOpentelemetry, "proxySetHeader": proxySetHeader, "enforceRegexModifier": enforceRegexModifier, @@ -277,9 +324,7 @@ var funcMap = text_template.FuncMap{ "shouldLoadModSecurityModule": shouldLoadModSecurityModule, "buildHTTPListener": buildHTTPListener, "buildHTTPSListener": buildHTTPSListener, - "buildOpentracingForLocation": buildOpentracingForLocation, "buildOpentelemetryForLocation": buildOpentelemetryForLocation, - "shouldLoadOpentracingModule": shouldLoadOpentracingModule, "shouldLoadOpentelemetryModule": shouldLoadOpentelemetryModule, "buildModSecurityForLocation": buildModSecurityForLocation, "buildMirrorLocations": buildMirrorLocations, @@ -372,54 +417,6 @@ func luaConfigurationRequestBodySize(c interface{}) string { return dictKbToStr(size) } -// configForLua returns some general configuration as Lua table represented as string -func configForLua(input interface{}) string { - all, ok := input.(config.TemplateConfig) - if !ok { - klog.Errorf("expected a 'config.TemplateConfig' type but %T was given", input) - return "{}" - } - - return fmt.Sprintf(`{ - use_forwarded_headers = %t, - use_proxy_protocol = %t, - is_ssl_passthrough_enabled = %t, - http_redirect_code = %v, - listen_ports = { ssl_proxy = "%v", https = "%v" }, - - hsts = %t, - hsts_max_age = %v, - hsts_include_subdomains = %t, - hsts_preload = %t, - - global_throttle = { - memcached = { - host = "%v", port = %d, connect_timeout = %d, max_idle_timeout = %d, pool_size = %d, - }, - status_code = %d, - } - }`, - all.Cfg.UseForwardedHeaders, - all.Cfg.UseProxyProtocol, - all.IsSSLPassthroughEnabled, - all.Cfg.HTTPRedirectCode, - all.ListenPorts.SSLProxy, - all.ListenPorts.HTTPS, - - all.Cfg.HSTS, - all.Cfg.HSTSMaxAge, - all.Cfg.HSTSIncludeSubdomains, - all.Cfg.HSTSPreload, - - all.Cfg.GlobalRateLimitMemcachedHost, - all.Cfg.GlobalRateLimitMemcachedPort, - all.Cfg.GlobalRateLimitMemcachedConnectTimeout, - all.Cfg.GlobalRateLimitMemcachedMaxIdleTimeout, - all.Cfg.GlobalRateLimitMemcachedPoolSize, - all.Cfg.GlobalRateLimitStatucCode, - ) -} - // locationConfigForLua formats some location specific configuration into Lua table represented as string func locationConfigForLua(l, a interface{}) string { location, ok := l.(*ingress.Location) @@ -434,30 +431,26 @@ func locationConfigForLua(l, a interface{}) string { return "{}" } - ignoredCIDRs, err := convertGoSliceIntoLuaTable(location.GlobalRateLimit.IgnoredCIDRs, false) - if err != nil { - klog.Errorf("failed to convert %v into Lua table: %q", location.GlobalRateLimit.IgnoredCIDRs, err) - ignoredCIDRs = "{}" - } + /* Lua expects the following vars + force_ssl_redirect = string_to_bool(ngx.var.force_ssl_redirect), + ssl_redirect = string_to_bool(ngx.var.ssl_redirect), + force_no_ssl_redirect = string_to_bool(ngx.var.force_no_ssl_redirect), + preserve_trailing_slash = string_to_bool(ngx.var.preserve_trailing_slash), + use_port_in_redirects = string_to_bool(ngx.var.use_port_in_redirects), + */ - return fmt.Sprintf(`{ - force_ssl_redirect = %t, - ssl_redirect = %t, - force_no_ssl_redirect = %t, - preserve_trailing_slash = %t, - use_port_in_redirects = %t, - global_throttle = { namespace = "%v", limit = %d, window_size = %d, key = %v, ignored_cidrs = %v }, - }`, + return fmt.Sprintf(` + set $force_ssl_redirect "%t"; + set $ssl_redirect "%t"; + set $force_no_ssl_redirect "%t"; + set $preserve_trailing_slash "%t"; + set $use_port_in_redirects "%t"; + `, location.Rewrite.ForceSSLRedirect, location.Rewrite.SSLRedirect, isLocationInLocationList(l, all.Cfg.NoTLSRedirectLocations), location.Rewrite.PreserveTrailingSlash, location.UsePortInRedirects, - location.GlobalRateLimit.Namespace, - location.GlobalRateLimit.Limit, - location.GlobalRateLimit.WindowSize, - parseComplexNginxVarIntoLuaTable(location.GlobalRateLimit.Key), - ignoredCIDRs, ) } @@ -500,7 +493,7 @@ func buildResolvers(res, disableIpv6 interface{}) string { } func needsRewrite(location *ingress.Location) bool { - if len(location.Rewrite.Target) > 0 && location.Rewrite.Target != location.Path { + if location.Rewrite.Target != "" && location.Rewrite.Target != location.Path { return true } return false @@ -609,17 +602,12 @@ func buildAuthResponseHeaders(proxySetHeader string, headers []string, lua bool) return res } -func buildAuthUpstreamLuaHeaders(headers []string) []string { - res := []string{} - +func buildAuthUpstreamLuaHeaders(headers []string) string { if len(headers) == 0 { - return res + return "" } - for i, h := range headers { - res = append(res, fmt.Sprintf("ngx.var.authHeader%d = res.header['%s']", i, h)) - } - return res + return strings.Join(headers, ",") } func buildAuthProxySetHeaders(headers map[string]string) []string { @@ -774,10 +762,10 @@ func buildProxyPass(_ string, b, loc interface{}) string { return defProxyPass } - if len(location.Rewrite.Target) > 0 { + if location.Rewrite.Target != "" { var xForwardedPrefix string - if len(location.XForwardedPrefix) > 0 { + if location.XForwardedPrefix != "" { xForwardedPrefix = fmt.Sprintf("%s X-Forwarded-Prefix %q;\n", proxySetHeader(location), location.XForwardedPrefix) } @@ -1209,46 +1197,6 @@ func randomString() string { return string(b) } -func buildOpentracing(c, s interface{}) string { - cfg, ok := c.(config.Configuration) - if !ok { - klog.Errorf("expected a 'config.Configuration' type but %T was returned", c) - return "" - } - - servers, ok := s.([]*ingress.Server) - if !ok { - klog.Errorf("expected an '[]*ingress.Server' type but %T was returned", s) - return "" - } - - if !shouldLoadOpentracingModule(cfg, servers) { - return "" - } - - buf := bytes.NewBufferString("") - - //nolint:gocritic // rewriting if-else to switch statement is not more readable - if cfg.DatadogCollectorHost != "" { - buf.WriteString("opentracing_load_tracer /usr/local/lib/libdd_opentracing.so /etc/nginx/opentracing.json;") - } else if cfg.ZipkinCollectorHost != "" { - buf.WriteString("opentracing_load_tracer /usr/local/lib/libzipkin_opentracing_plugin.so /etc/nginx/opentracing.json;") - } else if cfg.JaegerCollectorHost != "" || cfg.JaegerEndpoint != "" { - buf.WriteString("opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/nginx/opentracing.json;") - } - - buf.WriteString("\r\n") - - if cfg.OpentracingOperationName != "" { - fmt.Fprintf(buf, "opentracing_operation_name \"%s\";\n", cfg.OpentracingOperationName) - } - if cfg.OpentracingLocationOperationName != "" { - fmt.Fprintf(buf, "opentracing_location_operation_name \"%s\";\n", cfg.OpentracingLocationOperationName) - } - - return buf.String() -} - func buildOpentelemetry(c, s interface{}) string { cfg, ok := c.(config.Configuration) if !ok { @@ -1362,18 +1310,6 @@ func buildCustomErrorLocationsPerServer(input interface{}) []errorLocation { return errorLocations } -func opentracingPropagateContext(location *ingress.Location) string { - if location == nil { - return "" - } - - if location.BackendProtocol == grpcProtocol || location.BackendProtocol == grpcsProtocol { - return "opentracing_grpc_propagate_context;" - } - - return "opentracing_propagate_context;" -} - func opentelemetryPropagateContext(location *ingress.Location) string { if location == nil { return "" @@ -1556,44 +1492,14 @@ func httpsListener(addresses []string, co string, tc *config.TemplateConfig) []s } } - lo = append(lo, co, "ssl") + lo = append(lo, co, "ssl;") - if tc.Cfg.UseHTTP2 { - lo = append(lo, "http2") - } - - lo = append(lo, ";") out = append(out, strings.Join(lo, " ")) } return out } -func buildOpentracingForLocation(isOTEnabled, isOTTrustSet bool, location *ingress.Location) string { - isOTEnabledInLoc := location.Opentracing.Enabled - isOTSetInLoc := location.Opentracing.Set - - if isOTEnabled { - if isOTSetInLoc && !isOTEnabledInLoc { - return "opentracing off;" - } - } else if !isOTSetInLoc || !isOTEnabledInLoc { - return "" - } - - opc := opentracingPropagateContext(location) - if opc != "" { - opc = fmt.Sprintf("opentracing on;\n%v", opc) - } - - if (!isOTTrustSet && !location.Opentracing.TrustSet) || - (location.Opentracing.TrustSet && !location.Opentracing.TrustEnabled) { - opc += "\nopentracing_trust_incoming_span off;" - } - - return opc -} - func buildOpentelemetryForLocation(isOTEnabled, isOTTrustSet bool, location *ingress.Location) string { isOTEnabledInLoc := location.Opentelemetry.Enabled isOTSetInLoc := location.Opentelemetry.Set @@ -1624,37 +1530,6 @@ func buildOpentelemetryForLocation(isOTEnabled, isOTTrustSet bool, location *ing return opc } -// shouldLoadOpentracingModule determines whether or not the Opentracing module needs to be loaded. -// First, it checks if `enable-opentracing` is set in the ConfigMap. If it is not, it iterates over all locations to -// check if Opentracing is enabled by the annotation `nginx.ingress.kubernetes.io/enable-opentracing`. -func shouldLoadOpentracingModule(c, s interface{}) bool { - cfg, ok := c.(config.Configuration) - if !ok { - klog.Errorf("expected a 'config.Configuration' type but %T was returned", c) - return false - } - - servers, ok := s.([]*ingress.Server) - if !ok { - klog.Errorf("expected an '[]*ingress.Server' type but %T was returned", s) - return false - } - - if cfg.EnableOpentracing { - return true - } - - for _, server := range servers { - for _, location := range server.Locations { - if location.Opentracing.Enabled { - return true - } - } - } - - return false -} - // shouldLoadOpentelemetryModule determines whether or not the Opentelemetry module needs to be loaded. // It checks if `enable-opentelemetry` is set in the ConfigMap. func shouldLoadOpentelemetryModule(c, s interface{}) bool { @@ -1792,54 +1667,6 @@ func buildServerName(hostname string) string { return `~^(?[\w-]+)\.` + strings.Join(parts, "\\.") + `$` } -// parseComplexNginxVarIntoLuaTable parses things like "$my${complex}ngx\$var" into -// [["$var", "complex", "my", "ngx"]]. In other words, 2nd and 3rd elements -// in the result are actual NGINX variable names, whereas first and 4th elements -// are string literals. -func parseComplexNginxVarIntoLuaTable(ngxVar string) string { - r := regexp.MustCompile(`(\\\$[0-9a-zA-Z_]+)|\$\{([0-9a-zA-Z_]+)\}|\$([0-9a-zA-Z_]+)|(\$|[^$\\]+)`) - matches := r.FindAllStringSubmatch(ngxVar, -1) - components := make([][]string, len(matches)) - for i, match := range matches { - components[i] = match[1:] - } - - luaTable, err := convertGoSliceIntoLuaTable(components, true) - if err != nil { - klog.Errorf("unexpected error: %v", err) - luaTable = "{}" - } - return luaTable -} - -func convertGoSliceIntoLuaTable(goSliceInterface interface{}, emptyStringAsNil bool) (string, error) { - goSlice := reflect.ValueOf(goSliceInterface) - kind := goSlice.Kind() - - switch kind { - case reflect.String: - if emptyStringAsNil && goSlice.Interface().(string) == "" { - return "nil", nil - } - return fmt.Sprintf(`"%v"`, goSlice.Interface()), nil - case reflect.Int, reflect.Bool: - return fmt.Sprintf(`%v`, goSlice.Interface()), nil - case reflect.Slice, reflect.Array: - luaTable := "{ " - for i := 0; i < goSlice.Len(); i++ { - luaEl, err := convertGoSliceIntoLuaTable(goSlice.Index(i).Interface(), emptyStringAsNil) - if err != nil { - return "", err - } - luaTable = luaTable + luaEl + ", " - } - luaTable += "}" - return luaTable, nil - default: - return "", fmt.Errorf("could not process type: %s", kind) - } -} - func buildOriginRegex(origin string) string { origin = regexp.QuoteMeta(origin) origin = strings.Replace(origin, "\\*", `[A-Za-z0-9\-]+`, 1) @@ -1854,7 +1681,7 @@ func buildCorsOriginRegex(corsOrigins []string) string { originsRegex := "if ($http_origin ~* (" for i, origin := range corsOrigins { originTrimmed := strings.TrimSpace(origin) - if len(originTrimmed) > 0 { + if originTrimmed != "" { builtOrigin := buildOriginRegex(originTrimmed) originsRegex += builtOrigin if i != len(corsOrigins)-1 { diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index 110967711..6553f5daf 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -37,7 +37,6 @@ import ( "k8s.io/ingress-nginx/internal/ingress/annotations/authreq" "k8s.io/ingress-nginx/internal/ingress/annotations/modsecurity" "k8s.io/ingress-nginx/internal/ingress/annotations/opentelemetry" - "k8s.io/ingress-nginx/internal/ingress/annotations/opentracing" "k8s.io/ingress-nginx/internal/ingress/annotations/ratelimit" "k8s.io/ingress-nginx/internal/ingress/annotations/rewrite" "k8s.io/ingress-nginx/internal/ingress/controller/config" @@ -538,10 +537,7 @@ func TestBuildAuthResponseHeaders(t *testing.T) { func TestBuildAuthResponseLua(t *testing.T) { externalAuthResponseHeaders := []string{"h1", "H-With-Caps-And-Dashes"} - expected := []string{ - "ngx.var.authHeader0 = res.header['h1']", - "ngx.var.authHeader1 = res.header['H-With-Caps-And-Dashes']", - } + expected := "h1,H-With-Caps-And-Dashes" headers := buildAuthUpstreamLuaHeaders(externalAuthResponseHeaders) @@ -1134,25 +1130,6 @@ func TestEscapeLiteralDollar(t *testing.T) { } } -func TestOpentracingPropagateContext(t *testing.T) { - tests := map[*ingress.Location]string{ - {BackendProtocol: httpProtocol}: "opentracing_propagate_context;", - {BackendProtocol: httpsProtocol}: "opentracing_propagate_context;", - {BackendProtocol: autoHTTPProtocol}: "opentracing_propagate_context;", - {BackendProtocol: grpcProtocol}: "opentracing_grpc_propagate_context;", - {BackendProtocol: grpcsProtocol}: "opentracing_grpc_propagate_context;", - {BackendProtocol: fcgiProtocol}: "opentracing_propagate_context;", - nil: "", - } - - for loc, expectedDirective := range tests { - actualDirective := opentracingPropagateContext(loc) - if actualDirective != expectedDirective { - t.Errorf("Expected %v but returned %v", expectedDirective, actualDirective) - } - } -} - func TestOpentelemetryPropagateContext(t *testing.T) { tests := map[*ingress.Location]string{ {BackendProtocol: httpProtocol}: "opentelemetry_propagate;", @@ -1640,85 +1617,6 @@ func TestProxySetHeader(t *testing.T) { } } -func TestBuildOpenTracing(t *testing.T) { - invalidType := &ingress.Ingress{} - expected := "" - actual := buildOpentracing(invalidType, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - cfgNoHost := config.Configuration{ - EnableOpentracing: true, - } - expected = "\r\n" - actual = buildOpentracing(cfgNoHost, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - cfgJaeger := config.Configuration{ - EnableOpentracing: true, - JaegerCollectorHost: "jaeger-host.com", - } - expected = "opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/nginx/opentracing.json;\r\n" - actual = buildOpentracing(cfgJaeger, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - cfgZipkin := config.Configuration{ - EnableOpentracing: true, - ZipkinCollectorHost: "zipkin-host.com", - } - expected = "opentracing_load_tracer /usr/local/lib/libzipkin_opentracing_plugin.so /etc/nginx/opentracing.json;\r\n" - actual = buildOpentracing(cfgZipkin, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - cfgDatadog := config.Configuration{ - EnableOpentracing: true, - DatadogCollectorHost: "datadog-host.com", - } - expected = "opentracing_load_tracer /usr/local/lib/libdd_opentracing.so /etc/nginx/opentracing.json;\r\n" - actual = buildOpentracing(cfgDatadog, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - cfgJaegerEndpoint := config.Configuration{ - EnableOpentracing: true, - JaegerEndpoint: "http://jaeger-collector.com:14268/api/traces", - } - expected = "opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/nginx/opentracing.json;\r\n" - actual = buildOpentracing(cfgJaegerEndpoint, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - cfgOpenTracing := config.Configuration{ - EnableOpentracing: true, - DatadogCollectorHost: "datadog-host.com", - OpentracingOperationName: "my-operation-name", - OpentracingLocationOperationName: "my-location-operation-name", - } - expected = "opentracing_load_tracer /usr/local/lib/libdd_opentracing.so /etc/nginx/opentracing.json;\r\n" - expected += "opentracing_operation_name \"my-operation-name\";\n" - expected += "opentracing_location_operation_name \"my-location-operation-name\";\n" - actual = buildOpentracing(cfgOpenTracing, []*ingress.Server{}) - - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } -} - func TestBuildOpenTelemetry(t *testing.T) { invalidType := &ingress.Ingress{} expected := "" @@ -1831,107 +1729,6 @@ func TestShouldLoadModSecurityModule(t *testing.T) { } } -func TestOpentracingForLocation(t *testing.T) { - trueVal := true - falseVal := false - - loadOT := `opentracing on; -opentracing_propagate_context;` - loadOTUntrustedSpan := `opentracing on; -opentracing_propagate_context; -opentracing_trust_incoming_span off;` - testCases := []struct { - description string - globalOT bool - isSetInLoc bool - isOTInLoc *bool - globalTrust bool - isTrustSetInLoc bool - isTrustInLoc *bool - expected string - }{ - {"globally enabled, without annotation", true, false, nil, true, false, nil, loadOT}, - {"globally enabled and enabled in location", true, true, &trueVal, true, false, nil, loadOT}, - {"globally disabled and not enabled in location", false, false, nil, true, false, nil, ""}, - {"globally disabled but enabled in location", false, true, &trueVal, true, false, nil, loadOT}, - {"globally trusted, not trusted in location", true, false, nil, true, true, &falseVal, loadOTUntrustedSpan}, - {"not globally trusted, trust set in location", true, false, nil, false, true, &trueVal, loadOT}, - {"not globally trusted, trust not set in location", true, false, nil, false, false, nil, loadOTUntrustedSpan}, - } - - for _, testCase := range testCases { - il := &ingress.Location{ - Opentracing: opentracing.Config{Set: testCase.isSetInLoc, TrustSet: testCase.isTrustSetInLoc}, - } - if il.Opentracing.Set { - il.Opentracing.Enabled = *testCase.isOTInLoc - } - if il.Opentracing.TrustSet { - il.Opentracing.TrustEnabled = *testCase.isTrustInLoc - } - - actual := buildOpentracingForLocation(testCase.globalOT, testCase.globalTrust, il) - - if testCase.expected != actual { - t.Errorf("%v: expected '%v' but returned '%v'", testCase.description, testCase.expected, actual) - } - } -} - -//nolint:dupl // Ignore dupl errors for similar test case -func TestShouldLoadOpentracingModule(t *testing.T) { - // ### Invalid argument type tests ### - // The first tests should return false. - expected := false - - invalidType := &ingress.Ingress{} - actual := shouldLoadOpentracingModule(config.Configuration{}, invalidType) - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - actual = shouldLoadOpentracingModule(invalidType, []*ingress.Server{}) - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - // ### Functional tests ### - actual = shouldLoadOpentracingModule(config.Configuration{}, []*ingress.Server{}) - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - // All further tests should return true. - expected = true - - configuration := config.Configuration{EnableOpentracing: true} - actual = shouldLoadOpentracingModule(configuration, []*ingress.Server{}) - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - servers := []*ingress.Server{ - { - Locations: []*ingress.Location{ - { - Opentracing: opentracing.Config{ - Enabled: true, - }, - }, - }, - }, - } - actual = shouldLoadOpentracingModule(config.Configuration{}, servers) - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } - - actual = shouldLoadOpentracingModule(configuration, servers) - if expected != actual { - t.Errorf("Expected '%v' but returned '%v'", expected, actual) - } -} - func TestOpentelemetryForLocation(t *testing.T) { trueVal := true falseVal := false @@ -2126,89 +1923,6 @@ func TestBuildServerName(t *testing.T) { } } -func TestParseComplexNginxVarIntoLuaTable(t *testing.T) { - testCases := []struct { - ngxVar string - expectedLuaTable string - }{ - {"foo", `{ { nil, nil, nil, "foo", }, }`}, - {"$foo", `{ { nil, nil, "foo", nil, }, }`}, - {"${foo}", `{ { nil, "foo", nil, nil, }, }`}, - {"\\$foo", `{ { "\$foo", nil, nil, nil, }, }`}, - { - "foo\\$bar$baz${daz}xiyar$pomidor", - `{ { nil, nil, nil, "foo", }, { "\$bar", nil, nil, nil, }, { nil, nil, "baz", nil, }, ` + - `{ nil, "daz", nil, nil, }, { nil, nil, nil, "xiyar", }, { nil, nil, "pomidor", nil, }, }`, - }, - } - - for _, testCase := range testCases { - actualLuaTable := parseComplexNginxVarIntoLuaTable(testCase.ngxVar) - if actualLuaTable != testCase.expectedLuaTable { - t.Errorf("expected %v but returned %v", testCase.expectedLuaTable, actualLuaTable) - } - } -} - -func TestConvertGoSliceIntoLuaTablet(t *testing.T) { - testCases := []struct { - title string - goSlice interface{} - emptyStringAsNil bool - expectedLuaTable string - expectedErr error - }{ - { - "flat string slice", - []string{"one", "two", "three"}, - false, - `{ "one", "two", "three", }`, - nil, - }, - { - "nested string slice", - [][]string{{"one", "", "three"}, {"foo", "bar"}}, - false, - `{ { "one", "", "three", }, { "foo", "bar", }, }`, - nil, - }, - { - "converts empty string to nil when enabled", - [][]string{{"one", "", "three"}, {"foo", "bar"}}, - true, - `{ { "one", nil, "three", }, { "foo", "bar", }, }`, - nil, - }, - { - "boolean slice", - []bool{true, true, false}, - false, - `{ true, true, false, }`, - nil, - }, - { - "integer slice", - []int{4, 3, 6}, - false, - `{ 4, 3, 6, }`, - nil, - }, - } - - for _, testCase := range testCases { - actualLuaTable, err := convertGoSliceIntoLuaTable(testCase.goSlice, testCase.emptyStringAsNil) - if testCase.expectedErr != nil && err != nil && testCase.expectedErr.Error() != err.Error() { - t.Errorf("expected error '%v' but returned '%v'", testCase.expectedErr, err) - } - if testCase.expectedErr == nil && err != nil { - t.Errorf("expected error to be nil but returned '%v'", err) - } - if testCase.expectedLuaTable != actualLuaTable { - t.Errorf("%v: expected '%v' but returned '%v'", testCase.title, testCase.expectedLuaTable, actualLuaTable) - } - } -} - func TestCleanConf(t *testing.T) { testDataDir, err := getTestDataDir() if err != nil { diff --git a/internal/ingress/controller/util.go b/internal/ingress/controller/util.go index 8851f323f..975fb822a 100644 --- a/internal/ingress/controller/util.go +++ b/internal/ingress/controller/util.go @@ -98,8 +98,9 @@ func rlimitMaxNumFiles() int { } const ( - defBinary = "/usr/bin/nginx" - cfgPath = "/etc/nginx/nginx.conf" + defBinary = "/usr/bin/nginx" + cfgPath = "/etc/nginx/nginx.conf" + luaCfgPath = "/etc/nginx/lua/cfg.json" ) // NginxExecTester defines the interface to execute @@ -129,7 +130,7 @@ func NewNginxCommand() NginxCommand { return command } -// ExecCommand instanciates an exec.Cmd object to call nginx program +// ExecCommand instantiates an exec.Cmd object to call nginx program func (nc NginxCommand) ExecCommand(args ...string) *exec.Cmd { cmdArgs := []string{} diff --git a/internal/ingress/defaults/main.go b/internal/ingress/defaults/main.go index 0526d443e..bec1b08e2 100644 --- a/internal/ingress/defaults/main.go +++ b/internal/ingress/defaults/main.go @@ -34,6 +34,13 @@ type Backend struct { // toggles whether or not to remove trailing slashes during TLS redirects PreserveTrailingSlash bool `json:"preserve-trailing-slash"` + // allows usage of CustomHTTPErrors without intercepting service errors + // e.g. custom 404 and 503 when service-a does not exist or is not available + // but service-a can return 404 and 503 error codes without intercept + // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors + // By default this is false + DisableProxyInterceptErrors bool `json:"disable-proxy-intercept-errors"` + // http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size // Sets the maximum allowed size of the client request body ProxyBodySize string `json:"proxy-body-size"` @@ -62,6 +69,11 @@ type Backend struct { // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size) ProxyBufferSize string `json:"proxy-buffer-size"` + // Limits the total size of buffers that can be busy sending a response to the client while + // the response is not yet fully read. + // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_busy_buffers_size + ProxyBusyBuffersSize string `json:"proxy-busy-buffers-size"` + // Sets a text that should be changed in the path attribute of the “Set-Cookie” header fields of // a proxied server response. // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_path @@ -118,6 +130,11 @@ type Backend struct { // Default: false UsePortInRedirects bool `json:"use-port-in-redirects"` + // Enables or disables relative redirects. By default nginx uses absolute redirects. + // http://nginx.org/en/docs/http/ngx_http_core_module.html#absolute_redirect + // Default: false + RelativeRedirects bool `json:"relative-redirects"` + // Enable stickiness by client-server mapping based on a NGINX variable, text or a combination of both. // A consistent hashing method will be used which ensures only a few keys would be remapped to different // servers on upstream group changes @@ -169,6 +186,9 @@ type Backend struct { // By default, the NGINX ingress controller uses a list of all endpoints (Pod IP/port) in the NGINX upstream configuration. // It disables that behavior and instead uses a single upstream in NGINX, the service's Cluster IP and port. ServiceUpstream bool `json:"service-upstream"` + + // AllowedResponseHeaders allows to define allow response headers for custom header annotation + AllowedResponseHeaders []string `json:"global-allowed-response-headers"` } type SecurityConfiguration struct { diff --git a/internal/ingress/errors/errors.go b/internal/ingress/errors/errors.go index d70218334..62be8b77f 100644 --- a/internal/ingress/errors/errors.go +++ b/internal/ingress/errors/errors.go @@ -137,7 +137,7 @@ func IsValidationError(e error) bool { return ok } -// NewValidationError returns a new LocationDenied error +// NewRiskyAnnotations returns a new LocationDenied error func NewRiskyAnnotations(name string) error { return RiskyAnnotationError{ Reason: fmt.Errorf("annotation group %s contains risky annotation based on ingress configuration", name), diff --git a/internal/ingress/metric/collectors/admission.go b/internal/ingress/metric/collectors/admission.go index 7b84325c0..456f56963 100644 --- a/internal/ingress/metric/collectors/admission.go +++ b/internal/ingress/metric/collectors/admission.go @@ -151,7 +151,7 @@ func (am *AdmissionCollector) SetAdmissionMetrics(testedIngressLength, testedIng testedIngressTime, renderingIngressLength, renderingIngressTime, - ByteFormat(int64(testedConfigurationSize)), admissionTime, + ByteFormat(int64(testedConfigurationSize)), ) } diff --git a/internal/ingress/metric/collectors/admission_test.go b/internal/ingress/metric/collectors/admission_test.go index 68208ad3e..a23384a88 100644 --- a/internal/ingress/metric/collectors/admission_test.go +++ b/internal/ingress/metric/collectors/admission_test.go @@ -59,7 +59,7 @@ func TestAdmissionCounters(t *testing.T) { }{ { name: "should return 0 as values on a fresh initiated collector", - test: func(am *AdmissionCollector) { + test: func(_ *AdmissionCollector) { }, want: metadataFirst + ` nginx_ingress_controller_admission_config_size{controller_class="nginx",controller_namespace="default",controller_pod="pod"} 0 diff --git a/internal/ingress/metric/collectors/controller.go b/internal/ingress/metric/collectors/controller.go index e1d6789bb..0df04c1d0 100644 --- a/internal/ingress/metric/collectors/controller.go +++ b/internal/ingress/metric/collectors/controller.go @@ -30,7 +30,7 @@ import ( var ( operation = []string{"controller_namespace", "controller_class", "controller_pod"} ingressOperation = []string{"controller_namespace", "controller_class", "controller_pod", "namespace", "ingress"} - sslLabelHost = []string{"namespace", "class", "host", "secret_name"} + sslLabelHost = []string{"namespace", "class", "host", "secret_name", "identifier"} sslInfoLabels = []string{"namespace", "class", "host", "secret_name", "identifier", "issuer_organization", "issuer_common_name", "serial_number", "public_key_algorithm"} orphanityLabels = []string{"controller_namespace", "controller_class", "controller_pod", "namespace", "ingress", "type"} ) @@ -225,7 +225,7 @@ func (cm *Controller) IncCheckErrorCount(namespace, name string) { cm.checkIngressOperationErrors.MustCurryWith(cm.constLabels).With(labels).Inc() } -// IncOrphanIngress sets the the orphaned ingress gauge to one +// IncOrphanIngress sets the orphaned ingress gauge to one func (cm *Controller) IncOrphanIngress(namespace, name, orphanityType string) { labels := prometheus.Labels{ "namespace": namespace, @@ -235,7 +235,7 @@ func (cm *Controller) IncOrphanIngress(namespace, name, orphanityType string) { cm.OrphanIngress.MustCurryWith(cm.constLabels).With(labels).Set(1.0) } -// DecOrphanIngress sets the the orphaned ingress gauge to zero (all services has their endpoints) +// DecOrphanIngress sets the orphaned ingress gauge to zero (all services has their endpoints) func (cm *Controller) DecOrphanIngress(namespace, name, orphanityType string) { labels := prometheus.Labels{ "namespace": namespace, @@ -305,12 +305,14 @@ func (cm *Controller) SetSSLExpireTime(servers []*ingress.Server) { } labels["host"] = s.Hostname labels["secret_name"] = s.SSLCert.Name + labels["namespace"] = s.SSLCert.Namespace + labels["identifier"] = s.SSLCert.Identifier() cm.sslExpireTime.With(labels).Set(float64(s.SSLCert.ExpireTime.Unix())) } } -// SetSSLInfo creates a metric with all certificates informations +// SetSSLInfo creates a metric with all certificate information func (cm *Controller) SetSSLInfo(servers []*ingress.Server) { for _, s := range servers { if s.SSLCert == nil || s.SSLCert.Certificate == nil || s.SSLCert.Certificate.SerialNumber == nil { @@ -337,9 +339,9 @@ func (cm *Controller) SetSSLInfo(servers []*ingress.Server) { } } -// RemoveMetrics removes metrics for hostnames not available anymore -func (cm *Controller) RemoveMetrics(hosts, certificates []string, registry prometheus.Gatherer) { - cm.removeSSLExpireMetrics(true, hosts, registry) +// RemoveMetrics removes metrics for certificates not available anymore by identifier +func (cm *Controller) RemoveMetrics(certificates []string, registry prometheus.Gatherer) { + cm.removeSSLExpireMetrics(true, certificates, registry) cm.removeCertificatesMetrics(true, certificates, registry) } @@ -390,14 +392,14 @@ func (cm *Controller) removeCertificatesMetrics(onlyDefinedHosts bool, certifica } } -func (cm *Controller) removeSSLExpireMetrics(onlyDefinedHosts bool, hosts []string, registry prometheus.Gatherer) { +func (cm *Controller) removeSSLExpireMetrics(onlyDefinedCerts bool, certificates []string, registry prometheus.Gatherer) { mfs, err := registry.Gather() if err != nil { klog.ErrorS(err, "Error gathering metrics") return } - toRemove := sets.NewString(hosts...) + toRemove := sets.NewString(certificates...) for _, mf := range mfs { metricName := mf.GetName() @@ -414,19 +416,24 @@ func (cm *Controller) removeSSLExpireMetrics(onlyDefinedHosts bool, hosts []stri // remove labels that are constant deleteConstants(labels) + identifier, ok := labels["identifier"] + if !ok { + continue + } + host, ok := labels["host"] if !ok { continue } - if onlyDefinedHosts && !toRemove.Has(host) { + if onlyDefinedCerts && !toRemove.Has(identifier) { continue } - klog.V(2).InfoS("Removing prometheus metric", "gauge", metricName, "host", host) + klog.V(2).InfoS("Removing prometheus metric", "gauge", metricName, "host", host, "identifier", identifier) removed := cm.sslExpireTime.Delete(labels) if !removed { - klog.V(2).InfoS("metric removed", "metric", metricName, "host", host, "labels", labels) + klog.V(2).InfoS("metric removed", "metric", metricName, "host", host, "identifier", identifier, "labels", labels) } } } diff --git a/internal/ingress/metric/collectors/controller_test.go b/internal/ingress/metric/collectors/controller_test.go index 15735df42..a77293c20 100644 --- a/internal/ingress/metric/collectors/controller_test.go +++ b/internal/ingress/metric/collectors/controller_test.go @@ -42,7 +42,7 @@ func TestControllerCounters(t *testing.T) { }{ { name: "should return not increment in metrics if no operations are invoked", - test: func(cm *Controller) { + test: func(_ *Controller) { }, want: metadata + ` nginx_ingress_controller_config_last_reload_successful{controller_class="nginx",controller_namespace="default",controller_pod="pod"} 0 @@ -88,6 +88,17 @@ func TestControllerCounters(t *testing.T) { Hostname: "demo", SSLCert: &ingress.SSLCert{ ExpireTime: t1, + Name: "secret-name", + Namespace: "secret-namespace", + Certificate: &x509.Certificate{ + PublicKeyAlgorithm: x509.ECDSA, + Issuer: pkix.Name{ + CommonName: "certificate issuer", + SerialNumber: "abcd1234", + Organization: []string{"issuer org"}, + }, + SerialNumber: big.NewInt(100), + }, }, }, { @@ -102,7 +113,7 @@ func TestControllerCounters(t *testing.T) { want: ` # HELP nginx_ingress_controller_ssl_expire_time_seconds Number of seconds since 1970 to the SSL Certificate expire.\n An example to check if this certificate will expire in 10 days is: "nginx_ingress_controller_ssl_expire_time_seconds < (time() + (10 * 24 * 3600))" # TYPE nginx_ingress_controller_ssl_expire_time_seconds gauge - nginx_ingress_controller_ssl_expire_time_seconds{class="nginx",host="demo",namespace="default",secret_name=""} 1.351807721e+09 + nginx_ingress_controller_ssl_expire_time_seconds{class="nginx",host="demo",identifier="abcd1234-100",namespace="secret-namespace",secret_name="secret-name"} 1.351807721e+09 `, metrics: []string{"nginx_ingress_controller_ssl_expire_time_seconds"}, }, @@ -262,7 +273,7 @@ func TestRemoveMetrics(t *testing.T) { cm.SetSSLExpireTime(servers) cm.SetSSLInfo(servers) - cm.RemoveMetrics([]string{"demo"}, []string{"abcd1234-100"}, reg) + cm.RemoveMetrics([]string{"abcd1234-100"}, reg) if err := GatherAndCompare(cm, "", []string{"nginx_ingress_controller_ssl_expire_time_seconds"}, reg); err != nil { t.Errorf("unexpected collecting result:\n%s", err) diff --git a/internal/ingress/metric/collectors/process.go b/internal/ingress/metric/collectors/process.go index 3803a47ae..85e8066b5 100644 --- a/internal/ingress/metric/collectors/process.go +++ b/internal/ingress/metric/collectors/process.go @@ -112,7 +112,7 @@ func NewNGINXProcess(pod, namespace, ingressClass string) (NGINXProcessCollector p := &namedProcess{ scrapeChan: make(chan scrapeRequest), - Grouper: proc.NewGrouper(nm, true, false, false, false), + Grouper: proc.NewGrouper(nm, true, false, false, 0, false, false), fs: fs, } diff --git a/internal/ingress/metric/collectors/socket.go b/internal/ingress/metric/collectors/socket.go index a70024c57..0bdd816ae 100644 --- a/internal/ingress/metric/collectors/socket.go +++ b/internal/ingress/metric/collectors/socket.go @@ -64,11 +64,10 @@ type metricMapping map[string]prometheus.Collector type SocketCollector struct { prometheus.Collector - upstreamLatency *prometheus.SummaryVec // TODO: DEPRECATED, remove - connectTime *prometheus.HistogramVec - headerTime *prometheus.HistogramVec - requestTime *prometheus.HistogramVec - responseTime *prometheus.HistogramVec + connectTime *prometheus.HistogramVec + headerTime *prometheus.HistogramVec + requestTime *prometheus.HistogramVec + responseTime *prometheus.HistogramVec requestLength *prometheus.HistogramVec responseLength *prometheus.HistogramVec @@ -82,8 +81,9 @@ type SocketCollector struct { hosts sets.Set[string] - metricsPerHost bool - reportStatusClasses bool + metricsPerHost bool + metricsPerUndefinedHost bool + reportStatusClasses bool } var requestTags = []string{ @@ -98,13 +98,9 @@ var requestTags = []string{ "canary", } -// DefObjectives was removed in https://github.com/prometheus/client_golang/pull/262 -// updating the library to latest version changed the output of the metrics -var defObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} - // NewSocketCollector creates a new SocketCollector instance using // the ingress watch namespace and class used by the controller -func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStatusClasses bool, buckets HistogramBuckets, excludeMetrics []string) (*SocketCollector, error) { +func NewSocketCollector(pod, namespace, class string, metricsPerHost, metricsPerUndefinedHost, reportStatusClasses bool, buckets HistogramBuckets, bucketFactor float64, maxBuckets uint32, excludeMetrics []string) (*SocketCollector, error) { socket := "/tmp/nginx/prometheus-nginx.socket" // unix sockets must be unlink()ed before being used //nolint:errcheck // Ignore unlink error @@ -144,16 +140,19 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat sc := &SocketCollector{ listener: listener, - metricsPerHost: metricsPerHost, - reportStatusClasses: reportStatusClasses, + metricsPerHost: metricsPerHost, + metricsPerUndefinedHost: metricsPerUndefinedHost, + reportStatusClasses: reportStatusClasses, connectTime: histogramMetric( &prometheus.HistogramOpts{ - Name: "connect_duration_seconds", - Help: "The time spent on establishing a connection with the upstream server", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Buckets: buckets.TimeBuckets, + Name: "connect_duration_seconds", + Help: "The time spent on establishing a connection with the upstream server", + Namespace: PrometheusNamespace, + ConstLabels: constLabels, + Buckets: buckets.TimeBuckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, requestTags, em, @@ -162,11 +161,13 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat headerTime: histogramMetric( &prometheus.HistogramOpts{ - Name: "header_duration_seconds", - Help: "The time spent on receiving first header from the upstream server", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Buckets: buckets.TimeBuckets, + Name: "header_duration_seconds", + Help: "The time spent on receiving first header from the upstream server", + Namespace: PrometheusNamespace, + ConstLabels: constLabels, + Buckets: buckets.TimeBuckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, requestTags, em, @@ -174,11 +175,13 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat ), responseTime: histogramMetric( &prometheus.HistogramOpts{ - Name: "response_duration_seconds", - Help: "The time spent on receiving the response from the upstream server", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Buckets: buckets.TimeBuckets, + Name: "response_duration_seconds", + Help: "The time spent on receiving the response from the upstream server", + Namespace: PrometheusNamespace, + ConstLabels: constLabels, + Buckets: buckets.TimeBuckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, requestTags, em, @@ -187,11 +190,13 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat requestTime: histogramMetric( &prometheus.HistogramOpts{ - Name: "request_duration_seconds", - Help: "The request processing time in milliseconds", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Buckets: buckets.TimeBuckets, + Name: "request_duration_seconds", + Help: "The request processing time in milliseconds", + Namespace: PrometheusNamespace, + ConstLabels: constLabels, + Buckets: buckets.TimeBuckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, requestTags, em, @@ -200,11 +205,13 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat responseLength: histogramMetric( &prometheus.HistogramOpts{ - Name: "response_size", - Help: "The response length (including request line, header, and request body)", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Buckets: buckets.LengthBuckets, + Name: "response_size", + Help: "The response length (including request line, header, and request body)", + Namespace: PrometheusNamespace, + ConstLabels: constLabels, + Buckets: buckets.LengthBuckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, requestTags, em, @@ -213,11 +220,13 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat requestLength: histogramMetric( &prometheus.HistogramOpts{ - Name: "request_size", - Help: "The request length (including request line, header, and request body)", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Buckets: buckets.LengthBuckets, + Name: "request_size", + Help: "The request length (including request line, header, and request body)", + Namespace: PrometheusNamespace, + ConstLabels: constLabels, + Buckets: buckets.LengthBuckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, requestTags, em, @@ -248,19 +257,6 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost, reportStat em, mm, ), - - upstreamLatency: summaryMetric( - &prometheus.SummaryOpts{ - Name: "ingress_upstream_latency_seconds", - Help: "DEPRECATED Upstream service latency per Ingress", - Namespace: PrometheusNamespace, - ConstLabels: constLabels, - Objectives: defObjectives, - }, - []string{"ingress", "namespace", "service", "canary"}, - em, - mm, - ), } sc.metricMapping = mm @@ -275,18 +271,6 @@ func containsMetric(excludeMetrics map[string]struct{}, name string) bool { return false } -func summaryMetric(opts *prometheus.SummaryOpts, requestTags []string, excludeMetrics map[string]struct{}, metricMapping metricMapping) *prometheus.SummaryVec { - if containsMetric(excludeMetrics, opts.Name) { - return nil - } - m := prometheus.NewSummaryVec( - *opts, - requestTags, - ) - metricMapping[prometheus.BuildFQName(PrometheusNamespace, "", opts.Name)] = m - return m -} - func counterMetric(opts *prometheus.CounterOpts, requestTags []string, excludeMetrics map[string]struct{}, metricMapping metricMapping) *prometheus.CounterVec { if containsMetric(excludeMetrics, opts.Name) { return nil @@ -324,12 +308,12 @@ func (sc *SocketCollector) handleMessage(msg []byte) { for i := range statsBatch { stats := &statsBatch[i] - if sc.metricsPerHost && !sc.hosts.Has(stats.Host) { - klog.V(3).InfoS("Skipping metric for host not being served", "host", stats.Host) + if sc.metricsPerHost && !sc.hosts.Has(stats.Host) && !sc.metricsPerUndefinedHost { + klog.V(3).InfoS("Skipping metric for host not explicitly defined in an ingress", "host", stats.Host) continue } - if sc.reportStatusClasses && len(stats.Status) > 0 { + if sc.reportStatusClasses && stats.Status != "" { stats.Status = fmt.Sprintf("%cxx", stats.Status[0]) } @@ -358,13 +342,6 @@ func (sc *SocketCollector) handleMessage(msg []byte) { collectorLabels["host"] = stats.Host } - latencyLabels := prometheus.Labels{ - "namespace": stats.Namespace, - "ingress": stats.Ingress, - "service": stats.Service, - "canary": stats.Canary, - } - if sc.requests != nil { requestsMetric, err := sc.requests.GetMetricWith(collectorLabels) if err != nil { @@ -383,15 +360,6 @@ func (sc *SocketCollector) handleMessage(msg []byte) { connectTimeMetric.Observe(stats.Latency) } } - - if sc.upstreamLatency != nil { - latencyMetric, err := sc.upstreamLatency.GetMetricWith(latencyLabels) - if err != nil { - klog.ErrorS(err, "Error fetching latency metric") - } else { - latencyMetric.Observe(stats.Latency) - } - } } if stats.HeaderTime != -1 && sc.headerTime != nil { diff --git a/internal/ingress/metric/collectors/socket_test.go b/internal/ingress/metric/collectors/socket_test.go index 71e9097c9..3a1f29f35 100644 --- a/internal/ingress/metric/collectors/socket_test.go +++ b/internal/ingress/metric/collectors/socket_test.go @@ -30,8 +30,7 @@ import ( func TestNewUDPLogListener(t *testing.T) { var count uint64 - //nolint:unparam // Unused `message` param is required by the handleMessages function - fn := func(message []byte) { + fn := func(message []byte) { //nolint:unparam,revive // Unused `message` param is required by the handleMessages function atomic.AddUint64(&count, 1) } @@ -84,15 +83,19 @@ func TestCollector(t *testing.T) { prometheus.ExponentialBuckets(10, 10, 7), } + bucketFactor := 1.1 + maxBuckets := uint32(100) + cases := []struct { - name string - data []string - metrics []string - useStatusClasses bool - excludeMetrics []string - wantBefore string - removeIngresses []string - wantAfter string + name string + data []string + metrics []string + metricsPerUndefinedHost bool + useStatusClasses bool + excludeMetrics []string + wantBefore string + removeIngresses []string + wantAfter string }{ { name: "invalid metric object should not increase prometheus metrics", @@ -589,13 +592,69 @@ func TestCollector(t *testing.T) { nginx_ingress_controller_response_duration_seconds_count{canary="",controller_class="ingress",controller_namespace="default",controller_pod="pod",host="testshop.com",ingress="web-yml",method="GET",namespace="test-app-production",path="/admin",service="test-app",status="2xx"} 1 `, }, + { + name: "metrics with a host should not be dropped when the host is not in the hosts slice but metricsPerUndefinedHost is true", + data: []string{`[{ + "host":"wildcard.testshop.com", + "status":"200", + "bytesSent":150.0, + "method":"GET", + "path":"/admin", + "requestLength":300.0, + "requestTime":60.0, + "upstreamLatency":1.0, + "upstreamHeaderTime":5.0, + "upstreamName":"test-upstream", + "upstreamIP":"1.1.1.1:8080", + "upstreamResponseTime":200, + "upstreamStatus":"220", + "namespace":"test-app-production", + "ingress":"web-yml", + "service":"test-app", + "canary":"" + }]`}, + excludeMetrics: []string{"response_duration_seconds2", "test.*", "nginx_ingress_.*", "response_duration_secon"}, + metrics: []string{"nginx_ingress_controller_requests"}, + metricsPerUndefinedHost: true, + useStatusClasses: true, + wantBefore: ` + # HELP nginx_ingress_controller_requests The total number of client requests + # TYPE nginx_ingress_controller_requests counter + nginx_ingress_controller_requests{canary="",controller_class="ingress",controller_namespace="default",controller_pod="pod",host="wildcard.testshop.com",ingress="web-yml",method="GET",namespace="test-app-production",path="/admin",service="test-app",status="2xx"} 1 + `, + }, + { + name: "metrics with a host should be dropped when the host is not in the hosts slice", + data: []string{`[{ + "host":"wildcard.testshop.com", + "status":"200", + "bytesSent":150.0, + "method":"GET", + "path":"/admin", + "requestLength":300.0, + "requestTime":60.0, + "upstreamLatency":1.0, + "upstreamHeaderTime":5.0, + "upstreamName":"test-upstream", + "upstreamIP":"1.1.1.1:8080", + "upstreamResponseTime":200, + "upstreamStatus":"220", + "namespace":"test-app-production", + "ingress":"web-yml", + "service":"test-app", + "canary":"" + }]`}, + excludeMetrics: []string{"response_duration_seconds2", "test.*", "nginx_ingress_.*", "response_duration_secon"}, + metrics: []string{"nginx_ingress_controller_requests"}, + useStatusClasses: true, + }, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { registry := prometheus.NewPedanticRegistry() - sc, err := NewSocketCollector("pod", "default", "ingress", true, c.useStatusClasses, buckets, c.excludeMetrics) + sc, err := NewSocketCollector("pod", "default", "ingress", true, c.metricsPerUndefinedHost, c.useStatusClasses, buckets, bucketFactor, maxBuckets, c.excludeMetrics) if err != nil { t.Errorf("%v: unexpected error creating new SocketCollector: %v", c.name, err) } diff --git a/internal/ingress/metric/collectors/testutils.go b/internal/ingress/metric/collectors/testutils.go index 669e89e17..3fc0fc754 100644 --- a/internal/ingress/metric/collectors/testutils.go +++ b/internal/ingress/metric/collectors/testutils.go @@ -50,7 +50,7 @@ func GatherAndCompare(_ prometheus.Collector, expected string, metricNames []str if !reflect.DeepEqual(metrics, normalizeMetricFamilies(expectedMetrics)) { // Encode the gathered output to the readable text format for comparison. var buf1 bytes.Buffer - enc := expfmt.NewEncoder(&buf1, expfmt.FmtText) + enc := expfmt.NewEncoder(&buf1, expfmt.NewFormat(expfmt.TypeTextPlain)) for _, mf := range metrics { if err := enc.Encode(mf); err != nil { return fmt.Errorf("encoding result failed: %s", err) @@ -59,7 +59,7 @@ func GatherAndCompare(_ prometheus.Collector, expected string, metricNames []str // Encode normalized expected metrics again to generate them in the same ordering // the registry does to spot differences more easily. var buf2 bytes.Buffer - enc = expfmt.NewEncoder(&buf2, expfmt.FmtText) + enc = expfmt.NewEncoder(&buf2, expfmt.NewFormat(expfmt.TypeTextPlain)) for _, mf := range normalizeMetricFamilies(expectedMetrics) { if err := enc.Encode(mf); err != nil { return fmt.Errorf("encoding result failed: %s", err) @@ -109,7 +109,7 @@ func removeUnusedWhitespace(s string) string { for _, l := range lines { trimmedLine = strings.TrimSpace(l) - if len(trimmedLine) > 0 { + if trimmedLine != "" { trimmedLines = append(trimmedLines, trimmedLine) } } diff --git a/internal/ingress/metric/dummy.go b/internal/ingress/metric/dummy.go index a619ccbd8..7b1485280 100644 --- a/internal/ingress/metric/dummy.go +++ b/internal/ingress/metric/dummy.go @@ -54,7 +54,7 @@ func (dc DummyCollector) IncCheckCount(string, string) {} func (dc DummyCollector) IncCheckErrorCount(string, string) {} // RemoveMetrics dummy implementation -func (dc DummyCollector) RemoveMetrics(_, _, _ []string) {} +func (dc DummyCollector) RemoveMetrics(_, _ []string) {} // Start dummy implementation func (dc DummyCollector) Start(_ string) {} diff --git a/internal/ingress/metric/main.go b/internal/ingress/metric/main.go index aa35a5c51..9ed401d19 100644 --- a/internal/ingress/metric/main.go +++ b/internal/ingress/metric/main.go @@ -46,7 +46,7 @@ type Collector interface { IncOrphanIngress(string, string, string) DecOrphanIngress(string, string, string) - RemoveMetrics(ingresses, endpoints, certificates []string) + RemoveMetrics(ingresses, certificates []string) SetSSLExpireTime([]*ingress.Server) SetSSLInfo(servers []*ingress.Server) @@ -71,7 +71,7 @@ type collector struct { } // NewCollector creates a new metric collector the for ingress controller -func NewCollector(metricsPerHost, reportStatusClasses bool, registry *prometheus.Registry, ingressclass string, buckets collectors.HistogramBuckets, excludedSocketMetrics []string) (Collector, error) { +func NewCollector(metricsPerHost, metricsPerUndefinedHost, reportStatusClasses bool, registry *prometheus.Registry, ingressclass string, buckets collectors.HistogramBuckets, bucketFactor float64, maxBuckets uint32, excludedSocketMetrics []string) (Collector, error) { podNamespace := os.Getenv("POD_NAMESPACE") if podNamespace == "" { podNamespace = "default" @@ -89,7 +89,7 @@ func NewCollector(metricsPerHost, reportStatusClasses bool, registry *prometheus return nil, err } - s, err := collectors.NewSocketCollector(podName, podNamespace, ingressclass, metricsPerHost, reportStatusClasses, buckets, excludedSocketMetrics) + s, err := collectors.NewSocketCollector(podName, podNamespace, ingressclass, metricsPerHost, metricsPerUndefinedHost, reportStatusClasses, buckets, bucketFactor, maxBuckets, excludedSocketMetrics) if err != nil { return nil, err } @@ -131,9 +131,9 @@ func (c *collector) IncReloadErrorCount() { c.ingressController.IncReloadErrorCount() } -func (c *collector) RemoveMetrics(ingresses, hosts, certificates []string) { +func (c *collector) RemoveMetrics(ingresses, certificates []string) { c.socket.RemoveMetrics(ingresses, c.registry) - c.ingressController.RemoveMetrics(hosts, certificates, c.registry) + c.ingressController.RemoveMetrics(certificates, c.registry) } func (c *collector) Start(admissionStatus string) { diff --git a/internal/ingress/resolver/main.go b/internal/ingress/resolver/main.go index 7d17f4e16..259f44e49 100644 --- a/internal/ingress/resolver/main.go +++ b/internal/ingress/resolver/main.go @@ -29,10 +29,10 @@ type Resolver interface { // GetSecurityConfiguration returns the configuration options from Ingress GetSecurityConfiguration() defaults.SecurityConfiguration - // GetConfigMap searches for configmap containing the namespace and name usting the character / + // GetConfigMap searches for configmap containing the namespace and name using the character / GetConfigMap(string) (*apiv1.ConfigMap, error) - // GetSecret searches for secrets containing the namespace and name using a the character / + // GetSecret searches for secrets containing the namespace and name using the character / GetSecret(string) (*apiv1.Secret, error) // GetAuthCertificate resolves a given secret name into an SSL certificate and CRL. @@ -42,7 +42,7 @@ type Resolver interface { // ca.crl: contains the revocation list used for authentication GetAuthCertificate(string) (*AuthSSLCert, error) - // GetService searches for services containing the namespace and name using a the character / + // GetService searches for services containing the namespace and name using the character / GetService(string) (*apiv1.Service, error) } diff --git a/internal/ingress/resolver/mock.go b/internal/ingress/resolver/mock.go index 679c3b13c..3abfe7eda 100644 --- a/internal/ingress/resolver/mock.go +++ b/internal/ingress/resolver/mock.go @@ -39,7 +39,7 @@ func (m Mock) GetDefaultBackend() defaults.Backend { func (m Mock) GetSecurityConfiguration() defaults.SecurityConfiguration { defRisk := m.AnnotationsRiskLevel if defRisk == "" { - defRisk = "Critical" + defRisk = "High" } return defaults.SecurityConfiguration{ AnnotationsRiskLevel: defRisk, @@ -47,7 +47,7 @@ func (m Mock) GetSecurityConfiguration() defaults.SecurityConfiguration { } } -// GetSecret searches for secrets contenating the namespace and name using a the character / +// GetSecret searches for secrets containing the namespace and name using the character / func (m Mock) GetSecret(string) (*apiv1.Secret, error) { return nil, nil } @@ -60,12 +60,12 @@ func (m Mock) GetAuthCertificate(string) (*AuthSSLCert, error) { return nil, nil } -// GetService searches for services contenating the namespace and name using a the character / +// GetService searches for services containing the namespace and name using the character / func (m Mock) GetService(string) (*apiv1.Service, error) { return nil, nil } -// GetConfigMap searches for configMaps contenating the namespace and name using a the character / +// GetConfigMap searches for configMaps containing the namespace and name using the character / func (m Mock) GetConfigMap(name string) (*apiv1.ConfigMap, error) { if v, ok := m.ConfigMaps[name]; ok { return v, nil diff --git a/internal/ingress/status/status.go b/internal/ingress/status/status.go index 81fb9044a..ef01cdd24 100644 --- a/internal/ingress/status/status.go +++ b/internal/ingress/status/status.go @@ -393,7 +393,7 @@ func statusAddressFromService(service string, kubeClient clientset.Interface) ([ return nil, fmt.Errorf("unable to extract IP address/es from service %v", service) } -// stringInSlice returns true if s is in list +// stringInIngresses returns true if s is in list func stringInIngresses(s string, list []v1.IngressLoadBalancerIngress) bool { for _, v := range list { if v.IP == s || v.Hostname == s { diff --git a/internal/net/ssl/ssl.go b/internal/net/ssl/ssl.go index 26fd706e1..0592303bc 100644 --- a/internal/net/ssl/ssl.go +++ b/internal/net/ssl/ssl.go @@ -400,7 +400,6 @@ func getFakeHostSSLCert(host string) (cert, key []byte) { var err error priv, err = rsa.GenerateKey(rand.Reader, 2048) - if err != nil { klog.Fatalf("failed to generate fake private key: %v", err) } @@ -443,7 +442,7 @@ func getFakeHostSSLCert(host string) (cert, key []byte) { // fullChainCert checks if a certificate file contains issues in the intermediate CA chain // Returns a new certificate with the intermediate certificates. -// If the certificate does not contains issues with the chain it return an empty byte array +// If the certificate does not contain issues with the chain it returns an empty byte array func fullChainCert(in []byte) ([]byte, error) { cert, err := certUtil.DecodeCertificate(in) if err != nil { @@ -524,7 +523,7 @@ func (tl *TLSListener) GetCertificate(*tls.ClientHelloInfo) (*tls.Certificate, e return tl.certificate, tl.err } -// TLSConfig instanciates a TLS configuration, always providing an up to date certificate +// TLSConfig instantiates a TLS configuration, always providing an up to date certificate func (tl *TLSListener) TLSConfig() *tls.Config { return &tls.Config{ GetCertificate: tl.GetCertificate, diff --git a/internal/net/ssl/ssl_test.go b/internal/net/ssl/ssl_test.go index 9f8c5eeae..47fa07c7c 100644 --- a/internal/net/ssl/ssl_test.go +++ b/internal/net/ssl/ssl_test.go @@ -446,7 +446,7 @@ func TestTLSKeyReloader(t *testing.T) { } watcher.load() - s := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + s := httptest.NewUnstartedServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})) s.Config.TLSConfig = watcher.TLSConfig() s.Listener = tls.NewListener(s.Listener, s.Config.TLSConfig) go s.Start() diff --git a/internal/nginx/maxmind.go b/internal/nginx/maxmind.go index 4719a22c1..3bd895b5d 100644 --- a/internal/nginx/maxmind.go +++ b/internal/nginx/maxmind.go @@ -56,7 +56,7 @@ var MaxmindRetriesTimeout = time.Second * 0 const minimumRetriesCount = 1 const ( - geoIPPath = "/etc/nginx/geoip" + geoIPPath = "/etc/ingress-controller/geoip" dbExtension = ".mmdb" maxmindURL = "https://download.maxmind.com/app/geoip_download?license_key=%v&edition_id=%v&suffix=tar.gz" @@ -132,7 +132,7 @@ func DownloadGeoLite2DB(attempts int, period time.Duration) error { } func createURL(mirror, licenseKey, dbName string) string { - if len(mirror) > 0 { + if mirror != "" { return fmt.Sprintf("%s/%s.tar.gz", mirror, dbName) } return fmt.Sprintf(maxmindURL, licenseKey, dbName) diff --git a/internal/task/queue.go b/internal/task/queue.go index f92f2a501..8753bed34 100644 --- a/internal/task/queue.go +++ b/internal/task/queue.go @@ -36,7 +36,7 @@ var keyFunc = cache.DeletionHandlingMetaNamespaceKeyFunc // which timestamp is older than the last successful get operation. type Queue struct { // queue is the work queue the worker polls - queue workqueue.RateLimitingInterface + queue workqueue.TypedRateLimitingInterface[any] // sync is called for each item in the queue sync func(interface{}) error // workerDone is closed when the worker exits @@ -172,7 +172,7 @@ func NewTaskQueue(syncFn func(interface{}) error) *Queue { // NewCustomTaskQueue creates a new custom task queue with the given sync function. func NewCustomTaskQueue(syncFn func(interface{}) error, fn func(interface{}) (interface{}, error)) *Queue { q := &Queue{ - queue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), + queue: workqueue.NewTypedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[any]()), sync: syncFn, workerDone: make(chan bool), fn: fn, diff --git a/magefiles/go.mod b/magefiles/go.mod index ac05f6b89..f11ab740e 100644 --- a/magefiles/go.mod +++ b/magefiles/go.mod @@ -1,6 +1,6 @@ module k8s.io/ingress-nginx/magefiles -go 1.21.1 +go 1.23.6 require ( github.com/blang/semver/v4 v4.0.0 @@ -8,7 +8,7 @@ require ( github.com/helm/helm v2.17.0+incompatible github.com/magefile/mage v1.15.0 github.com/vmware-labs/yaml-jsonpath v0.3.2 - golang.org/x/oauth2 v0.12.0 + golang.org/x/oauth2 v0.18.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -17,16 +17,22 @@ require ( github.com/Masterminds/semver v1.5.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-querystring v1.1.0 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.30.0 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect - golang.org/x/crypto v0.13.0 // indirect - golang.org/x/net v0.15.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.31.0 // indirect + github.com/sergi/go-diff v1.3.1 // indirect + github.com/stretchr/testify v1.9.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apimachinery v0.27.4 // indirect + k8s.io/apimachinery v0.29.3 // indirect k8s.io/helm v2.17.0+incompatible // indirect ) diff --git a/magefiles/go.sum b/magefiles/go.sum index 8cd8c9420..8684d4701 100644 --- a/magefiles/go.sum +++ b/magefiles/go.sum @@ -4,6 +4,7 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -12,97 +13,162 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= 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.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v48 v48.2.0 h1:68puzySE6WqUY9KWmpOsDEQfDZsso98rT6pZcz9HqcE= github.com/google/go-github/v48 v48.2.0/go.mod h1:dDlehKBDo850ZPvCTK0sEqTCVWcrGl2LcDiajkYi89Y= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/helm/helm v2.17.0+incompatible h1:0iy95yMXrfWpwaoOA9XRP+cTvitTrq+LcJV9DvR5n1Y= github.com/helm/helm v2.17.0+incompatible/go.mod h1:ahXhuvluW4YnSL6W6hDVetZsVK8Pv4BP8OwKli7aMqo= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2 h1:uqH7bpe+ERSiDa34FDOF7RikN6RzXgduUF8yarlZp94= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= -k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= k8s.io/helm v2.17.0+incompatible h1:Bpn6o1wKLYqKM3+Osh8e+1/K2g/GsQJ4F4yNF2+deao= k8s.io/helm v2.17.0+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= diff --git a/magefiles/steps/helm.go b/magefiles/steps/helm.go index b53283f78..73c9b0b3b 100644 --- a/magefiles/steps/helm.go +++ b/magefiles/steps/helm.go @@ -18,9 +18,7 @@ package steps import ( "bytes" - "fmt" "os" - "strings" semver "github.com/blang/semver/v4" "github.com/helm/helm/pkg/chartutil" @@ -104,18 +102,21 @@ func updateVersion(version string) { utils.CheckIfError(err, "HELM Saving new Chart") } -func updateChartReleaseNotes(releasesNotes []string) { - utils.Info("HELM Updating the Chart Release notes") +func updateChartReleaseNotes(releaseNotes []string) { + utils.Info("HELM Updating chart release notes") chart, err := chartutil.LoadChartfile(HelmChartPath) - utils.CheckIfError(err, "HELM Could not Load Chart to update release notes %s", HelmChartPath) - for i := range releasesNotes { - releasesNotes[i] = fmt.Sprintf("- %q", releasesNotes[i]) - } - releaseNoteString := strings.Join(releasesNotes, "\n") - utils.Info("HELM Release note string %s", releaseNoteString) - chart.Annotations["artifacthub.io/changes"] = releaseNoteString + utils.CheckIfError(err, "HELM Failed to load chart manifest: %s", HelmChartPath) + + releaseNotesBytes, err := yaml.Marshal(releaseNotes) + utils.CheckIfError(err, "HELM Failed to marshal release notes") + + releaseNotesString := string(releaseNotesBytes) + utils.Info("HELM Chart release notes:\n%s", releaseNotesString) + chart.Annotations["artifacthub.io/changes"] = releaseNotesString + + utils.Info("HELM Saving chart release notes") err = chartutil.SaveChartfile(HelmChartPath, chart) - utils.CheckIfError(err, "HELM Saving updated release notes for Chart") + utils.CheckIfError(err, "HELM Failed to save chart manifest: %s", HelmChartPath) } // UpdateChartValue Updates the Helm ChartValue @@ -169,7 +170,7 @@ func runHelmDocs() error { if err != nil { return err } - err = sh.RunV("helm-docs", "--chart-search-root=${PWD}/charts") + err = sh.RunV("helm-docs", "--chart-search-root", "${PWD}/charts") if err != nil { return err } @@ -180,7 +181,7 @@ func installHelmDocs() error { utils.Info("HELM Install HelmDocs") g0 := sh.RunCmd("go") - err := g0("install", "github.com/norwoodj/helm-docs/cmd/helm-docs@v1.11.0") + err := g0("install", "github.com/norwoodj/helm-docs/cmd/helm-docs@latest") if err != nil { return err } diff --git a/magefiles/steps/release.go b/magefiles/steps/release.go index 1ed09850f..b6d46336a 100644 --- a/magefiles/steps/release.go +++ b/magefiles/steps/release.go @@ -74,7 +74,7 @@ func (Release) NewReleaseFromOld(version, oldversion string) { func (Release) E2EDocs() { e2edocs, err := utils.GenerateE2EDocs() utils.CheckIfError(err, "error on template") - err = os.WriteFile("docs/e2e-tests.md", []byte(e2edocs), 644) + err = os.WriteFile("docs/e2e-tests.md", []byte(e2edocs), 0644) utils.CheckIfError(err, "Could not write new e2e test file ") } @@ -158,7 +158,7 @@ func updateIndexMD(old, new string) error { utils.CheckIfError(err, "Could not read INDEX_DOCS file %s", INDEX_DOCS) datString := string(data) datString = strings.Replace(datString, old, new, -1) - err = os.WriteFile(INDEX_DOCS, []byte(datString), 644) + err = os.WriteFile(INDEX_DOCS, []byte(datString), 0644) if err != nil { utils.ErrorF("Could not write new %s %s", INDEX_DOCS, err) return err @@ -215,7 +215,6 @@ func (Release) LatestCommitLogs() { } func commitsBetweenTags(newversion, oldversion string) []string { - var newTag, oldTag string tags := getAllControllerTags() newTag, oldTag = tags[0], tags[1] @@ -256,7 +255,7 @@ func makeReleaseNotes(newVersion, oldVersion string) (*utils.ReleaseNote, error) // the newControllerVersion should match the latest tag if newControllerVersion != allControllerTags[0] { - return nil, errors.New(fmt.Sprintf("Generating release new version %s didnt match the current latest tag %s", newControllerVersion, allControllerTags[0])) + return nil, fmt.Errorf("generating release new version %s didnt match the current latest tag %s", newControllerVersion, allControllerTags[0]) } // previous version newReleaseNotes.PreviousControllerVersion = allControllerTags[1] @@ -273,8 +272,8 @@ func makeReleaseNotes(newVersion, oldVersion string) (*utils.ReleaseNote, error) var allUpdates []string var depUpdates []string var helmUpdates []string - prRegex := regexp.MustCompile("\\(#\\d+\\)") - depBot := regexp.MustCompile("^(\\w){1,10} Bump ") + prRegex := regexp.MustCompile(`\(#\d+\)`) + depBot := regexp.MustCompile(`^(\w){1,10} Bump `) helmRegex := regexp.MustCompile("helm|chart") for i, s := range commits { // matches on PR @@ -323,13 +322,13 @@ func makeReleaseNotes(newVersion, oldVersion string) (*utils.ReleaseNote, error) controllerDigest := utils.FindImageDigest(data, "controller", newVersion) if len(controllerDigest) == 0 { utils.ErrorF("Controller Digest could not be found") - return nil, errors.New("Controller digest could not be found") + return nil, errors.New("controller digest could not be found") } controllerChrootDigest := utils.FindImageDigest(data, "controller-chroot", newVersion) if len(controllerChrootDigest) == 0 { utils.ErrorF("Controller Chroot Digest could not be found") - return nil, errors.New("Controller Chroot digest could not be found") + return nil, errors.New("controller chroot digest could not be found") } utils.Debug("Latest Controller Digest %v", controllerDigest) diff --git a/magefiles/utils/e2edocs.go b/magefiles/utils/e2edocs.go index 2edc2ca40..2f5626db6 100644 --- a/magefiles/utils/e2edocs.go +++ b/magefiles/utils/e2edocs.go @@ -25,22 +25,19 @@ import ( "os" "path/filepath" "regexp" + "slices" "strings" "text/template" - - "slices" ) //go:embed templates/e2edocs.tpl var tplContent embed.FS -var ( - skipFiles = []string{ - "test/e2e/framework/framework.go", - "test/e2e/e2e.go", - "test/e2e/e2e_test.go", - } -) +var skipFiles = []string{ + "test/e2e/framework/framework.go", + "test/e2e/e2e.go", + "test/e2e/e2e_test.go", +} const ( testDir = "test/e2e" @@ -48,9 +45,7 @@ const ( URL = "https://github.com/kubernetes/ingress-nginx/tree/main/" ) -var ( - betweenquotes = regexp.MustCompile(`("|\')(?P.*)("|\')`) -) +var betweenquotes = regexp.MustCompile(`("|\')(?P.*)("|\')`) type E2ETemplate struct { URL string @@ -102,7 +97,7 @@ func (t *E2ETemplate) walkE2eDir(path string, d fs.DirEntry, errAggregated error fileScanner.Split(bufio.ScanLines) tests := make([]string, 0) - var lineN = 0 + lineN := 0 for fileScanner.Scan() { lineN = lineN + 1 if !containsGinkgoTest(fileScanner.Text()) { @@ -136,5 +131,4 @@ func GenerateE2EDocs() (string, error) { return "", err } return tplBuff.String(), nil - } diff --git a/magefiles/utils/helm.go b/magefiles/utils/helm.go index dea68caab..cb8acae57 100644 --- a/magefiles/utils/helm.go +++ b/magefiles/utils/helm.go @@ -31,7 +31,6 @@ type IngressChartValue struct { RunAsUser int `yaml:"runAsUser"` AllowPrivilegeEscalation bool `yaml:"allowPrivilegeEscalation"` } `yaml:"image"` - ExistingPsp string `yaml:"existingPsp"` ContainerName string `yaml:"containerName"` ContainerPort struct { HTTP int `yaml:"http"` @@ -208,13 +207,6 @@ type IngressChartValue struct { ExtraVolumes []interface{} `yaml:"extraVolumes"` ExtraInitContainers []interface{} `yaml:"extraInitContainers"` ExtraModules []interface{} `yaml:"extraModules"` - Opentelemetry struct { - Enabled bool `yaml:"enabled"` - Image string `yaml:"image"` - ContainerSecurityContext struct { - AllowPrivilegeEscalation bool `yaml:"allowPrivilegeEscalation"` - } `yaml:"containerSecurityContext"` - } `yaml:"opentelemetry"` AdmissionWebhooks struct { Annotations struct{} `yaml:"annotations"` Enabled bool `yaml:"enabled"` @@ -226,7 +218,6 @@ type IngressChartValue struct { NamespaceSelector struct{} `yaml:"namespaceSelector"` ObjectSelector struct{} `yaml:"objectSelector"` Labels struct{} `yaml:"labels"` - ExistingPsp string `yaml:"existingPsp"` NetworkPolicyEnabled bool `yaml:"networkPolicyEnabled"` Service struct { Annotations struct{} `yaml:"annotations"` @@ -329,7 +320,6 @@ type IngressChartValue struct { ReadOnlyRootFilesystem bool `yaml:"readOnlyRootFilesystem"` AllowPrivilegeEscalation bool `yaml:"allowPrivilegeEscalation"` } `yaml:"image"` - ExistingPsp string `yaml:"existingPsp"` ExtraArgs struct{} `yaml:"extraArgs"` ServiceAccount struct { Create bool `yaml:"create"` @@ -388,9 +378,6 @@ type IngressChartValue struct { Create bool `yaml:"create"` Scope bool `yaml:"scope"` } `yaml:"rbac"` - PodSecurityPolicy struct { - Enabled bool `yaml:"enabled"` - } `yaml:"podSecurityPolicy"` ServiceAccount struct { Create bool `yaml:"create"` Name string `yaml:"name"` diff --git a/magefiles/utils/releasenote.go b/magefiles/utils/releasenote.go index fa883104f..341595444 100644 --- a/magefiles/utils/releasenote.go +++ b/magefiles/utils/releasenote.go @@ -37,14 +37,14 @@ type ReleaseNote struct { func (r ReleaseNote) Template() { // Files are provided as a slice of strings. - changelogTemplate, err := os.ReadFile("Changelog.md.gotmpl") + changelogTemplate, err := os.ReadFile("changelog/controller.md.gotmpl") if err != nil { ErrorF("Could not read changelog template file %s", err) } Debug("ChangeLog Templates %s", string(changelogTemplate)) t := template.Must(template.New("changelog").Parse(string(changelogTemplate))) // create a new file - file, err := os.Create(fmt.Sprintf("changelog/Changelog-%s.md", r.Version)) + file, err := os.Create(fmt.Sprintf("changelog/controller-%s.md", r.Version)) if err != nil { ErrorF("Could not create changelog file %s", err) } @@ -58,14 +58,14 @@ func (r ReleaseNote) Template() { func (r ReleaseNote) HelmTemplate() { // Files are provided as a slice of strings. - changelogTemplate, err := os.ReadFile("charts/ingress-nginx/changelog.md.gotmpl") + changelogTemplate, err := os.ReadFile("charts/ingress-nginx/changelog/helm-chart.md.gotmpl") if err != nil { ErrorF("Could not read changelog template file %s", err) } Debug("ChangeLog Templates %s", string(changelogTemplate)) t := template.Must(template.New("changelog").Parse(string(changelogTemplate))) // create a new file - file, err := os.Create(fmt.Sprintf("charts/ingress-nginx/changelog/Changelog-%s.md", r.NewHelmChartVersion)) + file, err := os.Create(fmt.Sprintf("charts/ingress-nginx/changelog/helm-chart-%s.md", r.NewHelmChartVersion)) if err != nil { ErrorF("Could not create changelog file %s", err) } diff --git a/mkdocs.yml b/mkdocs.yml index 3243f8247..b59546c9c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -50,6 +50,7 @@ theme: - navigation.tabs.sticky - navigation.instant - navigation.sections + - content.code.copy palette: primary: "teal" @@ -65,7 +66,6 @@ plugins: extra_css: [extra.css] -google_analytics: ["UA-118407822-1", "kubernetes.github.io"] nav: - Welcome: @@ -79,11 +79,12 @@ nav: - Role Based Access Control (RBAC): "deploy/rbac.md" - Upgrade: "deploy/upgrade.md" - Hardening guide: "deploy/hardening-guide.md" - - User guide: + - User Guide: - NGINX Configuration: - Introduction: "user-guide/nginx-configuration/index.md" - Basic usage: "user-guide/basic-usage.md" - Annotations: "user-guide/nginx-configuration/annotations.md" + - Annotations Risks: "user-guide/nginx-configuration/annotations-risk.md" - ConfigMap: "user-guide/nginx-configuration/configmap.md" - Custom NGINX template: "user-guide/nginx-configuration/custom-template.md" - Log format: "user-guide/nginx-configuration/log-format.md" @@ -100,7 +101,6 @@ nav: - TLS/HTTPS: "user-guide/tls.md" - Third party addons: - ModSecurity Web Application Firewall: "user-guide/third-party-addons/modsecurity.md" - - OpenTracing: "user-guide/third-party-addons/opentracing.md" - OpenTelemetry: "user-guide/third-party-addons/opentelemetry.md" - Examples: - Introduction: "examples/index.md" @@ -125,7 +125,6 @@ nav: - Rewrite: "examples/rewrite/README.md" - Static IPs: "examples/static-ip/README.md" - TLS termination: "examples/tls-termination/README.md" - - Pod Security Policy (PSP): "examples/psp/README.md" - Open Policy Agent rules: "examples/openpolicyagent/README.md" - Canary Deployments: "examples/canary/README.md" - Developer Guide: diff --git a/pkg/apis/ingress/types.go b/pkg/apis/ingress/types.go index 0742e9f3b..ccdd49fe9 100644 --- a/pkg/apis/ingress/types.go +++ b/pkg/apis/ingress/types.go @@ -27,15 +27,14 @@ import ( "k8s.io/ingress-nginx/internal/ingress/annotations/authtls" "k8s.io/ingress-nginx/internal/ingress/annotations/connection" "k8s.io/ingress-nginx/internal/ingress/annotations/cors" + "k8s.io/ingress-nginx/internal/ingress/annotations/customheaders" "k8s.io/ingress-nginx/internal/ingress/annotations/fastcgi" - "k8s.io/ingress-nginx/internal/ingress/annotations/globalratelimit" "k8s.io/ingress-nginx/internal/ingress/annotations/ipallowlist" "k8s.io/ingress-nginx/internal/ingress/annotations/ipdenylist" "k8s.io/ingress-nginx/internal/ingress/annotations/log" "k8s.io/ingress-nginx/internal/ingress/annotations/mirror" "k8s.io/ingress-nginx/internal/ingress/annotations/modsecurity" "k8s.io/ingress-nginx/internal/ingress/annotations/opentelemetry" - "k8s.io/ingress-nginx/internal/ingress/annotations/opentracing" "k8s.io/ingress-nginx/internal/ingress/annotations/proxy" "k8s.io/ingress-nginx/internal/ingress/annotations/proxyssl" "k8s.io/ingress-nginx/internal/ingress/annotations/ratelimit" @@ -199,10 +198,10 @@ type Server struct { Aliases []string `json:"aliases,omitempty"` // RedirectFromToWWW returns if a redirect to/from prefix www is required RedirectFromToWWW bool `json:"redirectFromToWWW,omitempty"` - // CertificateAuth indicates the this server requires mutual authentication + // CertificateAuth indicates this server requires mutual authentication // +optional CertificateAuth authtls.Config `json:"certificateAuth"` - // ProxySSL indicates the this server uses client certificate to access backends + // ProxySSL indicates this server uses client certificate to access backends // +optional ProxySSL proxyssl.Config `json:"proxySSL"` // ServerSnippet returns the snippet of server @@ -211,7 +210,7 @@ type Server struct { // SSLCiphers returns list of ciphers to be enabled SSLCiphers string `json:"sslCiphers,omitempty"` // SSLPreferServerCiphers indicates that server ciphers should be preferred - // over client ciphers when using the SSLv3 and TLS protocols. + // over client ciphers when using the TLS protocols. SSLPreferServerCiphers string `json:"sslPreferServerCiphers,omitempty"` // AuthTLSError contains the reason why the access to a server should be denied AuthTLSError string `json:"authTLSError,omitempty"` @@ -220,7 +219,7 @@ type Server struct { // Location describes an URI inside a server. // Also contains additional information about annotations in the Ingress. // -// In some cases when more than one annotations is defined a particular order in the execution +// In some cases when more than one annotation is defined a particular order in the execution // is required. // The chain in the execution order of annotations should be: // - Denylist @@ -264,7 +263,8 @@ type Location struct { BasicDigestAuth auth.Config `json:"basicDigestAuth,omitempty"` // Denied returns an error when this location cannot not be allowed // Requesting a denied location should return HTTP code 403. - Denied *string `json:"denied,omitempty"` + Denied *string `json:"denied,omitempty"` + CustomHeaders customheaders.Config `json:"customHeaders,omitempty"` // CorsConfig returns the Cors Configuration for the ingress rule // +optional CorsConfig cors.Config `json:"corsConfig,omitempty"` @@ -284,10 +284,6 @@ type Location struct { // The Redirect annotation precedes RateLimit // +optional RateLimit ratelimit.Config `json:"rateLimit,omitempty"` - // GlobalRateLimit similar to RateLimit - // but this is applied globally across multiple replicas. - // +optional - GlobalRateLimit globalratelimit.Config `json:"globalRateLimit,omitempty"` // Redirect describes a temporal o permanent redirection this location. // +optional Redirect redirect.Config `json:"redirect,omitempty"` @@ -346,6 +342,11 @@ type Location struct { // CustomHTTPErrors specifies the error codes that should be intercepted. // +optional CustomHTTPErrors []int `json:"custom-http-errors"` + // ProxyInterceptErrors disables error interception when using CustomHTTPErrors + // e.g. custom 404 and 503 when service-a does not exist or is not available + // but service-a can return 404 and 503 error codes without intercept + // +optional + DisableProxyInterceptErrors bool `json:"disable-proxy-intercept-errors"` // ModSecurity allows to enable and configure modsecurity // +optional ModSecurity modsecurity.Config `json:"modsecurity"` @@ -354,9 +355,6 @@ type Location struct { // Mirror allows you to mirror traffic to a "test" backend // +optional Mirror mirror.Config `json:"mirror,omitempty"` - // Opentracing allows the global opentracing setting to be overridden for a location - // +optional - Opentracing opentracing.Config `json:"opentracing"` // Opentelemetry allows the global opentelemetry setting to be overridden for a location // +optional Opentelemetry opentelemetry.Config `json:"opentelemetry"` diff --git a/pkg/apis/ingress/types_equals.go b/pkg/apis/ingress/types_equals.go index 45f0eedba..6fba3bd45 100644 --- a/pkg/apis/ingress/types_equals.go +++ b/pkg/apis/ingress/types_equals.go @@ -390,9 +390,6 @@ func (l1 *Location) Equal(l2 *Location) bool { if !(&l1.RateLimit).Equal(&l2.RateLimit) { return false } - if !(&l1.GlobalRateLimit).Equal(&l2.GlobalRateLimit) { - return false - } if !(&l1.Redirect).Equal(&l2.Redirect) { return false } @@ -458,10 +455,6 @@ func (l1 *Location) Equal(l2 *Location) bool { return false } - if !l1.Opentracing.Equal(&l2.Opentracing) { - return false - } - if !l1.Opentelemetry.Equal(&l2.Opentelemetry) { return false } @@ -470,6 +463,14 @@ func (l1 *Location) Equal(l2 *Location) bool { return false } + if l1.DisableProxyInterceptErrors != l2.DisableProxyInterceptErrors { + return false + } + + if !l1.CustomHeaders.Equal(&l2.CustomHeaders) { + return false + } + return true } diff --git a/pkg/flags/flags.go b/pkg/flags/flags.go index d3bc4ee86..ce24160fd 100644 --- a/pkg/flags/flags.go +++ b/pkg/flags/flags.go @@ -17,6 +17,7 @@ limitations under the License. package flags import ( + "errors" "flag" "fmt" "net" @@ -132,6 +133,9 @@ Requires setting the publish-service parameter to a valid Service reference.`) electionID = flags.String("election-id", "ingress-controller-leader", `Election id to use for Ingress status updates.`) + electionTTL = flags.Duration("election-ttl", 30*time.Second, + `Duration a leader election is valid before it's getting re-elected`) + updateStatusOnShutdown = flags.Bool("update-status-on-shutdown", true, `Update the load-balancer status of Ingress objects when the controller shuts down. Requires the update-status parameter.`) @@ -146,14 +150,17 @@ Requires the update-status parameter.`) enableSSLPassthrough = flags.Bool("enable-ssl-passthrough", false, `Enable SSL Passthrough.`) + disableLeaderElection = flags.Bool("disable-leader-election", false, + `Disable Leader Election on NGINX Controller.`) + disableServiceExternalName = flags.Bool("disable-svc-external-name", false, `Disable support for Services of type ExternalName.`) annotationsPrefix = flags.String("annotations-prefix", parser.DefaultAnnotationsPrefix, `Prefix of the Ingress annotations specific to the NGINX controller.`) - enableAnnotationValidation = flags.Bool("enable-annotation-validation", false, - `If true, will enable the annotation validation feature. This value will be defaulted to true on a future release`) + enableAnnotationValidation = flags.Bool("enable-annotation-validation", true, + `If true, will enable the annotation validation feature. Defaults to true`) enableSSLChainCompletion = flags.Bool("enable-ssl-chain-completion", false, `Autocomplete SSL certificate chains with missing intermediate CA certificates. @@ -167,16 +174,20 @@ extension for this to succeed.`) `Customized address (or addresses, separated by comma) to set as the load-balancer status of Ingress objects this controller satisfies. Requires the update-status parameter.`) - enableMetrics = flags.Bool("enable-metrics", true, + enableMetrics = flags.Bool("enable-metrics", false, `Enables the collection of NGINX metrics.`) metricsPerHost = flags.Bool("metrics-per-host", true, `Export metrics per-host.`) + metricsPerUndefinedHost = flags.Bool("metrics-per-undefined-host", false, + `Export metrics per-host even if the host is not defined in an ingress. Requires --metrics-per-host to be set to true.`) reportStatusClasses = flags.Bool("report-status-classes", false, `Use status classes (2xx, 3xx, 4xx and 5xx) instead of status codes in metrics.`) timeBuckets = flags.Float64Slice("time-buckets", prometheus.DefBuckets, "Set of buckets which will be used for prometheus histogram metrics such as RequestTime, ResponseTime.") lengthBuckets = flags.Float64Slice("length-buckets", prometheus.LinearBuckets(10, 10, 10), "Set of buckets which will be used for prometheus histogram metrics such as RequestLength, ResponseLength.") sizeBuckets = flags.Float64Slice("size-buckets", prometheus.ExponentialBuckets(10, 10, 7), "Set of buckets which will be used for prometheus histogram metrics such as BytesSent.") + bucketFactor = flags.Float64("bucket-factor", 0, "Bucket factor for native histograms. Value must be > 1 for enabling native histograms.") + maxBuckets = flags.Uint32("max-buckets", 100, "Maximum number of buckets for native histograms.") excludeSocketMetrics = flags.StringSlice("exclude-socket-metrics", []string{}, "et of socket request metrics to exclude which won't be exported nor being calculated. E.g. 'nginx_ingress_controller_success,nginx_ingress_controller_header_duration_seconds'.") monitorMaxBatchSize = flags.Int("monitor-max-batch-size", 10000, "Max batch size of NGINX metrics.") @@ -226,7 +237,7 @@ Takes the form ":port". If not provided, no admission controller is starte flags.StringVar(&nginx.MaxmindMirror, "maxmind-mirror", "", `Maxmind mirror url (example: http://geoip.local/databases.`) flags.StringVar(&nginx.MaxmindLicenseKey, "maxmind-license-key", "", `Maxmind license key to download GeoLite2 Databases. -https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases .`) +https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/ .`) flags.StringVar(&nginx.MaxmindEditionIDs, "maxmind-edition-ids", "GeoLite2-City,GeoLite2-ASN", `Maxmind edition ids to download GeoLite2 Databases.`) flags.IntVar(&nginx.MaxmindRetriesCount, "maxmind-retries-count", 1, "Number of attempts to download the GeoIP DB.") flags.DurationVar(&nginx.MaxmindRetriesTimeout, "maxmind-retries-timeout", time.Second*0, "Maxmind downloading delay between 1st and 2nd attempt, 0s - do not retry to download if something went wrong.") @@ -311,6 +322,14 @@ https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-g } } + if *metricsPerUndefinedHost && !*metricsPerHost { + return false, nil, errors.New("--metrics-per-undefined-host=true must be passed with --metrics-per-host=true") + } + + if *electionTTL <= 0 { + *electionTTL = 30 * time.Second + } + histogramBuckets := &collectors.HistogramBuckets{ TimeBuckets: *timeBuckets, LengthBuckets: *lengthBuckets, @@ -324,15 +343,20 @@ https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-g KubeConfigFile: *kubeConfigFile, UpdateStatus: *updateStatus, ElectionID: *electionID, + ElectionTTL: *electionTTL, EnableProfiling: *profiling, EnableMetrics: *enableMetrics, MetricsPerHost: *metricsPerHost, + MetricsPerUndefinedHost: *metricsPerUndefinedHost, MetricsBuckets: histogramBuckets, + MetricsBucketFactor: *bucketFactor, + MetricsMaxBuckets: *maxBuckets, ReportStatusClasses: *reportStatusClasses, ExcludeSocketMetrics: *excludeSocketMetrics, MonitorMaxBatchSize: *monitorMaxBatchSize, DisableServiceExternalName: *disableServiceExternalName, EnableSSLPassthrough: *enableSSLPassthrough, + DisableLeaderElection: *disableLeaderElection, ResyncPeriod: *resyncPeriod, DefaultService: *defaultSvc, Namespace: *watchNamespace, diff --git a/pkg/flags/flags_test.go b/pkg/flags/flags_test.go index bffe2b16d..fdf153021 100644 --- a/pkg/flags/flags_test.go +++ b/pkg/flags/flags_test.go @@ -19,6 +19,7 @@ package flags import ( "os" "testing" + "time" ) func TestNoMandatoryFlag(t *testing.T) { @@ -109,3 +110,131 @@ func TestMaxmindRetryDownload(t *testing.T) { t.Fatalf("Expected an error parsing flags but none returned") } } + +func TestDisableLeaderElectionFlag(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--disable-leader-election", "--http-port", "80", "--https-port", "443"} + + _, conf, err := ParseFlags() + if err != nil { + t.Fatalf("Unexpected error parsing default flags: %v", err) + } + + if !conf.DisableLeaderElection { + t.Fatalf("Expected --disable-leader-election and conf.DisableLeaderElection as true, but found: %v", conf.DisableLeaderElection) + } +} + +func TestIfLeaderElectionDisabledFlagIsFalse(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--http-port", "80", "--https-port", "443"} + + _, conf, err := ParseFlags() + if err != nil { + t.Fatalf("Unexpected error parsing default flags: %v", err) + } + + if conf.DisableLeaderElection { + t.Fatalf("Expected --disable-leader-election and conf.DisableLeaderElection as false, but found: %v", conf.DisableLeaderElection) + } +} + +func TestLeaderElectionTTLDefaultValue(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--http-port", "80", "--https-port", "443"} + + _, conf, err := ParseFlags() + if err != nil { + t.Fatalf("Unexpected error parsing default flags: %v", err) + } + + if conf.ElectionTTL != 30*time.Second { + t.Fatalf("Expected --election-ttl and conf.ElectionTTL as 30s, but found: %v", conf.ElectionTTL) + } +} + +func TestLeaderElectionTTLParseValueInSeconds(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--http-port", "80", "--https-port", "443", "--election-ttl", "10s"} + + _, conf, err := ParseFlags() + if err != nil { + t.Fatalf("Unexpected error parsing default flags: %v", err) + } + + if conf.ElectionTTL != 10*time.Second { + t.Fatalf("Expected --election-ttl and conf.ElectionTTL as 10s, but found: %v", conf.ElectionTTL) + } +} + +func TestLeaderElectionTTLParseValueInMinutes(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--http-port", "80", "--https-port", "443", "--election-ttl", "10m"} + + _, conf, err := ParseFlags() + if err != nil { + t.Fatalf("Unexpected error parsing default flags: %v", err) + } + + if conf.ElectionTTL != 10*time.Minute { + t.Fatalf("Expected --election-ttl and conf.ElectionTTL as 10m, but found: %v", conf.ElectionTTL) + } +} + +func TestLeaderElectionTTLParseValueInHours(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--http-port", "80", "--https-port", "443", "--election-ttl", "1h"} + + _, conf, err := ParseFlags() + if err != nil { + t.Fatalf("Unexpected error parsing default flags: %v", err) + } + + if conf.ElectionTTL != 1*time.Hour { + t.Fatalf("Expected --election-ttl and conf.ElectionTTL as 1h, but found: %v", conf.ElectionTTL) + } +} + +func TestMetricsPerUndefinedHost(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--metrics-per-undefined-host=true"} + + _, _, err := ParseFlags() + if err != nil { + t.Fatalf("Expected no error but got: %s", err) + } +} + +func TestMetricsPerUndefinedHostWithMetricsPerHostFalse(t *testing.T) { + ResetForTesting(func() { t.Fatal("Parsing failed") }) + + oldArgs := os.Args + defer func() { os.Args = oldArgs }() + os.Args = []string{"cmd", "--metrics-per-host=false", "--metrics-per-undefined-host=true"} + + _, _, err := ParseFlags() + if err == nil { + t.Fatalf("Expected an error parsing flags but none returned") + } +} diff --git a/pkg/tcpproxy/tcp.go b/pkg/tcpproxy/tcp.go index eda4a2746..fba4d21be 100644 --- a/pkg/tcpproxy/tcp.go +++ b/pkg/tcpproxy/tcp.go @@ -125,9 +125,8 @@ func (p *TCPProxy) Handle(conn net.Conn) { func pipe(client, server net.Conn) { doCopy := func(s, c net.Conn, cancel chan<- bool) { - if _, err := io.Copy(s, c); err != nil { - klog.Errorf("Error copying data: %v", err) - } + //nolint:errcheck // No need to catch these errors + io.Copy(s, c) cancel <- true } diff --git a/pkg/util/runtime/cpu_linux.go b/pkg/util/runtime/cpu_linux.go index cfc49d924..7db609053 100644 --- a/pkg/util/runtime/cpu_linux.go +++ b/pkg/util/runtime/cpu_linux.go @@ -36,15 +36,42 @@ import ( // // https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt func NumCPU() int { + return NumCPUWithCustomPath("") +} + +func NumCPUWithCustomPath(path string) int { cpus := runtime.NumCPU() - cgroupPath, err := libcontainercgroups.FindCgroupMountpoint("", "cpu") - if err != nil { - return cpus + cgroupVersionCheckPath := path + + if cgroupVersionCheckPath == "" { + cgroupVersionCheckPath = "/sys/fs/cgroup/" } - cpuQuota := readCgroupFileToInt64(cgroupPath, "cpu.cfs_quota_us") - cpuPeriod := readCgroupFileToInt64(cgroupPath, "cpu.cfs_period_us") + cgroupVersion := GetCgroupVersion(cgroupVersionCheckPath) + cpuQuota := int64(-1) + cpuPeriod := int64(-1) + + if cgroupVersion == 1 { + cgroupPath := "" + if path == "" { + cgroupPathRd, err := libcontainercgroups.FindCgroupMountpoint("", "cpu") + if err != nil { + return cpus + } + cgroupPath = cgroupPathRd + } else { + cgroupPath = path + } + cpuQuota = readCgroupFileToInt64(cgroupPath, "cpu.cfs_quota_us") + cpuPeriod = readCgroupFileToInt64(cgroupPath, "cpu.cfs_period_us") + } else if cgroupVersion == 2 { + cgroupPath := "/sys/fs/cgroup/" + if path != "" { + cgroupPath = path + } + cpuQuota, cpuPeriod = readCgroup2FileToInt64Tuple(cgroupPath, "cpu.max") + } if cpuQuota == -1 || cpuPeriod == -1 { return cpus @@ -53,16 +80,66 @@ func NumCPU() int { return int(math.Ceil(float64(cpuQuota) / float64(cpuPeriod))) } -func readCgroupFileToInt64(cgroupPath, cgroupFile string) int64 { - contents, err := os.ReadFile(filepath.Join(cgroupPath, cgroupFile)) - if err != nil { - return -1 +func GetCgroupVersion(cgroupPath string) int64 { + // /sys/fs/cgroup/cgroup.controllers will not exist with cgroupsv1 + if _, err := os.Stat(filepath.Join(cgroupPath, "cgroup.controllers")); err == nil { + return 2 } - strValue := strings.TrimSpace(string(contents)) + return 1 +} + +func readCgroup2StringToInt64Tuple(cgroupString string) (quota, period int64) { + // file contents looks like: $MAX $PERIOD + // $MAX can have value "max" indicating no limit + // it is possible for $PERIOD to be unset + + values := strings.Fields(cgroupString) + + if values[0] == "max" { + return -1, -1 + } + + cpuQuota, err := strconv.ParseInt(values[0], 10, 64) + if err != nil { + return -1, -1 + } + + if len(values) == 1 { + return cpuQuota, 100000 + } + + cpuPeriod, err := strconv.ParseInt(values[1], 10, 64) + if err != nil { + return -1, -1 + } + + return cpuQuota, cpuPeriod +} + +func readCgroup2FileToInt64Tuple(cgroupPath, cgroupFile string) (quota, period int64) { + contents, err := os.ReadFile(filepath.Join(cgroupPath, cgroupFile)) + if err != nil { + return -1, -1 + } + + return readCgroup2StringToInt64Tuple(string(contents)) +} + +func readCgroupStringToInt64(contents string) int64 { + strValue := strings.TrimSpace(contents) if value, err := strconv.ParseInt(strValue, 10, 64); err == nil { return value } return -1 } + +func readCgroupFileToInt64(cgroupPath, cgroupFile string) int64 { + contents, err := os.ReadFile(filepath.Join(cgroupPath, cgroupFile)) + if err != nil { + return -1 + } + + return readCgroupStringToInt64(string(contents)) +} diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index 75cf3fc65..9b7753b5d 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -49,16 +49,17 @@ COPY --chown=www-data:www-data bin/${TARGETARCH}/wait-shutdown / # with volumes (custom templates) RUN bash -xeu -c ' \ writeDirs=( \ - /etc/ingress-controller \ /etc/ingress-controller/ssl \ /etc/ingress-controller/auth \ + /etc/ingress-controller/geoip \ + /etc/ingress-controller/telemetry \ /var/log \ /var/log/nginx \ /tmp/nginx \ ); \ for dir in "${writeDirs[@]}"; do \ mkdir -p ${dir}; \ - chown -R www-data.www-data ${dir}; \ + chown -R www-data:www-data ${dir}; \ done' \ # LD_LIBRARY_PATH does not work so below is needed for opentelemetry/other modules # Put libs of newer modules under `/modules_mount//lib` and add that path below @@ -83,5 +84,4 @@ RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log ENTRYPOINT ["/usr/bin/dumb-init", "--"] - CMD ["/nginx-ingress-controller"] diff --git a/rootfs/Dockerfile-chroot b/rootfs/Dockerfile-chroot index 09e0ba7ce..481b311e2 100644 --- a/rootfs/Dockerfile-chroot +++ b/rootfs/Dockerfile-chroot @@ -23,7 +23,7 @@ RUN apk update \ && apk upgrade \ && /chroot.sh -FROM alpine:3.18.4 +FROM alpine:3.21 ARG TARGETARCH ARG VERSION @@ -78,7 +78,7 @@ RUN bash -xeu -c ' \ ); \ for dir in "${writeDirs[@]}"; do \ mkdir -p ${dir}; \ - chown -R www-data.www-data ${dir}; \ + chown -R www-data:www-data ${dir}; \ done' \ # LD_LIBRARY_PATH does not work so below is needed for opentelemetry/other modules # Put libs of newer modules under `/modules_mount//lib` and add that path below @@ -103,7 +103,7 @@ RUN ln -sf /chroot/etc/nginx /etc/nginx \ && touch /chroot/var/log/nginx/access.log \ && chown www-data:www-data /chroot/var/log/nginx/access.log \ && echo "" > /chroot/etc/resolv.conf \ - && chown -R www-data.www-data /chroot/var/log/nginx /chroot/etc/resolv.conf \ + && chown -R www-data:www-data /chroot/var/log/nginx /chroot/etc/resolv.conf \ && mknod -m 0666 /chroot/dev/null c 1 3 \ && mknod -m 0666 /chroot/dev/random c 1 8 \ && mknod -m 0666 /chroot/dev/urandom c 1 9 \ @@ -119,7 +119,6 @@ RUN mkdir -p /chroot/modules_mount \ USER www-data EXPOSE 80 443 - ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["/nginx-ingress-controller"] diff --git a/rootfs/chroot.sh b/rootfs/chroot.sh index 9f3cbd804..4875ae535 100755 --- a/rootfs/chroot.sh +++ b/rootfs/chroot.sh @@ -21,6 +21,8 @@ writeDirs=( \ /chroot/etc/ingress-controller \ /chroot/etc/ingress-controller/ssl \ /chroot/etc/ingress-controller/auth \ + /chroot/etc/ingress-controller/telemetry \ + /chroot/etc/ingress-controller/geoip \ /chroot/opt/modsecurity/var/log \ /chroot/opt/modsecurity/var/upload \ /chroot/opt/modsecurity/var/audit \ @@ -37,11 +39,13 @@ writeDirs=( \ for dir in "${writeDirs[@]}"; do mkdir -p ${dir}; - chown -R www-data.www-data ${dir}; + chown -R www-data:www-data ${dir}; done mkdir -p /chroot/lib /chroot/proc /chroot/usr /chroot/bin /chroot/dev /chroot/run -cp /etc/passwd /etc/group /chroot/etc/ +cp /etc/passwd /etc/group /etc/hosts /chroot/etc/ cp -a /usr/* /chroot/usr/ cp -a /etc/nginx/* /chroot/etc/nginx/ -cp /lib/ld-musl-* /lib/libcrypto* /lib/libssl* /lib/libz* /chroot/lib/ +cp -a /etc/ingress-controller/* /chroot/etc/ingress-controller/ +cp /lib/ld-musl-* /chroot/lib/ +cp /usr/lib/libcrypto* /usr/lib/libssl* /usr/lib/libz* /chroot/usr/lib/ diff --git a/rootfs/etc/nginx/lua/OWNERS b/rootfs/etc/nginx/lua/OWNERS index 79814fdba..efb131316 100644 --- a/rootfs/etc/nginx/lua/OWNERS +++ b/rootfs/etc/nginx/lua/OWNERS @@ -1,4 +1,4 @@ -# See the OWNERS docs: https://github.com/kubernetes/community/blob/master/contributors/guide/owners.md +# See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners labels: -- area/lua \ No newline at end of file +- area/lua diff --git a/rootfs/etc/nginx/lua/certificate.lua b/rootfs/etc/nginx/lua/certificate.lua index 48c8d7134..1b3d3b21f 100644 --- a/rootfs/etc/nginx/lua/certificate.lua +++ b/rootfs/etc/nginx/lua/certificate.lua @@ -103,6 +103,7 @@ local function do_ocsp_request(url, ocsp_request) ["Host"] = parsed_url[2], }, body = ocsp_request, + ssl_server_name = parsed_url[2], }) if not http_response then return nil, err diff --git a/rootfs/etc/nginx/lua/global_throttle.lua b/rootfs/etc/nginx/lua/global_throttle.lua deleted file mode 100644 index bea8cfd17..000000000 --- a/rootfs/etc/nginx/lua/global_throttle.lua +++ /dev/null @@ -1,131 +0,0 @@ -local resty_global_throttle = require("resty.global_throttle") -local resty_ipmatcher = require("resty.ipmatcher") -local util = require("util") - -local ngx = ngx -local ngx_exit = ngx.exit -local ngx_log = ngx.log -local ngx_ERR = ngx.ERR -local ngx_INFO = ngx.INFO - -local _M = {} - -local DECISION_CACHE = ngx.shared.global_throttle_cache - --- it does not make sense to cache decision for too little time --- the benefit of caching likely is negated if we cache for too little time --- Lua Shared Dict's time resolution for expiry is 0.001. -local CACHE_THRESHOLD = 0.001 - -local DEFAULT_RAW_KEY = "remote_addr" - -local function should_ignore_request(ignored_cidrs) - if not ignored_cidrs or #ignored_cidrs == 0 then - return false - end - - local ignored_cidrs_matcher, err = resty_ipmatcher.new(ignored_cidrs) - if not ignored_cidrs_matcher then - ngx_log(ngx_ERR, "failed to initialize resty-ipmatcher: ", err) - return false - end - - local is_ignored - is_ignored, err = ignored_cidrs_matcher:match(ngx.var.remote_addr) - if err then - ngx_log(ngx_ERR, "failed to match ip: '", - ngx.var.remote_addr, "': ", err) - return false - end - - return is_ignored -end - -local function is_enabled(config, location_config) - if config.memcached.host == "" or config.memcached.port == 0 then - return false - end - if location_config.limit == 0 or - location_config.window_size == 0 then - return false - end - - if should_ignore_request(location_config.ignored_cidrs) then - return false - end - - return true -end - -local function get_namespaced_key_value(namespace, key_value) - return namespace .. key_value -end - -function _M.throttle(config, location_config) - if not is_enabled(config, location_config) then - return - end - - local key_value = util.generate_var_value(location_config.key) - if not key_value or key_value == "" then - key_value = ngx.var[DEFAULT_RAW_KEY] - end - - local namespaced_key_value = - get_namespaced_key_value(location_config.namespace, key_value) - - local is_limit_exceeding = DECISION_CACHE:get(namespaced_key_value) - if is_limit_exceeding then - ngx.var.global_rate_limit_exceeding = "c" - return ngx_exit(config.status_code) - end - - local my_throttle, err = resty_global_throttle.new( - location_config.namespace, - location_config.limit, - location_config.window_size, - { - provider = "memcached", - host = config.memcached.host, - port = config.memcached.port, - connect_timeout = config.memcached.connect_timeout, - max_idle_timeout = config.memcached.max_idle_timeout, - pool_size = config.memcached.pool_size, - } - ) - if err then - ngx.log(ngx.ERR, "faled to initialize resty_global_throttle: ", err) - -- fail open - return - end - - local desired_delay, estimated_final_count - estimated_final_count, desired_delay, err = my_throttle:process(key_value) - if err then - ngx.log(ngx.ERR, "error while processing key: ", err) - -- fail open - return - end - - if desired_delay then - if desired_delay > CACHE_THRESHOLD then - local ok - ok, err = - DECISION_CACHE:safe_add(namespaced_key_value, true, desired_delay) - if not ok then - if err ~= "exists" then - ngx_log(ngx_ERR, "failed to cache decision: ", err) - end - end - end - - ngx.var.global_rate_limit_exceeding = "y" - ngx_log(ngx_INFO, "limit is exceeding for ", - location_config.namespace, "/", key_value, - " with estimated_final_count: ", estimated_final_count) - - return ngx_exit(config.status_code) - end -end - -return _M diff --git a/rootfs/etc/nginx/lua/lua_ingress.lua b/rootfs/etc/nginx/lua/lua_ingress.lua index 49e0f5b05..a513928cf 100644 --- a/rootfs/etc/nginx/lua/lua_ingress.lua +++ b/rootfs/etc/nginx/lua/lua_ingress.lua @@ -1,8 +1,8 @@ local ngx_re_split = require("ngx.re").split +local string_to_bool = require("util").string_to_bool local certificate_configured_for_current_request = require("certificate").configured_for_current_request -local global_throttle = require("global_throttle") local ngx = ngx local io = io @@ -109,7 +109,16 @@ end -- rewrite gets called in every location context. -- This is where we do variable assignments to be used in subsequent -- phases or redirection -function _M.rewrite(location_config) +function _M.rewrite() + + local location_config = { + force_ssl_redirect = string_to_bool(ngx.var.force_ssl_redirect), + ssl_redirect = string_to_bool(ngx.var.ssl_redirect), + force_no_ssl_redirect = string_to_bool(ngx.var.force_no_ssl_redirect), + preserve_trailing_slash = string_to_bool(ngx.var.preserve_trailing_slash), + use_port_in_redirects = string_to_bool(ngx.var.use_port_in_redirects), + } + ngx.var.pass_access_scheme = ngx.var.scheme ngx.var.best_http_host = ngx.var.http_host or ngx.var.host @@ -164,7 +173,6 @@ function _M.rewrite(location_config) return ngx_redirect(uri, config.http_redirect_code) end - global_throttle.throttle(config.global_throttle, location_config.global_throttle) end function _M.header() diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_balancer.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_balancer.lua new file mode 100644 index 000000000..977d3e964 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_balancer.lua @@ -0,0 +1,2 @@ +local balancer = require("balancer") +balancer.balance() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_balancer_tcp_udp.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_balancer_tcp_udp.lua new file mode 100644 index 000000000..0442df7d8 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_balancer_tcp_udp.lua @@ -0,0 +1,2 @@ +local tcp_udp_balancer = require("tcp_udp_balancer") +tcp_udp_balancer.balance() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_certificate.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_certificate.lua new file mode 100644 index 000000000..d33d2171b --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_certificate.lua @@ -0,0 +1,2 @@ +local certificate = require("certificate") +certificate.call() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_configuration.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_configuration.lua new file mode 100644 index 000000000..7864f40ef --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_configuration.lua @@ -0,0 +1,2 @@ +local configuration = require("configuration") +configuration.call() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_content_tcp_udp.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_content_tcp_udp.lua new file mode 100644 index 000000000..ed81e7ff3 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_content_tcp_udp.lua @@ -0,0 +1,2 @@ +local tcp_udp_configuration = require("tcp_udp_configuration") +tcp_udp_configuration.call() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_external_auth.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_external_auth.lua new file mode 100644 index 000000000..6c68cf07c --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_external_auth.lua @@ -0,0 +1,30 @@ +local auth_path = ngx.var.auth_path +local auth_keepalive_share_vars = ngx.var.auth_keepalive_share_vars +local auth_response_headers = ngx.var.auth_response_headers +local ngx_re_split = require("ngx.re").split +local ipairs = ipairs +local ngx_log = ngx.log +local ngx_ERR = ngx.ERR + +local res = ngx.location.capture(auth_path, { + method = ngx.HTTP_GET, body = '', + share_all_vars = auth_keepalive_share_vars }) + +if res.status == ngx.HTTP_OK then + local header_parts, err = ngx_re_split(auth_response_headers, ",") + if err then + ngx_log(ngx_ERR, err) + return + end + ngx.var.auth_cookie = res.header['Set-Cookie'] + for i, header_name in ipairs(header_parts) do + local varname = "authHeader" .. tostring(i) + ngx.var[varname] = res.header[header_name] + end + return +end + +if res.status == ngx.HTTP_UNAUTHORIZED or res.status == ngx.HTTP_FORBIDDEN then + ngx.exit(res.status) +end +ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_init_tcp_udp.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_init_tcp_udp.lua new file mode 100644 index 000000000..926ab7a03 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_init_tcp_udp.lua @@ -0,0 +1,2 @@ +local tcp_udp_balancer = require("tcp_udp_balancer") +tcp_udp_balancer.init_worker() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_is_dynamic_lb_initialized.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_is_dynamic_lb_initialized.lua new file mode 100644 index 000000000..ade3114b1 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_is_dynamic_lb_initialized.lua @@ -0,0 +1,9 @@ +local configuration = require("configuration") +local backend_data = configuration.get_backends_data() +if not backend_data then + ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) + return +end + +ngx.say("OK") +ngx.exit(ngx.HTTP_OK) \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_log.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_log.lua new file mode 100644 index 000000000..8f3d57be6 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_log.lua @@ -0,0 +1,2 @@ +local monitor = require("monitor") +monitor.call() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_log_block.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_log_block.lua new file mode 100644 index 000000000..72f6a6430 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_log_block.lua @@ -0,0 +1,11 @@ +local balancer = require("balancer") +local monitor = require("monitor") + +local luaconfig = ngx.shared.luaconfig +local enablemetrics = luaconfig:get("enablemetrics") + +balancer.log() + +if enablemetrics then + monitor.call() +end \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_rewrite_auth.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_rewrite_auth.lua new file mode 100644 index 000000000..0d16faba0 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_rewrite_auth.lua @@ -0,0 +1 @@ +ngx.var.cache_key = ngx.encode_base64(ngx.sha1_bin(ngx.var.tmp_cache_key)) \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_conf_srv_hdr_filter.lua b/rootfs/etc/nginx/lua/nginx/ngx_conf_srv_hdr_filter.lua new file mode 100644 index 000000000..311a9b433 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_conf_srv_hdr_filter.lua @@ -0,0 +1,2 @@ +local lua_ingress = require("lua_ingress") +lua_ingress.header() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_rewrite.lua b/rootfs/etc/nginx/lua/nginx/ngx_rewrite.lua new file mode 100644 index 000000000..66fdd6d55 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_rewrite.lua @@ -0,0 +1,5 @@ +local lua_ingress = require("lua_ingress") +local balancer = require("balancer") + +lua_ingress.rewrite() +balancer.rewrite() \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/nginx/ngx_srv_redirect.lua b/rootfs/etc/nginx/lua/nginx/ngx_srv_redirect.lua new file mode 100644 index 000000000..4b9445d00 --- /dev/null +++ b/rootfs/etc/nginx/lua/nginx/ngx_srv_redirect.lua @@ -0,0 +1,24 @@ +local request_uri = ngx.var.request_uri +local redirect_to = ngx.arg[1] + +local luaconfig = ngx.shared.luaconfig +local use_forwarded_headers = luaconfig:get("use_forwarded_headers") + +if string.sub(request_uri, -1) == "/" then + request_uri = string.sub(request_uri, 1, -2) +end + +local redirectScheme = ngx.var.scheme +local redirectPort = ngx.var.server_port + +if use_forwarded_headers then + if ngx.var.http_x_forwarded_proto then + redirectScheme = ngx.var.http_x_forwarded_proto + end + if ngx.var.http_x_forwarded_port then + redirectPort = ngx.var.http_x_forwarded_port + end +end + +return string.format("%s://%s:%s%s", redirectScheme, + redirect_to, redirectPort, request_uri) \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/ngx_conf_init.lua b/rootfs/etc/nginx/lua/ngx_conf_init.lua new file mode 100644 index 000000000..9789386ac --- /dev/null +++ b/rootfs/etc/nginx/lua/ngx_conf_init.lua @@ -0,0 +1,53 @@ +local cjson = require("cjson.safe") + +collectgarbage("collect") +local f = io.open("/etc/nginx/lua/cfg.json", "r") +local content = f:read("*a") +f:close() +local configfile = cjson.decode(content) + +local luaconfig = ngx.shared.luaconfig +luaconfig:set("enablemetrics", configfile.enable_metrics) +luaconfig:set("use_forwarded_headers", configfile.use_forwarded_headers) +-- init modules +local ok, res +ok, res = pcall(require, "lua_ingress") +if not ok then + error("require failed: " .. tostring(res)) +else + lua_ingress = res + lua_ingress.set_config(configfile) +end +ok, res = pcall(require, "configuration") +if not ok then + error("require failed: " .. tostring(res)) +else + configuration = res + if not configfile.listen_ports.status_port then + error("required status port not found") + end + configuration.prohibited_localhost_port = configfile.listen_ports.status_port +end +ok, res = pcall(require, "balancer") +if not ok then + error("require failed: " .. tostring(res)) +else + balancer = res +end +if configfile.enable_metrics then + ok, res = pcall(require, "monitor") + if not ok then + error("require failed: " .. tostring(res)) + else + monitor = res + end +end +ok, res = pcall(require, "certificate") +if not ok then + error("require failed: " .. tostring(res)) +else + certificate = res + if configfile.enable_ocsp then + certificate.is_ocsp_stapling_enabled = configfile.enable_ocsp + end +end \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/ngx_conf_init_stream.lua b/rootfs/etc/nginx/lua/ngx_conf_init_stream.lua new file mode 100644 index 000000000..a78062d0a --- /dev/null +++ b/rootfs/etc/nginx/lua/ngx_conf_init_stream.lua @@ -0,0 +1,30 @@ +local cjson = require("cjson.safe") +collectgarbage("collect") +local f = io.open("/etc/nginx/lua/cfg.json", "r") +local content = f:read("*a") +f:close() +local configfile = cjson.decode(content) +-- init modules +local ok, res +ok, res = pcall(require, "configuration") +if not ok then + error("require failed: " .. tostring(res)) +else + configuration = res +end +ok, res = pcall(require, "tcp_udp_configuration") +if not ok then + error("require failed: " .. tostring(res)) +else + tcp_udp_configuration = res + if not configfile.listen_ports.status_port then + error("required status port not found") + end + tcp_udp_configuration.prohibited_localhost_port = configfile.listen_ports.status_port +end +ok, res = pcall(require, "tcp_udp_balancer") +if not ok then + error("require failed: " .. tostring(res)) +else + tcp_udp_balancer = res +end diff --git a/rootfs/etc/nginx/lua/ngx_conf_init_worker.lua b/rootfs/etc/nginx/lua/ngx_conf_init_worker.lua new file mode 100644 index 000000000..cba866136 --- /dev/null +++ b/rootfs/etc/nginx/lua/ngx_conf_init_worker.lua @@ -0,0 +1,15 @@ +local cjson = require("cjson.safe") + +local f = io.open("/etc/nginx/lua/cfg.json", "r") +local content = f:read("*a") +f:close() +local configfile = cjson.decode(content) + +local lua_ingress = require("lua_ingress") +local balancer = require("balancer") +local monitor = require("monitor") +lua_ingress.init_worker() +balancer.init_worker() +if configfile.enable_metrics and configfile.monitor_batch_max_size then + monitor.init_worker(configfile.monitor_batch_max_size) +end \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/plugins.lua b/rootfs/etc/nginx/lua/plugins.lua deleted file mode 100644 index 55e208a32..000000000 --- a/rootfs/etc/nginx/lua/plugins.lua +++ /dev/null @@ -1,61 +0,0 @@ -local require = require -local ngx = ngx -local ipairs = ipairs -local string_format = string.format -local ngx_log = ngx.log -local INFO = ngx.INFO -local ERR = ngx.ERR -local pcall = pcall - -local _M = {} -local MAX_NUMBER_OF_PLUGINS = 20 -local plugins = {} - -local function load_plugin(name) - local path = string_format("plugins.%s.main", name) - - local ok, plugin = pcall(require, path) - if not ok then - ngx_log(ERR, string_format("error loading plugin \"%s\": %s", path, plugin)) - return - end - local index = #plugins - if (plugin.name == nil or plugin.name == '') then - plugin.name = name - end - plugins[index + 1] = plugin -end - -function _M.init(names) - local count = 0 - for _, name in ipairs(names) do - if count >= MAX_NUMBER_OF_PLUGINS then - ngx_log(ERR, "the total number of plugins exceed the maximum number: ", MAX_NUMBER_OF_PLUGINS) - break - end - load_plugin(name) - count = count + 1 -- ignore loading failure, just count the total - end -end - -function _M.run() - local phase = ngx.get_phase() - - for _, plugin in ipairs(plugins) do - if plugin[phase] then - ngx_log(INFO, string_format("running plugin \"%s\" in phase \"%s\"", plugin.name, phase)) - - -- TODO: consider sandboxing this, should we? - -- probably yes, at least prohibit plugin from accessing env vars etc - -- but since the plugins are going to be installed by ingress-nginx - -- operator they can be assumed to be safe also - local ok, err = pcall(plugin[phase]) - if not ok then - ngx_log(ERR, string_format("error while running plugin \"%s\" in phase \"%s\": %s", - plugin.name, phase, err)) - end - end - end -end - -return _M diff --git a/rootfs/etc/nginx/lua/plugins/README.md b/rootfs/etc/nginx/lua/plugins/README.md deleted file mode 100644 index 64f4912f0..000000000 --- a/rootfs/etc/nginx/lua/plugins/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Custom Lua plugins - -ingress-nginx uses [https://github.com/openresty/lua-nginx-module](https://github.com/openresty/lua-nginx-module) to run custom Lua code -within Nginx workers. It is recommended to familiarize yourself with that ecosystem before deploying your custom Lua based ingress-nginx plugin. - -### Writing a plugin - -Every ingress-nginx Lua plugin is expected to have `main.lua` file and all of its dependencies. -`main.lua` is the entry point of the plugin. The plugin manager uses convention over configuration -strategy and automatically runs functions defined in `main.lua` in the corresponding Nginx phase based on their name. - -Nginx has different [request processing phases](https://nginx.org/en/docs/dev/development_guide.html#http_phases). -By defining functions with the following names, you can run your custom Lua code in the corresponding Nginx phase: - - - `init_worker`: useful for initializing some data per Nginx worker process - - `rewrite`: useful for modifying request, changing headers, redirection, dropping request, doing authentication etc - - `header_filter`: this is called when backend response header is received, it is useful for modifying response headers - - `body_filter`: this is called when response body is received, it is useful for logging response body - - `log`: this is called when request processing is completed and a response is delivered to the client - -Check this [`hello_world`](https://github.com/kubernetes/ingress-nginx/tree/main/rootfs/etc/nginx/lua/plugins/hello_world) plugin as a simple example or refer to [OpenID Connect integration](https://github.com/ElvinEfendi/ingress-nginx-openidc/tree/master/rootfs/etc/nginx/lua/plugins/openidc) for more advanced usage. - -Do not forget to write tests for your plugin. - -### Installing a plugin - -There are two options: - - - mount your plugin into `/etc/nginx/lua/plugins/` in the ingress-nginx pod - - build your own ingress-nginx image like it is done in the [example](https://github.com/ElvinEfendi/ingress-nginx-openidc/tree/master/rootfs/etc/nginx/lua/plugins/openidc) and install your plugin during image build - -Mounting is the quickest option. - -### Enabling plugins - -Once your plugin is ready you need to use [`plugins` configuration setting](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#plugins) to activate it. Let's say you want to activate `hello_world` and `open_idc` plugins, then you set `plugins` setting to `"hello_world, open_idc"`. _Note_ that the plugins will be executed in the given order. diff --git a/rootfs/etc/nginx/lua/plugins/hello_world/main.lua b/rootfs/etc/nginx/lua/plugins/hello_world/main.lua deleted file mode 100644 index 03316c3ee..000000000 --- a/rootfs/etc/nginx/lua/plugins/hello_world/main.lua +++ /dev/null @@ -1,13 +0,0 @@ -local ngx = ngx - -local _M = {} - -function _M.rewrite() - local ua = ngx.var.http_user_agent - - if ua == "hello" then - ngx.req.set_header("x-hello-world", "1") - end -end - -return _M diff --git a/rootfs/etc/nginx/lua/plugins/hello_world/test/main_test.lua b/rootfs/etc/nginx/lua/plugins/hello_world/test/main_test.lua deleted file mode 100644 index 5eda52259..000000000 --- a/rootfs/etc/nginx/lua/plugins/hello_world/test/main_test.lua +++ /dev/null @@ -1,24 +0,0 @@ - -local main = require("plugins.hello_world.main") - --- The unit tests are run within a timer phase in a headless Nginx process. --- Since `set_header` and `ngx.var.http_` API are disabled in this phase we have to stub it --- to avoid `API disabled in the current context` error. - -describe("main", function() - describe("rewrite", function() - it("sets x-hello-world header to 1 when user agent is hello", function() - ngx.var = { http_user_agent = "hello" } - stub(ngx.req, "set_header") - main.rewrite() - assert.stub(ngx.req.set_header).was_called_with("x-hello-world", "1") - end) - - it("does not set x-hello-world header to 1 when user agent is not hello", function() - ngx.var = { http_user_agent = "not-hello" } - stub(ngx.req, "set_header") - main.rewrite() - assert.stub(ngx.req.set_header).was_not_called_with("x-hello-world", "1") - end) - end) -end) diff --git a/rootfs/etc/nginx/lua/test/balancer/sticky_test.lua b/rootfs/etc/nginx/lua/test/balancer/sticky_test.lua index 80d0c0d0e..70723143b 100644 --- a/rootfs/etc/nginx/lua/test/balancer/sticky_test.lua +++ b/rootfs/etc/nginx/lua/test/balancer/sticky_test.lua @@ -357,7 +357,7 @@ describe("Sticky", function() for _ = 1, 100 do local new_upstream = sticky_balancer_instance:balance() if change_on_failure == false then - -- upstream should be the same inspite of error, if change_on_failure option is false + -- upstream should be the same in spite of error, if change_on_failure option is false assert.equal(new_upstream, old_upstream) else -- upstream should change after error, if change_on_failure option is true diff --git a/rootfs/etc/nginx/lua/test/global_throttle_test.lua b/rootfs/etc/nginx/lua/test/global_throttle_test.lua deleted file mode 100644 index b8db740ad..000000000 --- a/rootfs/etc/nginx/lua/test/global_throttle_test.lua +++ /dev/null @@ -1,258 +0,0 @@ -local util = require("util") - -local function assert_request_rejected(config, location_config, opts) - stub(ngx, "exit") - - local global_throttle = require_without_cache("global_throttle") - assert.has_no.errors(function() - global_throttle.throttle(config, location_config) - end) - - assert.stub(ngx.exit).was_called_with(config.status_code) - if opts.with_cache then - assert.are.same("c", ngx.var.global_rate_limit_exceeding) - else - assert.are.same("y", ngx.var.global_rate_limit_exceeding) - end -end - -local function assert_request_not_rejected(config, location_config) - stub(ngx, "exit") - local cache_safe_add_spy = spy.on(ngx.shared.global_throttle_cache, "safe_add") - - local global_throttle = require_without_cache("global_throttle") - assert.has_no.errors(function() - global_throttle.throttle(config, location_config) - end) - - assert.stub(ngx.exit).was_not_called() - assert.is_nil(ngx.var.global_rate_limit_exceeding) - assert.spy(cache_safe_add_spy).was_not_called() -end - -local function assert_short_circuits(f) - local cache_get_spy = spy.on(ngx.shared.global_throttle_cache, "get") - - local resty_global_throttle = require_without_cache("resty.global_throttle") - local resty_global_throttle_new_spy = spy.on(resty_global_throttle, "new") - - local global_throttle = require_without_cache("global_throttle") - - f(global_throttle) - - assert.spy(resty_global_throttle_new_spy).was_not_called() - assert.spy(cache_get_spy).was_not_called() -end - -local function assert_fails_open(config, location_config, ...) - stub(ngx, "exit") - stub(ngx, "log") - - local global_throttle = require_without_cache("global_throttle") - - assert.has_no.errors(function() - global_throttle.throttle(config, location_config) - end) - - assert.stub(ngx.exit).was_not_called() - assert.stub(ngx.log).was_called_with(ngx.ERR, ...) - assert.is_nil(ngx.var.global_rate_limit_exceeding) -end - -local function stub_resty_global_throttle_process(ret1, ret2, ret3, f) - local resty_global_throttle = require_without_cache("resty.global_throttle") - local resty_global_throttle_mock = { - process = function(self, key) return ret1, ret2, ret3 end - } - stub(resty_global_throttle, "new", resty_global_throttle_mock) - - f() - - assert.stub(resty_global_throttle.new).was_called() -end - -local function cache_rejection_decision(namespace, key_value, desired_delay) - local namespaced_key_value = namespace .. key_value - local ok, err = ngx.shared.global_throttle_cache:safe_add(namespaced_key_value, true, desired_delay) - assert.is_nil(err) - assert.is_true(ok) - assert.is_true(ngx.shared.global_throttle_cache:get(namespaced_key_value)) -end - -describe("global_throttle", function() - local snapshot - - local NAMESPACE = "31285d47b1504dcfbd6f12c46d769f6e" - local LOCATION_CONFIG = { - namespace = NAMESPACE, - limit = 10, - window_size = 60, - key = {}, - ignored_cidrs = {}, - } - local CONFIG = { - memcached = { - host = "memc.default.svc.cluster.local", port = 11211, - connect_timeout = 50, max_idle_timeout = 10000, pool_size = 50, - }, - status_code = 429, - } - - before_each(function() - snapshot = assert:snapshot() - - ngx.var = { remote_addr = "127.0.0.1", global_rate_limit_exceeding = nil } - end) - - after_each(function() - snapshot:revert() - - ngx.shared.global_throttle_cache:flush_all() - reset_ngx() - end) - - it("short circuits when memcached is not configured", function() - assert_short_circuits(function(global_throttle) - assert.has_no.errors(function() - global_throttle.throttle({ memcached = { host = "", port = 0 } }, LOCATION_CONFIG) - end) - end) - end) - - it("short circuits when limit or window_size is not configured", function() - assert_short_circuits(function(global_throttle) - local location_config_copy = util.deepcopy(LOCATION_CONFIG) - location_config_copy.limit = 0 - assert.has_no.errors(function() - global_throttle.throttle(CONFIG, location_config_copy) - end) - end) - - assert_short_circuits(function(global_throttle) - local location_config_copy = util.deepcopy(LOCATION_CONFIG) - location_config_copy.window_size = 0 - assert.has_no.errors(function() - global_throttle.throttle(CONFIG, location_config_copy) - end) - end) - end) - - it("short circuits when remote_addr is in ignored_cidrs", function() - local global_throttle = require_without_cache("global_throttle") - local location_config = util.deepcopy(LOCATION_CONFIG) - location_config.ignored_cidrs = { ngx.var.remote_addr } - assert_short_circuits(function(global_throttle) - assert.has_no.errors(function() - global_throttle.throttle(CONFIG, location_config) - end) - end) - end) - - it("rejects when exceeding limit has already been cached", function() - local key_value = "foo" - local location_config = util.deepcopy(LOCATION_CONFIG) - location_config.key = { { nil, nil, nil, key_value } } - cache_rejection_decision(NAMESPACE, key_value, 0.5) - - assert_request_rejected(CONFIG, location_config, { with_cache = true }) - end) - - describe("when resty_global_throttle fails", function() - it("fails open in case of initialization error", function() - local too_long_namespace = "" - for i=1,36,1 do - too_long_namespace = too_long_namespace .. "a" - end - - local location_config = util.deepcopy(LOCATION_CONFIG) - location_config.namespace = too_long_namespace - - assert_fails_open(CONFIG, location_config, "faled to initialize resty_global_throttle: ", "'namespace' can be at most 35 characters") - end) - - it("fails open in case of key processing error", function() - stub_resty_global_throttle_process(nil, nil, "failed to process", function() - assert_fails_open(CONFIG, LOCATION_CONFIG, "error while processing key: ", "failed to process") - end) - end) - end) - - it("initializes resty_global_throttle with the right parameters", function() - local resty_global_throttle = require_without_cache("resty.global_throttle") - local resty_global_throttle_original_new = resty_global_throttle.new - resty_global_throttle.new = function(namespace, limit, window_size, store_opts) - local o, err = resty_global_throttle_original_new(namespace, limit, window_size, store_opts) - if not o then - return nil, err - end - o.process = function(self, key) return 1, nil, nil end - - local expected = LOCATION_CONFIG - assert.are.same(expected.namespace, namespace) - assert.are.same(expected.limit, limit) - assert.are.same(expected.window_size, window_size) - - assert.are.same("memcached", store_opts.provider) - assert.are.same(CONFIG.memcached.host, store_opts.host) - assert.are.same(CONFIG.memcached.port, store_opts.port) - assert.are.same(CONFIG.memcached.connect_timeout, store_opts.connect_timeout) - assert.are.same(CONFIG.memcached.max_idle_timeout, store_opts.max_idle_timeout) - assert.are.same(CONFIG.memcached.pool_size, store_opts.pool_size) - - return o, nil - end - local resty_global_throttle_new_spy = spy.on(resty_global_throttle, "new") - - local global_throttle = require_without_cache("global_throttle") - - assert.has_no.errors(function() - global_throttle.throttle(CONFIG, LOCATION_CONFIG) - end) - - assert.spy(resty_global_throttle_new_spy).was_called() - end) - - it("rejects request and caches decision when limit is exceeding after processing a key", function() - local desired_delay = 0.015 - - stub_resty_global_throttle_process(LOCATION_CONFIG.limit + 1, desired_delay, nil, function() - assert_request_rejected(CONFIG, LOCATION_CONFIG, { with_cache = false }) - - local cache_key = LOCATION_CONFIG.namespace .. ngx.var.remote_addr - assert.is_true(ngx.shared.global_throttle_cache:get(cache_key)) - - -- we assume it won't take more than this after caching - -- until we execute the assertion below - local delta = 0.001 - local ttl = ngx.shared.global_throttle_cache:ttl(cache_key) - assert.is_true(ttl > desired_delay - delta) - assert.is_true(ttl <= desired_delay) - end) - end) - - it("rejects request and skip caching of decision when limit is exceeding after processing a key but desired delay is lower than the threshold", function() - local desired_delay = 0.0009 - - stub_resty_global_throttle_process(LOCATION_CONFIG.limit, desired_delay, nil, function() - assert_request_rejected(CONFIG, LOCATION_CONFIG, { with_cache = false }) - - local cache_key = LOCATION_CONFIG.namespace .. ngx.var.remote_addr - assert.is_nil(ngx.shared.global_throttle_cache:get(cache_key)) - end) - end) - - it("allows the request when limit is not exceeding after processing a key", function() - stub_resty_global_throttle_process(LOCATION_CONFIG.limit - 3, nil, nil, - function() - assert_request_not_rejected(CONFIG, LOCATION_CONFIG) - end - ) - end) - - it("rejects with custom status code", function() - cache_rejection_decision(NAMESPACE, ngx.var.remote_addr, 0.3) - local config = util.deepcopy(CONFIG) - config.status_code = 503 - assert_request_rejected(config, LOCATION_CONFIG, { with_cache = true }) - end) -end) diff --git a/rootfs/etc/nginx/lua/test/plugins_test.lua b/rootfs/etc/nginx/lua/test/plugins_test.lua deleted file mode 100644 index d7f789d0f..000000000 --- a/rootfs/etc/nginx/lua/test/plugins_test.lua +++ /dev/null @@ -1,23 +0,0 @@ -describe("plugins", function() - describe("#run", function() - it("runs the plugins in the given order", function() - ngx.get_phase = function() return "rewrite" end - local plugins = require("plugins") - local called_plugins = {} - local plugins_to_mock = {"plugins.pluginfirst.main", "plugins.pluginsecond.main", "plugins.pluginthird.main"} - for i=1, 3, 1 - do - package.loaded[plugins_to_mock[i]] = { - rewrite = function() - called_plugins[#called_plugins + 1] = plugins_to_mock[i] - end - } - end - assert.has_no.errors(function() - plugins.init({"pluginfirst", "pluginsecond", "pluginthird"}) - end) - assert.has_no.errors(plugins.run) - assert.are.same(plugins_to_mock, called_plugins) - end) - end) -end) \ No newline at end of file diff --git a/rootfs/etc/nginx/lua/util.lua b/rootfs/etc/nginx/lua/util.lua index 7389f3226..1e4cd7c01 100644 --- a/rootfs/etc/nginx/lua/util.lua +++ b/rootfs/etc/nginx/lua/util.lua @@ -146,6 +146,10 @@ function _M.is_blank(str) return str == nil or string_len(str) == 0 end +function _M.string_to_bool(str) + return str == "true" +end + -- this implementation is taken from: -- https://github.com/luafun/luafun/blob/master/fun.lua#L33 -- SHA: 04c99f9c393e54a604adde4b25b794f48104e0d0 diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index e3145e6a5..6b8e750b0 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -29,12 +29,8 @@ load_module /etc/nginx/modules/ngx_http_auth_digest_module.so; load_module /etc/nginx/modules/ngx_http_modsecurity_module.so; {{ end }} -{{ if (shouldLoadOpentracingModule $cfg $servers) }} -load_module /etc/nginx/modules/ngx_http_opentracing_module.so; -{{ end }} - {{ if (shouldLoadOpentelemetryModule $cfg $servers) }} -load_module /modules_mount/etc/nginx/modules/otel/otel_ngx_module.so; +load_module /etc/nginx/modules/otel_ngx_module.so; {{ end }} daemon off; @@ -72,71 +68,11 @@ http { {{ buildLuaSharedDictionaries $cfg $servers }} - init_by_lua_block { - collectgarbage("collect") + lua_shared_dict luaconfig 5m; - -- init modules - local ok, res + init_by_lua_file /etc/nginx/lua/ngx_conf_init.lua; - ok, res = pcall(require, "lua_ingress") - if not ok then - error("require failed: " .. tostring(res)) - else - lua_ingress = res - lua_ingress.set_config({{ configForLua $all }}) - end - - ok, res = pcall(require, "configuration") - if not ok then - error("require failed: " .. tostring(res)) - else - configuration = res - configuration.prohibited_localhost_port = '{{ .StatusPort }}' - end - - ok, res = pcall(require, "balancer") - if not ok then - error("require failed: " .. tostring(res)) - else - balancer = res - end - - {{ if $all.EnableMetrics }} - ok, res = pcall(require, "monitor") - if not ok then - error("require failed: " .. tostring(res)) - else - monitor = res - end - {{ end }} - - ok, res = pcall(require, "certificate") - if not ok then - error("require failed: " .. tostring(res)) - else - certificate = res - certificate.is_ocsp_stapling_enabled = {{ $cfg.EnableOCSP }} - end - - ok, res = pcall(require, "plugins") - if not ok then - error("require failed: " .. tostring(res)) - else - plugins = res - end - -- load all plugins that'll be used here - plugins.init({ {{ range $idx, $plugin := $cfg.Plugins }}{{ if $idx }},{{ end }}{{ $plugin | quote }}{{ end }} }) - } - - init_worker_by_lua_block { - lua_ingress.init_worker() - balancer.init_worker() - {{ if $all.EnableMetrics }} - monitor.init_worker({{ $all.MonitorMaxBatchSize }}) - {{ end }} - - plugins.run() - } + init_worker_by_lua_file /etc/nginx/lua/ngx_conf_init_worker.lua; {{/* Enable the real_ip module only if we use either X-Forwarded headers or Proxy Protocol. */}} {{/* we use the value of the real IP for the geo_ip module */}} @@ -170,22 +106,15 @@ http { {{ end }} - {{ if $cfg.UseGeoIP }} - {{/* databases used to determine the country depending on the client IP address */}} - {{/* http://nginx.org/en/docs/http/ngx_http_geoip_module.html */}} - {{/* this is require to calculate traffic for individual country using GeoIP in the status page */}} - geoip_country /etc/nginx/geoip/GeoIP.dat; - geoip_city /etc/nginx/geoip/GeoLiteCity.dat; - geoip_org /etc/nginx/geoip/GeoIPASNum.dat; - geoip_proxy_recursive on; - {{ end }} - {{ if $cfg.UseGeoIP2 }} # https://github.com/leev/ngx_http_geoip2_module#example-usage {{ range $index, $file := $all.MaxmindEditionFiles }} {{ if eq $file "GeoLite2-Country.mmdb" }} - geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoLite2-Country.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_country_code source=$remote_addr country iso_code; $geoip2_country_name source=$remote_addr country names en; $geoip2_country_geoname_id source=$remote_addr country geoname_id; @@ -196,7 +125,10 @@ http { {{ end }} {{ if eq $file "GeoIP2-Country.mmdb" }} - geoip2 /etc/nginx/geoip/GeoIP2-Country.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoIP2-Country.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_country_code source=$remote_addr country iso_code; $geoip2_country_name source=$remote_addr country names en; $geoip2_country_geoname_id source=$remote_addr country geoname_id; @@ -207,7 +139,10 @@ http { {{ end }} {{ if eq $file "GeoLite2-City.mmdb" }} - geoip2 /etc/nginx/geoip/GeoLite2-City.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoLite2-City.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_city_country_code source=$remote_addr country iso_code; $geoip2_city_country_name source=$remote_addr country names en; $geoip2_city_country_geoname_id source=$remote_addr country geoname_id; @@ -230,7 +165,10 @@ http { {{ end }} {{ if eq $file "GeoIP2-City.mmdb" }} - geoip2 /etc/nginx/geoip/GeoIP2-City.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoIP2-City.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_city_country_code source=$remote_addr country iso_code; $geoip2_city_country_name source=$remote_addr country names en; $geoip2_city_country_geoname_id source=$remote_addr country geoname_id; @@ -253,21 +191,30 @@ http { {{ end }} {{ if eq $file "GeoLite2-ASN.mmdb" }} - geoip2 /etc/nginx/geoip/GeoLite2-ASN.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoLite2-ASN.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_asn source=$remote_addr autonomous_system_number; $geoip2_org source=$remote_addr autonomous_system_organization; } {{ end }} {{ if eq $file "GeoIP2-ASN.mmdb" }} - geoip2 /etc/nginx/geoip/GeoIP2-ASN.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoIP2-ASN.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_asn source=$remote_addr autonomous_system_number; $geoip2_org source=$remote_addr autonomous_system_organization; } {{ end }} {{ if eq $file "GeoIP2-ISP.mmdb" }} - geoip2 /etc/nginx/geoip/GeoIP2-ISP.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoIP2-ISP.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_isp source=$remote_addr isp; $geoip2_isp_org source=$remote_addr organization; $geoip2_asn source=$remote_addr default=0 autonomous_system_number; @@ -275,13 +222,16 @@ http { {{ end }} {{ if eq $file "GeoIP2-Connection-Type.mmdb" }} - geoip2 /etc/nginx/geoip/GeoIP2-Connection-Type.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoIP2-Connection-Type.mmdb { $geoip2_connection_type connection_type; } {{ end }} {{ if eq $file "GeoIP2-Anonymous-IP.mmdb" }} - geoip2 /etc/nginx/geoip/GeoIP2-Anonymous-IP.mmdb { + geoip2 /etc/ingress-controller/geoip/GeoIP2-Anonymous-IP.mmdb { + {{ if (gt $cfg.GeoIP2AutoReloadMinutes 0) }} + auto_reload {{ $cfg.GeoIP2AutoReloadMinutes }}m; + {{ end }} $geoip2_is_anon source=$remote_addr is_anonymous; $geoip2_is_anonymous source=$remote_addr default=0 is_anonymous; $geoip2_is_anonymous_vpn source=$remote_addr default=0 is_anonymous_vpn; @@ -321,6 +271,10 @@ http { client_body_buffer_size {{ $cfg.ClientBodyBufferSize }}; client_body_timeout {{ $cfg.ClientBodyTimeout }}s; + {{ if gt $cfg.GRPCBufferSizeKb 0 }} + grpc_buffer_size {{ $cfg.GRPCBufferSizeKb }}k; + {{ end }} + {{ if and (ne $cfg.HTTP2MaxHeaderSize "") (ne $cfg.HTTP2MaxFieldSize "") }} http2_max_field_size {{ $cfg.HTTP2MaxFieldSize }}; http2_max_header_size {{ $cfg.HTTP2MaxHeaderSize }}; @@ -349,7 +303,6 @@ http { limit_req_status {{ $cfg.LimitReqStatusCode }}; limit_conn_status {{ $cfg.LimitConnStatusCode }}; - {{ buildOpentracing $cfg $servers }} {{ buildOpentelemetry $cfg $servers }} include /etc/nginx/mime.types; @@ -479,7 +432,7 @@ http { ssl_session_tickets {{ if $cfg.SSLSessionTickets }}on{{ else }}off{{ end }}; {{ if not (empty $cfg.SSLSessionTicketKey ) }} - ssl_session_ticket_key /etc/nginx/tickets.key; + ssl_session_ticket_key /etc/ingress-controller/tickets.key; {{ end }} # slightly reduce the time-to-first-byte @@ -502,10 +455,14 @@ http { ssl_certificate {{ $cfg.DefaultSSLCertificate.PemFileName }}; ssl_certificate_key {{ $cfg.DefaultSSLCertificate.PemFileName }}; - {{ if gt (len $cfg.CustomHTTPErrors) 0 }} + {{ if and $cfg.CustomHTTPErrors (not $cfg.DisableProxyInterceptErrors) }} proxy_intercept_errors on; {{ end }} + {{ if $cfg.RelativeRedirects }} + absolute_redirect off; + {{ end }} + {{ range $errCode := $cfg.CustomHTTPErrors }} error_page {{ $errCode }} = @custom_upstream-default-backend_{{ $errCode }};{{ end }} @@ -537,9 +494,7 @@ http { server 0.0.0.1; # placeholder - balancer_by_lua_block { - balancer.balance() - } + balancer_by_lua_file /etc/nginx/lua/nginx/ngx_conf_balancer.lua; {{ if (gt $cfg.UpstreamKeepaliveConnections 0) }} keepalive {{ $cfg.UpstreamKeepaliveConnections }}; @@ -604,9 +559,7 @@ http { {{ buildHTTPListener $all $redirect.From }} {{ buildHTTPSListener $all $redirect.From }} - ssl_certificate_by_lua_block { - certificate.call() - } + ssl_certificate_by_lua_file /etc/nginx/lua/nginx/ngx_conf_certificate.lua; {{ if gt (len $cfg.BlockUserAgents) 0 }} if ($block_ua) { @@ -619,30 +572,7 @@ http { } {{ end }} - set_by_lua_block $redirect_to { - local request_uri = ngx.var.request_uri - if string.sub(request_uri, -1) == "/" then - request_uri = string.sub(request_uri, 1, -2) - end - - {{ if $cfg.UseForwardedHeaders }} - local redirectScheme - if not ngx.var.http_x_forwarded_proto then - redirectScheme = ngx.var.scheme - else - redirectScheme = ngx.var.http_x_forwarded_proto - end - {{ else }} - local redirectScheme = ngx.var.scheme - {{ end }} - - {{ if ne $all.ListenPorts.HTTPS 443 }} - {{ $redirect_port := (printf ":%v" $all.ListenPorts.HTTPS) }} - return string.format("%s://%s%s%s", redirectScheme, "{{ $redirect.To }}", "{{ $redirect_port }}", request_uri) - {{ else }} - return string.format("%s://%s%s", redirectScheme, "{{ $redirect.To }}", request_uri) - {{ end }} - } + set_by_lua_file $redirect_to /etc/nginx/lua/nginx/ngx_srv_redirect.lua {{ $redirect.To }}; return {{ $all.Cfg.HTTPRedirectCode }} $redirect_to; } @@ -673,6 +603,10 @@ http { server { server_name {{ buildServerName $server.Hostname }} {{range $server.Aliases }}{{ . }} {{ end }}; + {{ if $cfg.UseHTTP2 }} + http2 on; + {{ end }} + {{ if gt (len $cfg.BlockUserAgents) 0 }} if ($block_ua) { return 403; @@ -725,10 +659,6 @@ http { access_log off; - {{ if $cfg.EnableOpentracing }} - opentracing off; - {{ end }} - {{ if $cfg.EnableOpentelemetry }} opentelemetry off; {{ end }} @@ -737,17 +667,7 @@ http { } location /is-dynamic-lb-initialized { - content_by_lua_block { - local configuration = require("configuration") - local backend_data = configuration.get_backends_data() - if not backend_data then - ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) - return - end - - ngx.say("OK") - ngx.exit(ngx.HTTP_OK) - } + content_by_lua_file /etc/nginx/lua/nginx/ngx_conf_is_dynamic_lb_initialized.lua; } location {{ .StatusPath }} { @@ -759,15 +679,11 @@ http { client_body_buffer_size {{ luaConfigurationRequestBodySize $cfg }}; proxy_buffering off; - content_by_lua_block { - configuration.call() - } + content_by_lua_file /etc/nginx/lua/nginx/ngx_conf_configuration.lua; } location / { - content_by_lua_block { - ngx.exit(ngx.HTTP_NOT_FOUND) - } + return 404; } } } @@ -779,39 +695,9 @@ stream { {{ buildResolvers $cfg.Resolver $cfg.DisableIpv6DNS }} - init_by_lua_block { - collectgarbage("collect") + init_by_lua_file /etc/nginx/lua/ngx_conf_init_stream.lua; - -- init modules - local ok, res - - ok, res = pcall(require, "configuration") - if not ok then - error("require failed: " .. tostring(res)) - else - configuration = res - end - - ok, res = pcall(require, "tcp_udp_configuration") - if not ok then - error("require failed: " .. tostring(res)) - else - tcp_udp_configuration = res - tcp_udp_configuration.prohibited_localhost_port = '{{ .StatusPort }}' - - end - - ok, res = pcall(require, "tcp_udp_balancer") - if not ok then - error("require failed: " .. tostring(res)) - else - tcp_udp_balancer = res - end - } - - init_worker_by_lua_block { - tcp_udp_balancer.init_worker() - } + init_worker_by_lua_file /etc/nginx/lua/nginx/ngx_conf_init_tcp_udp.lua; lua_add_variable $proxy_upstream_name; @@ -833,10 +719,7 @@ stream { upstream upstream_balancer { server 0.0.0.1:1234; # placeholder - - balancer_by_lua_block { - tcp_udp_balancer.balance() - } + balancer_by_lua_file /etc/nginx/lua/nginx/ngx_conf_balancer_tcp_udp.lua; } server { @@ -844,9 +727,7 @@ stream { access_log off; - content_by_lua_block { - tcp_udp_configuration.call() - } + content_by_lua_file /etc/nginx/lua/nginx/ngx_conf_content_tcp_udp.lua; } # TCP services @@ -946,11 +827,9 @@ stream { rewrite (.*) / break; proxy_pass http://upstream_balancer; - log_by_lua_block { - {{ if $enableMetrics }} - monitor.call() - {{ end }} - } + {{ if $enableMetrics }} + log_by_lua_file /etc/nginx/lua/nginx/ngx_conf_log.lua; + {{ end }} } {{ end }} {{ end }} @@ -1010,9 +889,7 @@ stream { ssl_reject_handshake {{ if $all.Cfg.SSLRejectHandshake }}on{{ else }}off{{ end }}; {{ end }} - ssl_certificate_by_lua_block { - certificate.call() - } + ssl_certificate_by_lua_file /etc/nginx/lua/nginx/ngx_conf_certificate.lua; {{ if not (empty $server.AuthTLSError) }} # {{ $server.AuthTLSError }} @@ -1095,11 +972,6 @@ stream { location = {{ $authPath }} { internal; - {{ if (or $all.Cfg.EnableOpentracing $location.Opentracing.Enabled) }} - opentracing on; - opentracing_propagate_context; - {{ end }} - {{ if (or $all.Cfg.EnableOpentelemetry $location.Opentelemetry.Enabled) }} opentelemetry on; opentelemetry_propagate; @@ -1118,9 +990,7 @@ stream { set $tmp_cache_key '{{ $server.Hostname }}{{ $authPath }}{{ $externalAuth.AuthCacheKey }}'; set $cache_key ''; - rewrite_by_lua_block { - ngx.var.cache_key = ngx.encode_base64(ngx.sha1_bin(ngx.var.tmp_cache_key)) - } + rewrite_by_lua_file /etc/nginx/lua/nginx/ngx_conf_rewrite_auth.lua; proxy_cache auth_cache; @@ -1171,6 +1041,7 @@ stream { {{ end }} proxy_buffer_size {{ $location.Proxy.BufferSize }}; proxy_buffers {{ $location.Proxy.BuffersNumber }} {{ $location.Proxy.BufferSize }}; + proxy_busy_buffers_size {{ $location.Proxy.BusyBuffersSize }}; proxy_request_buffering {{ $location.Proxy.RequestBuffering }}; proxy_ssl_server_name on; @@ -1245,9 +1116,7 @@ stream { set $service_name {{ $ing.Service | quote }}; set $service_port {{ $ing.ServicePort | quote }}; set $location_path {{ $ing.Path | escapeLiteralDollar | quote }}; - set $global_rate_limit_exceeding n; - {{ buildOpentracingForLocation $all.Cfg.EnableOpentracing $all.Cfg.OpentracingTrustIncomingSpan $location }} {{ buildOpentelemetryForLocation $all.Cfg.EnableOpentelemetry $all.Cfg.OpentelemetryTrustIncomingSpan $location }} {{ if $location.Mirror.Source }} @@ -1255,35 +1124,13 @@ stream { mirror_request_body {{ $location.Mirror.RequestBody }}; {{ end }} - rewrite_by_lua_block { - lua_ingress.rewrite({{ locationConfigForLua $location $all }}) - balancer.rewrite() - plugins.run() - } + {{ locationConfigForLua $location $all }} - # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any - # will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)` - # other authentication method such as basic auth or external auth useless - all requests will be allowed. - #access_by_lua_block { - #} + rewrite_by_lua_file /etc/nginx/lua/nginx/ngx_rewrite.lua; - header_filter_by_lua_block { - lua_ingress.header() - plugins.run() - } + header_filter_by_lua_file /etc/nginx/lua/nginx/ngx_conf_srv_hdr_filter.lua; - body_filter_by_lua_block { - plugins.run() - } - - log_by_lua_block { - balancer.log() - {{ if $all.EnableMetrics }} - monitor.call() - {{ end }} - - plugins.run() - } + log_by_lua_file /etc/nginx/lua/nginx/ngx_conf_log_block.lua; {{ if not $location.Logs.Access }} access_log off; @@ -1343,20 +1190,10 @@ stream { {{- end }} # `auth_request` module does not support HTTP keepalives in upstream block: # https://trac.nginx.org/nginx/ticket/1579 - access_by_lua_block { - local res = ngx.location.capture('{{ $authPath }}', { method = ngx.HTTP_GET, body = '', share_all_vars = {{ $externalAuth.KeepaliveShareVars }} }) - if res.status == ngx.HTTP_OK then - ngx.var.auth_cookie = res.header['Set-Cookie'] - {{- range $line := buildAuthUpstreamLuaHeaders $externalAuth.ResponseHeaders }} - {{ $line }} - {{- end }} - return - end - if res.status == ngx.HTTP_UNAUTHORIZED or res.status == ngx.HTTP_FORBIDDEN then - ngx.exit(res.status) - end - ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) - } + set $auth_path '{{ $authPath }}'; + set $auth_keepalive_share_vars {{ $externalAuth.KeepaliveShareVars }}; + set $auth_response_headers '{{ buildAuthUpstreamLuaHeaders $externalAuth.ResponseHeaders }}'; + access_by_lua_file /etc/nginx/lua/nginx/ngx_conf_external_auth.lua; {{ else }} auth_request {{ $authPath }}; auth_request_set $auth_cookie $upstream_http_set_cookie; @@ -1460,6 +1297,7 @@ stream { proxy_buffering {{ $location.Proxy.ProxyBuffering }}; proxy_buffer_size {{ $location.Proxy.BufferSize }}; proxy_buffers {{ $location.Proxy.BuffersNumber }} {{ $location.Proxy.BufferSize }}; + proxy_busy_buffers_size {{ $location.Proxy.BusyBuffersSize }}; {{ if isValidByteSize $location.Proxy.ProxyMaxTempFileSize true }} proxy_max_temp_file_size {{ $location.Proxy.ProxyMaxTempFileSize }}; {{ end }} @@ -1474,6 +1312,13 @@ stream { proxy_next_upstream_timeout {{ $location.Proxy.NextUpstreamTimeout }}; proxy_next_upstream_tries {{ $location.Proxy.NextUpstreamTries }}; + {{ if or (eq $location.BackendProtocol "GRPC") (eq $location.BackendProtocol "GRPCS") }} + # Grpc settings + grpc_connect_timeout {{ $location.Proxy.ConnectTimeout }}s; + grpc_send_timeout {{ $location.Proxy.SendTimeout }}s; + grpc_read_timeout {{ $location.Proxy.ReadTimeout }}s; + {{ end }} + {{/* Add any additional configuration defined */}} {{ $location.ConfigurationSnippet }} @@ -1482,6 +1327,13 @@ stream { {{ $all.Cfg.LocationSnippet }} {{ end }} + {{ if $location.CustomHeaders }} + # Custom Response Headers + {{ range $k, $v := $location.CustomHeaders.Headers }} + more_set_headers {{ printf "%s: %s" $k $v | escapeLiteralDollar | quote }}; + {{ end }} + {{ end }} + {{/* if we are sending the request to a custom default backend, we add the required headers */}} {{ if (hasPrefix $location.Backend "custom-default-backend-") }} proxy_set_header X-Code 503; @@ -1497,8 +1349,12 @@ stream { satisfy {{ $location.Satisfy }}; {{ end }} + {{ if $location.Redirect.Relative }} + absolute_redirect off; + {{ end }} + {{/* if a location-specific error override is set, add the proxy_intercept here */}} - {{ if $location.CustomHTTPErrors }} + {{ if and $location.CustomHTTPErrors (not $location.DisableProxyInterceptErrors) }} # Custom error pages per ingress proxy_intercept_errors on; {{ end }} @@ -1557,9 +1413,6 @@ stream { {{ if eq $server.Hostname "_" }} # health checks in cloud providers require the use of port {{ $all.ListenPorts.HTTP }} location {{ $all.HealthzURI }} { - {{ if $all.Cfg.EnableOpentracing }} - opentracing off; - {{ end }} {{ if $all.Cfg.EnableOpentelemetry }} opentelemetry off; @@ -1572,9 +1425,6 @@ stream { # this is required to avoid error if nginx is being monitored # with an external software (like sysdig) location /nginx_status { - {{ if $all.Cfg.EnableOpentracing }} - opentracing off; - {{ end }} {{ if $all.Cfg.EnableOpentelemetry }} opentelemetry off; diff --git a/rootfs/nginx-chroot-wrapper.sh b/rootfs/nginx-chroot-wrapper.sh index f7318142f..0c8bdf3b7 100755 --- a/rootfs/nginx-chroot-wrapper.sh +++ b/rootfs/nginx-chroot-wrapper.sh @@ -15,4 +15,4 @@ # limitations under the License. cat /etc/resolv.conf > /chroot/etc/resolv.conf -unshare -S 101 -R /chroot nginx "$@" +unshare -S 101 -R /chroot nginx "$@" diff --git a/test/data/cleanConf.expected.conf b/test/data/cleanConf.expected.conf index 1666c19f6..9c0513b37 100644 --- a/test/data/cleanConf.expected.conf +++ b/test/data/cleanConf.expected.conf @@ -47,7 +47,7 @@ http { listen_ports = { ssl_proxy = "442", https = "443" }, hsts = true, - hsts_max_age = 15724800, + hsts_max_age = 31536000, hsts_include_subdomains = true, hsts_preload = false, }) @@ -67,8 +67,6 @@ http { balancer.init_worker() monitor.init_worker(10000) - - plugins.run() } map $request_uri $loggable { @@ -120,7 +118,6 @@ http { use_port_in_redirects = false, }) balancer.rewrite() - plugins.run() } # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any @@ -130,7 +127,6 @@ http { header_filter_by_lua_block { lua_ingress.header() - plugins.run() } } diff --git a/test/data/cleanConf.src.conf b/test/data/cleanConf.src.conf index 0e572faa5..6da578106 100644 --- a/test/data/cleanConf.src.conf +++ b/test/data/cleanConf.src.conf @@ -65,7 +65,7 @@ lua_shared_dict ocsp_response_cache 5M; listen_ports = { ssl_proxy = "442", https = "443" }, hsts = true, - hsts_max_age = 15724800, + hsts_max_age = 31536000, hsts_include_subdomains = true, hsts_preload = false, }) @@ -86,11 +86,8 @@ lua_shared_dict ocsp_response_cache 5M; init_worker_by_lua_block { lua_ingress.init_worker() balancer.init_worker() - - monitor.init_worker(10000) - - plugins.run() + monitor.init_worker(10000) } @@ -164,7 +161,6 @@ lua_shared_dict ocsp_response_cache 5M; use_port_in_redirects = false, }) balancer.rewrite() - plugins.run() } # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any @@ -174,7 +170,6 @@ lua_shared_dict ocsp_response_cache 5M; header_filter_by_lua_block { lua_ingress.header() - plugins.run() } diff --git a/test/data/config.json b/test/data/config.json index d51e1c40b..df8a9fd3d 100644 --- a/test/data/config.json +++ b/test/data/config.json @@ -1,60275 +1,63353 @@ { - "backlogSize": 32768, - "isIPV6Enabled": true, - "cfg": { - "disable-ipv6": false, - "bind-address-ipv4": ["1.1.1.1", "2.2.2.2"], - "bind-address-ipv6": ["[2001:db8:a0b:12f0::1]", "[3731:54:65fe:2::a7]", "[33:33:33::33::33]"], - "backend": { - "custom-http-errors": [404], - "proxy-buffers-number": "4", - "proxy-buffer-size": "4k", - "proxy-connect-timeout": 5, - "proxy-read-timeout": 60, - "proxy-send-timeout": 60, - "skip-access-log-urls": ["~*health-check", "~*info"], - "ssl-redirect": true, - "upstream-fail-timeout": 0, - "upstream-max-fails": 0, - "upstream-hash-by": "$request_uri", - "whitelist-source-range": null - }, - "bodySize": "1m", - "enableSpdy": false, - "errorLogLevel": "notice", - "gzipTypes": "application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component", - "hsts": true, - "hstsIncludeSubdomains": true, - "hstsMaxAge": "15724800", - "keepAlive": 75, - "mapHashBucketSize": 64, - "maxWorkerConnections": 16384, - "nginxStatusIpv4Whitelist": "127.0.0.1", - "nginxStatusIpv6Whitelist": "::1", - "proxyRealIpCidr": "0.0.0.0/0", - "retryNonIdempotent": false, - "serverNameHashBucketSize": 64, - "serverNameHashMaxSize": 16384, - "sslBufferSize": "4k", - "sslCiphers": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA", - "sslProtocols": "TLSv1 TLSv1.1 TLSv1.2", - "sslSessionCache": true, - "sslSessionCacheSize": "10m", - "sslSessionTickets": true, - "sslSessionTimeout": "10m", - "useGzip": true, - "useHttp2": true, - "proxyStreamTimeout": "600s", - "workerProcesses": 1, - "limitConnZoneVariable": "$remote_addr" - }, - "customErrors": true, - "defResolver": "", - "healthzURI": "/healthz", - "passthroughBackends": [{ - "namespace": "default-kubernetes-443", - "hostname": "foo-898.bar.com" - }, { - "namespace": "default-echoheaders-x-80", - "hostname": "foo-997.bar.com" - }, { - "namespace": "default-kubernetes-443", - "hostname": "kubernetes.foo-bar.com" - }], - "servers": [{ - "hostname": "_", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/testpath", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": ["1.1.1.1"] - }, - "whitelist": { - "cidr": ["1.1.1.1"] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/", - "isDefBackend": true, - "backend": "upstream-default-backend", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": ["1.1.1.1"] - }, - "whitelist": { - "cidr": ["1.1.1.1"] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "bar.baz.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/foo", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/bar", - "isDefBackend": false, - "backend": "default-echoheaders-y-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/", - "isDefBackend": true, - "backend": "upstream-default-backend", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": null - }, - "whitelist": { - "cidr": null - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "default-backend.sample.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": true, - "backend": "default-echoheaders-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": null - }, - "whitelist": { - "cidr": null - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "external-auth-01.sample.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "https://httpbun.com/basic-auth/user/passwd", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-1.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-10.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-100.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-1000.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-101.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-102.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-103.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-104.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-105.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-106.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-107.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-108.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-109.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-11.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-110.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-111.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-112.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-113.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-114.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-115.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-116.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-117.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-118.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-119.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-12.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-120.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-121.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-122.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-123.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-124.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-125.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-126.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-127.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-128.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-129.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-13.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-130.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-131.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-132.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-133.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-134.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-135.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-136.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-137.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-138.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-139.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-14.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-140.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-141.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-142.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-143.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-144.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-145.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-146.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-147.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-148.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-149.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-15.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-150.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-151.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-152.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-153.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-154.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-155.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-156.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-157.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-158.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-159.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-16.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-160.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-161.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-162.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-163.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-164.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-165.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-166.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-167.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-168.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-169.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-17.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-170.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-171.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-172.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-173.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-174.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-175.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-176.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-177.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-178.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-179.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-18.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-180.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-181.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-182.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-183.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-184.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-185.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-186.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-187.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-188.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-189.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-19.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-190.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-191.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-192.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-193.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-194.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-195.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-196.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-197.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-198.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-199.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-2.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-20.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-200.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-201.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-202.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-203.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-204.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-205.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-206.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-207.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-208.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-209.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-21.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-210.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-211.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-212.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-213.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-214.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-215.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-216.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-217.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-218.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-219.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-22.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-220.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-221.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-222.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-223.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-224.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-225.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-226.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-227.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-228.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-229.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-23.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-230.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-231.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-232.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-233.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-234.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-235.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-236.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-237.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-238.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-239.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-24.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-240.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-241.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-242.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-243.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-244.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-245.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-246.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-247.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-248.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-249.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-25.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-250.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-251.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-252.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-253.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-254.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-255.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-256.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-257.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-258.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-259.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-26.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-260.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-261.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-262.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-263.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-264.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-265.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-266.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-267.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-268.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-269.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-27.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-270.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-271.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-272.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-273.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-274.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-275.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-276.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-277.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-278.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-279.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-28.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-280.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-281.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-282.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-283.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-284.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-285.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-286.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-287.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-288.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-289.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-29.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-290.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-291.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-292.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-293.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-294.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-295.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-296.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-297.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-298.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-299.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-3.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-30.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-300.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-301.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-302.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-303.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-304.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-305.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-306.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-307.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-308.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-309.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-31.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-310.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-311.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-312.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-313.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-314.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-315.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-316.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-317.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-318.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-319.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-32.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-320.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-321.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-322.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-323.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-324.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-325.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-326.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-327.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-328.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-329.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-33.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-330.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-331.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-332.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-333.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-334.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-335.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-336.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-337.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-338.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-339.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-34.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-340.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-341.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-342.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-343.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-344.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-345.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-346.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-347.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-348.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-349.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-35.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-350.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-351.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-352.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-353.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-354.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-355.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-356.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-357.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-358.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-359.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-36.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-360.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-361.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-362.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-363.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-364.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-365.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-366.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-367.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-368.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-369.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-37.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-370.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-371.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-372.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-373.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-374.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-375.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-376.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-377.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-378.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-379.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-38.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-380.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-381.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-382.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-383.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-384.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-385.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-386.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-387.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-388.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-389.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-39.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-390.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-391.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-392.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-393.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-394.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-395.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-396.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-397.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-398.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-399.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-4.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-40.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-400.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-401.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-402.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-403.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-404.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-405.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-406.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-407.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-408.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-409.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-41.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-410.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-411.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-412.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-413.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-414.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-415.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-416.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-417.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-418.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-419.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-42.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-420.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-421.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-422.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-423.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-424.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-425.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-426.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-427.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-428.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-429.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-43.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-430.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-431.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-432.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-433.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-434.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-435.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-436.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-437.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-438.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-439.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-44.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-440.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-441.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-442.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-443.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-444.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-445.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-446.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-447.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-448.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-449.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-45.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-450.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-451.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-452.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-453.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-454.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-455.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-456.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-457.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-458.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-459.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-46.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-460.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-461.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-462.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-463.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-464.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-465.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-466.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-467.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-468.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-469.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-47.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-470.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-471.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-472.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-473.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-474.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-475.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-476.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-477.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-478.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-479.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-48.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-480.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-481.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-482.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-483.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-484.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-485.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-486.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-487.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-488.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-489.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-49.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-490.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-491.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-492.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-493.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-494.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-495.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-496.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-497.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-498.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-499.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-5.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-50.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-500.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-501.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-502.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-503.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-504.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-505.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-506.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-507.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-508.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-509.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-51.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-510.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-511.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-512.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-513.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-514.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-515.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-516.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-517.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-518.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-519.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-52.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-520.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-521.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-522.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-523.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-524.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-525.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-526.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-527.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-528.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-529.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-53.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-530.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-531.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-532.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-533.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-534.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-535.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-536.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-537.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-538.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-539.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-54.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-540.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-541.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-542.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-543.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-544.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-545.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-546.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-547.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-548.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-549.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-55.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-550.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-551.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-552.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-553.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-554.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-555.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-556.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-557.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-558.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-559.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-56.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-560.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-561.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-562.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-563.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-564.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-565.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-566.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-567.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-568.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-569.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-57.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-570.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-571.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-572.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-573.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-574.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-575.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-576.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-577.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-578.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-579.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-58.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-580.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-581.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-582.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-583.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-584.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-585.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-586.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-587.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-588.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-589.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-59.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-590.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-591.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-592.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-593.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-594.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-595.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-596.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-597.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-598.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-599.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-6.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-60.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-600.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-601.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-602.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-603.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-604.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-605.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-606.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-607.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-608.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-609.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-61.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-610.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-611.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-612.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-613.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-614.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-615.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-616.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-617.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-618.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-619.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-62.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-620.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-621.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-622.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-623.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-624.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-625.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-626.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-627.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-628.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-629.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-63.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-630.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-631.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-632.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-633.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-634.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-635.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-636.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-637.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-638.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-639.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-64.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-640.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-641.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-642.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-643.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-644.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-645.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-646.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-647.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-648.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-649.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-65.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-650.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-651.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-652.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-653.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-654.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-655.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-656.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-657.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-658.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-659.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-66.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-660.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-661.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-662.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-663.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-664.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-665.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-666.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-667.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-668.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-669.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-67.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-670.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-671.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-672.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-673.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-674.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-675.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-676.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-677.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-678.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-679.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-68.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-680.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-681.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-682.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-683.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-684.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-685.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-686.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-687.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-688.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-689.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-69.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-690.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-691.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-692.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-693.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-694.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-695.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-696.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-697.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-698.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-699.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-7.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-70.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-700.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-701.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-702.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-703.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-704.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-705.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-706.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-707.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-708.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-709.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-71.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-710.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-711.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-712.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-713.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-714.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-715.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-716.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-717.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-718.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-719.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-72.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-720.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-721.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-722.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-723.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-724.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-725.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-726.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-727.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-728.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-729.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-73.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-730.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-731.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-732.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-733.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-734.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-735.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-736.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-737.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-738.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-739.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-74.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-740.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-741.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-742.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-743.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-744.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-745.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-746.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-747.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-748.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-749.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-75.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-750.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-751.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-752.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-753.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-754.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-755.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-756.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-757.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-758.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-759.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-76.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-760.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-761.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-762.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-763.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-764.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-765.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-766.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-767.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-768.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-769.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-77.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-770.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-771.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-772.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-773.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-774.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-775.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-776.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-777.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-778.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-779.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-78.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-780.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-781.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-782.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-783.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-784.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-785.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-786.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-787.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-788.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-789.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-79.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-790.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-791.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-792.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-793.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-794.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-795.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-796.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-797.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-798.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-799.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-8.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-80.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-800.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-801.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-802.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-803.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-804.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-805.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-806.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-807.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-808.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-809.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-81.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-810.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-811.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-812.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-813.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-814.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-815.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-816.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-817.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-818.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-819.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-82.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-820.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-821.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-822.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-823.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-824.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-825.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-826.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-827.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-828.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-829.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-83.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-830.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-831.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-832.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-833.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-834.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-835.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-836.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-837.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-838.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-839.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-84.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-840.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-841.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-842.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-843.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-844.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-845.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-846.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-847.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-848.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-849.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-85.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-850.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-851.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-852.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-853.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-854.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-855.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-856.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-857.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-858.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-859.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-86.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-860.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-861.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-862.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-863.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-864.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-865.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-866.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-867.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-868.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-869.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-87.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-870.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-871.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-872.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-873.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-874.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-875.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-876.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-877.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-878.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-879.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-88.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-880.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-881.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-882.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-883.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-884.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-885.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-886.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-887.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-888.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-889.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-89.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-890.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-891.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-892.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-893.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-894.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-895.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-896.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-897.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-898.bar.com", - "sslPassthrough": true, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-kubernetes-443", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-899.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-9.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-90.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-900.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-901.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-902.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-903.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-904.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-905.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-906.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-907.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-908.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-909.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-91.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-910.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-911.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-912.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-913.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-914.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-915.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-916.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-917.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-918.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-919.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-92.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-920.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-921.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-922.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-923.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-924.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-925.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-926.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-927.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-928.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-929.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-93.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-930.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-931.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-932.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-933.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-934.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-935.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-936.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-937.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-938.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-939.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-94.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-940.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-941.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-942.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-943.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-944.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-945.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-946.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-947.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-948.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-949.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-95.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-950.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-951.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-952.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-953.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-954.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-955.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-956.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-957.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-958.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-959.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-96.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-960.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-961.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-962.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-963.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-964.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-965.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-966.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-967.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-968.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-969.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-97.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-970.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-971.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-972.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-973.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-974.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-975.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-976.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-977.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-978.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-979.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-98.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-980.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-981.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-982.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-983.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-984.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-985.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-986.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-987.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-988.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-989.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-99.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-990.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-991.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-992.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "default/aledbf-ca-secret", - "certFilename": "/ingress-controller/ssl/default-aledbf-ca-secret.pem", - "keyFilename": "", - "caFilename": "/ingress-controller/ssl/ca-default-aledbf-ca-secret.pem", - "pemSha": "69d055bd017208111377c971ba5ee0987fecee65" - } - }] - }, { - "hostname": "foo-993.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-994.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-995.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-996.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-997.bar.com", - "sslPassthrough": true, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo-998.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "https://httpbun.com/basic-auth/user/passwd", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/foo", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo2.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-xtp-echo-port", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foo3.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-xtp-echo-port", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "foos.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "jenkins.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/jenkins", - "isDefBackend": false, - "backend": "default-jenkins-8080", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "default_jenkins_conn", - "limit": 2, - "burst": 10, - "sharedSize": 5 - }, - "rps": { - "name": "default_jenkins_rps", - "limit": 0, - "burst": 10, - "sharedSize": 5 - } - }, - "redirect": { - "target": "/", - "addBaseUrl": true, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/", - "isDefBackend": true, - "backend": "upstream-default-backend", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": null - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "kubernetes.foo-bar.com", - "sslPassthrough": true, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-kubernetes-443", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "no-root.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/api", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/", - "isDefBackend": true, - "backend": "upstream-default-backend", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": null - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "rewrite.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/something", - "isDefBackend": false, - "backend": "default-echoheaders-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "/", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }, { - "path": "/", - "isDefBackend": true, - "backend": "upstream-default-backend", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": null - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "whitelist.bar.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": true - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }, { - "hostname": "with-root.com", - "sslPassthrough": false, - "sslCertificate": "", - "sslPemChecksum": "", - "locations": [{ - "path": "/", - "isDefBackend": false, - "backend": "default-echoheaders-x-80", - "basicDigestAuth": { - "type": "", - "realm": "", - "file": "", - "secured": false - }, - "externalAuth": { - "url": "", - "method": "", - "sendBody": false - }, - "rateLimit": { - "connections": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - }, - "rps": { - "name": "", - "limit": 0, - "burst": 0, - "sharedSize": 0 - } - }, - "redirect": { - "target": "", - "addBaseUrl": false, - "sslRedirect": false - }, - "denylist": { - "cidr": [] - }, - "whitelist": { - "cidr": [] - }, - "proxy": { - "connectTimeout": 5, - "sendTimeout": 60, - "readTimeout": 60, - "bufferSize": "4k" - }, - "certificateAuth": { - "secret": "", - "certFilename": "", - "keyFilename": "", - "caFilename": "", - "pemSha": "" - } - }] - }], - "sslDHParam": "", - "tcpBackends": [], - "udpBackends": [], - "backends": [{ - "name": "default-echoheaders-80", - "secure": false, - "endpoints": [{ - "address": "10.2.3.2", - "port": "8080", - "maxFails": 0, - "failTimeout": 0 - }, { - "address": "10.2.3.5", - "port": "8080", - "maxFails": 0, - "failTimeout": 0 - }] - }, { - "name": "default-echoheaders-x-80", - "secure": false, - "endpoints": [{ - "address": "10.2.3.4", - "port": "8080", - "maxFails": 0, - "failTimeout": 0 - }] - }, { - "name": "default-echoheaders-xtp-echo-port", - "secure": false, - "endpoints": [{ - "address": "127.0.0.1", - "port": "8181", - "maxFails": 0, - "failTimeout": 0 - }] - }, { - "name": "default-echoheaders-y-80", - "secure": false, - "endpoints": [{ - "address": "10.2.3.4", - "port": "8080", - "maxFails": 0, - "failTimeout": 0 - }] - }, { - "name": "default-jenkins-8080", - "secure": false, - "endpoints": [{ - "address": "127.0.0.1", - "port": "8181", - "maxFails": 0, - "failTimeout": 0 - }] - }, { - "name": "default-kubernetes-443", - "secure": false, - "endpoints": [{ - "address": "172.17.4.99", - "port": "443", - "maxFails": 0, - "failTimeout": 0 - }] - }, { - "name": "upstream-default-backend", - "secure": false, - "endpoints": [{ - "address": "10.2.3.11", - "port": "8080", - "maxFails": 0, - "failTimeout": 0 - }] - }] + "backlogSize": 32768, + "isIPV6Enabled": true, + "cfg": { + "disable-ipv6": false, + "bind-address-ipv4": ["1.1.1.1", "2.2.2.2"], + "bind-address-ipv6": [ + "[2001:db8:a0b:12f0::1]", + "[3731:54:65fe:2::a7]", + "[33:33:33::33::33]" + ], + "backend": { + "custom-http-errors": [404], + "proxy-buffers-number": "4", + "proxy-buffer-size": "4k", + "proxy-connect-timeout": 5, + "proxy-read-timeout": 60, + "proxy-send-timeout": 60, + "skip-access-log-urls": ["~*health-check", "~*info"], + "ssl-redirect": true, + "upstream-fail-timeout": 0, + "upstream-max-fails": 0, + "upstream-hash-by": "$request_uri", + "whitelist-source-range": null + }, + "bodySize": "1m", + "enableSpdy": false, + "errorLogLevel": "notice", + "gzipTypes": "application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/javascript text/plain text/x-component", + "hsts": true, + "hstsIncludeSubdomains": true, + "hstsMaxAge": "31536000", + "keepAlive": 75, + "mapHashBucketSize": 64, + "maxWorkerConnections": 16384, + "nginxStatusIpv4Whitelist": "127.0.0.1", + "nginxStatusIpv6Whitelist": "::1", + "proxyRealIpCidr": "0.0.0.0/0", + "retryNonIdempotent": false, + "serverNameHashBucketSize": 64, + "serverNameHashMaxSize": 16384, + "sslBufferSize": "4k", + "sslCiphers": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA", + "sslProtocols": "TLSv1.2", + "sslSessionCache": true, + "sslSessionCacheSize": "10m", + "sslSessionTickets": true, + "sslSessionTimeout": "10m", + "useGzip": true, + "useHttp2": true, + "proxyStreamTimeout": "600s", + "workerProcesses": 1, + "limitConnZoneVariable": "$remote_addr" + }, + "customErrors": true, + "defResolver": "", + "healthzURI": "/healthz", + "passthroughBackends": [ + { + "namespace": "default-kubernetes-443", + "hostname": "foo-898.bar.com" + }, + { + "namespace": "default-echoheaders-x-80", + "hostname": "foo-997.bar.com" + }, + { + "namespace": "default-kubernetes-443", + "hostname": "kubernetes.foo-bar.com" + } + ], + "servers": [ + { + "hostname": "_", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/testpath", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": ["1.1.1.1"] + }, + "whitelist": { + "cidr": ["1.1.1.1"] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": ["1.1.1.1"] + }, + "whitelist": { + "cidr": ["1.1.1.1"] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "bar.baz.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/foo", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/bar", + "isDefBackend": false, + "backend": "default-echoheaders-y-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": null + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "default-backend.sample.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": true, + "backend": "default-echoheaders-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": null + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "external-auth-01.sample.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "https://httpbun.com/basic-auth/user/passwd", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-1.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-10.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-100.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-1000.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-101.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-102.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-103.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-104.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-105.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-106.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-107.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-108.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-109.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-11.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-110.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-111.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-112.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-113.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-114.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-115.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-116.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-117.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-118.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-119.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-12.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-120.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-121.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-122.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-123.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-124.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-125.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-126.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-127.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-128.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-129.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-13.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-130.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-131.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-132.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-133.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-134.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-135.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-136.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-137.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-138.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-139.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-14.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-140.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-141.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-142.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-143.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-144.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-145.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-146.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-147.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-148.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-149.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-15.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-150.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-151.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-152.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-153.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-154.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-155.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-156.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-157.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-158.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-159.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-16.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-160.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-161.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-162.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-163.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-164.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-165.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-166.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-167.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-168.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-169.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-17.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-170.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-171.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-172.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-173.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-174.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-175.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-176.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-177.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-178.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-179.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-18.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-180.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-181.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-182.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-183.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-184.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-185.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-186.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-187.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-188.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-189.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-19.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-190.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-191.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-192.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-193.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-194.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-195.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-196.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-197.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-198.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-199.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-2.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-20.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-200.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-201.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-202.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-203.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-204.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-205.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-206.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-207.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-208.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-209.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-21.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-210.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-211.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-212.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-213.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-214.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-215.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-216.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-217.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-218.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-219.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-22.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-220.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-221.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-222.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-223.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-224.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-225.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-226.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-227.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-228.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-229.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-23.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-230.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-231.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-232.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-233.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-234.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-235.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-236.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-237.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-238.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-239.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-24.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-240.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-241.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-242.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-243.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-244.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-245.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-246.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-247.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-248.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-249.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-25.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-250.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-251.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-252.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-253.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-254.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-255.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-256.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-257.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-258.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-259.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-26.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-260.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-261.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-262.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-263.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-264.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-265.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-266.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-267.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-268.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-269.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-27.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-270.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-271.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-272.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-273.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-274.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-275.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-276.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-277.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-278.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-279.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-28.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-280.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-281.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-282.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-283.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-284.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-285.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-286.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-287.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-288.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-289.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-29.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-290.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-291.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-292.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-293.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-294.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-295.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-296.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-297.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-298.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-299.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-3.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-30.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-300.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-301.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-302.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-303.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-304.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-305.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-306.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-307.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-308.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-309.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-31.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-310.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-311.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-312.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-313.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-314.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-315.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-316.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-317.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-318.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-319.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-32.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-320.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-321.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-322.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-323.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-324.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-325.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-326.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-327.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-328.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-329.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-33.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-330.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-331.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-332.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-333.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-334.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-335.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-336.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-337.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-338.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-339.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-34.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-340.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-341.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-342.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-343.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-344.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-345.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-346.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-347.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-348.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-349.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-35.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-350.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-351.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-352.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-353.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-354.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-355.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-356.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-357.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-358.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-359.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-36.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-360.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-361.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-362.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-363.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-364.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-365.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-366.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-367.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-368.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-369.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-37.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-370.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-371.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-372.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-373.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-374.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-375.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-376.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-377.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-378.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-379.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-38.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-380.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-381.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-382.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-383.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-384.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-385.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-386.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-387.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-388.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-389.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-39.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-390.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-391.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-392.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-393.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-394.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-395.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-396.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-397.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-398.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-399.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-4.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-40.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-400.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-401.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-402.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-403.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-404.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-405.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-406.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-407.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-408.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-409.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-41.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-410.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-411.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-412.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-413.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-414.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-415.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-416.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-417.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-418.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-419.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-42.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-420.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-421.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-422.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-423.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-424.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-425.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-426.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-427.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-428.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-429.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-43.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-430.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-431.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-432.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-433.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-434.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-435.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-436.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-437.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-438.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-439.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-44.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-440.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-441.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-442.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-443.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-444.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-445.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-446.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-447.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-448.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-449.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-45.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-450.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-451.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-452.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-453.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-454.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-455.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-456.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-457.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-458.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-459.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-46.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-460.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-461.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-462.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-463.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-464.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-465.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-466.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-467.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-468.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-469.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-47.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-470.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-471.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-472.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-473.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-474.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-475.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-476.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-477.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-478.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-479.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-48.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-480.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-481.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-482.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-483.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-484.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-485.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-486.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-487.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-488.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-489.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-49.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-490.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-491.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-492.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-493.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-494.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-495.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-496.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-497.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-498.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-499.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-5.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-50.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-500.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-501.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-502.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-503.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-504.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-505.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-506.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-507.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-508.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-509.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-51.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-510.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-511.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-512.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-513.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-514.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-515.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-516.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-517.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-518.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-519.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-52.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-520.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-521.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-522.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-523.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-524.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-525.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-526.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-527.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-528.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-529.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-53.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-530.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-531.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-532.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-533.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-534.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-535.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-536.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-537.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-538.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-539.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-54.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-540.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-541.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-542.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-543.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-544.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-545.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-546.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-547.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-548.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-549.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-55.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-550.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-551.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-552.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-553.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-554.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-555.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-556.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-557.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-558.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-559.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-56.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-560.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-561.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-562.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-563.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-564.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-565.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-566.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-567.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-568.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-569.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-57.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-570.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-571.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-572.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-573.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-574.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-575.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-576.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-577.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-578.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-579.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-58.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-580.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-581.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-582.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-583.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-584.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-585.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-586.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-587.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-588.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-589.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-59.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-590.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-591.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-592.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-593.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-594.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-595.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-596.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-597.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-598.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-599.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-6.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-60.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-600.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-601.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-602.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-603.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-604.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-605.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-606.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-607.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-608.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-609.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-61.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-610.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-611.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-612.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-613.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-614.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-615.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-616.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-617.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-618.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-619.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-62.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-620.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-621.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-622.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-623.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-624.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-625.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-626.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-627.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-628.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-629.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-63.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-630.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-631.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-632.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-633.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-634.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-635.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-636.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-637.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-638.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-639.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-64.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-640.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-641.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-642.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-643.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-644.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-645.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-646.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-647.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-648.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-649.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-65.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-650.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-651.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-652.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-653.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-654.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-655.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-656.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-657.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-658.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-659.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-66.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-660.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-661.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-662.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-663.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-664.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-665.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-666.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-667.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-668.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-669.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-67.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-670.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-671.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-672.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-673.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-674.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-675.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-676.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-677.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-678.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-679.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-68.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-680.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-681.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-682.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-683.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-684.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-685.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-686.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-687.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-688.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-689.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-69.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-690.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-691.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-692.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-693.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-694.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-695.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-696.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-697.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-698.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-699.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-7.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-70.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-700.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-701.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-702.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-703.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-704.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-705.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-706.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-707.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-708.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-709.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-71.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-710.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-711.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-712.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-713.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-714.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-715.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-716.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-717.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-718.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-719.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-72.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-720.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-721.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-722.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-723.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-724.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-725.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-726.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-727.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-728.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-729.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-73.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-730.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-731.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-732.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-733.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-734.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-735.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-736.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-737.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-738.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-739.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-74.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-740.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-741.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-742.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-743.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-744.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-745.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-746.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-747.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-748.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-749.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-75.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-750.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-751.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-752.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-753.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-754.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-755.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-756.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-757.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-758.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-759.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-76.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-760.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-761.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-762.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-763.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-764.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-765.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-766.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-767.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-768.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-769.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-77.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-770.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-771.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-772.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-773.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-774.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-775.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-776.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-777.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-778.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-779.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-78.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-780.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-781.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-782.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-783.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-784.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-785.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-786.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-787.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-788.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-789.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-79.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-790.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-791.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-792.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-793.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-794.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-795.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-796.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-797.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-798.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-799.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-8.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-80.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-800.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-801.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-802.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-803.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-804.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-805.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-806.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-807.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-808.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-809.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-81.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-810.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-811.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-812.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-813.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-814.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-815.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-816.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-817.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-818.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-819.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-82.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-820.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-821.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-822.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-823.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-824.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-825.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-826.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-827.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-828.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-829.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-83.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-830.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-831.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-832.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-833.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-834.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-835.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-836.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-837.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-838.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-839.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-84.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-840.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-841.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-842.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-843.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-844.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-845.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-846.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-847.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-848.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-849.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-85.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-850.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-851.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-852.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-853.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-854.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-855.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-856.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-857.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-858.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-859.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-86.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-860.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-861.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-862.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-863.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-864.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-865.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-866.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-867.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-868.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-869.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-87.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-870.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-871.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-872.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-873.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-874.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-875.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-876.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-877.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-878.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-879.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-88.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-880.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-881.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-882.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-883.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-884.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-885.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-886.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-887.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-888.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-889.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-89.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-890.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-891.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-892.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-893.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-894.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-895.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-896.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-897.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-898.bar.com", + "sslPassthrough": true, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-kubernetes-443", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-899.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-9.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-90.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-900.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-901.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-902.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-903.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-904.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-905.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-906.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-907.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-908.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-909.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-91.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-910.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-911.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-912.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-913.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-914.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-915.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-916.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-917.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-918.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-919.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-92.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-920.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-921.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-922.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-923.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-924.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-925.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-926.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-927.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-928.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-929.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-93.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-930.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-931.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-932.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-933.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-934.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-935.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-936.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-937.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-938.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-939.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-94.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-940.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-941.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-942.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-943.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-944.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-945.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-946.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-947.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-948.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-949.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-95.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-950.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-951.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-952.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-953.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-954.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-955.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-956.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-957.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-958.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-959.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-96.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-960.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-961.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-962.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-963.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-964.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-965.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-966.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-967.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-968.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-969.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-97.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-970.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-971.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-972.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-973.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-974.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-975.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-976.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-977.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-978.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-979.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-98.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-980.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-981.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-982.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-983.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-984.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-985.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-986.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-987.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-988.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-989.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-99.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-990.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-991.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-992.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "default/aledbf-ca-secret", + "certFilename": "/ingress-controller/ssl/default-aledbf-ca-secret.pem", + "keyFilename": "", + "caFilename": "/ingress-controller/ssl/ca-default-aledbf-ca-secret.pem", + "pemSha": "69d055bd017208111377c971ba5ee0987fecee65" + } + } + ] + }, + { + "hostname": "foo-993.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-994.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-995.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-996.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-997.bar.com", + "sslPassthrough": true, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo-998.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "https://httpbun.com/basic-auth/user/passwd", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/foo", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo2.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-xtp-echo-port", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foo3.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-xtp-echo-port", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "foos.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "jenkins.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/jenkins", + "isDefBackend": false, + "backend": "default-jenkins-8080", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "default_jenkins_conn", + "limit": 2, + "burst": 10, + "sharedSize": 5 + }, + "rps": { + "name": "default_jenkins_rps", + "limit": 0, + "burst": 10, + "sharedSize": 5 + } + }, + "redirect": { + "target": "/", + "addBaseUrl": true, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "kubernetes.foo-bar.com", + "sslPassthrough": true, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-kubernetes-443", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "no-root.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/api", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "rewrite.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/something", + "isDefBackend": false, + "backend": "default-echoheaders-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "/", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + }, + { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "whitelist.bar.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + }, + { + "hostname": "with-root.com", + "sslPassthrough": false, + "sslCertificate": "", + "sslPemChecksum": "", + "locations": [ + { + "path": "/", + "isDefBackend": false, + "backend": "default-echoheaders-x-80", + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false + }, + "externalAuth": { + "url": "", + "method": "", + "sendBody": false + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false + }, + "denylist": { + "cidr": [] + }, + "whitelist": { + "cidr": [] + }, + "proxy": { + "connectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k" + }, + "certificateAuth": { + "secret": "", + "certFilename": "", + "keyFilename": "", + "caFilename": "", + "pemSha": "" + } + } + ] + } + ], + "sslDHParam": "", + "tcpBackends": [], + "udpBackends": [], + "backends": [ + { + "name": "default-echoheaders-80", + "secure": false, + "endpoints": [ + { + "address": "10.2.3.2", + "port": "8080", + "maxFails": 0, + "failTimeout": 0 + }, + { + "address": "10.2.3.5", + "port": "8080", + "maxFails": 0, + "failTimeout": 0 + } + ] + }, + { + "name": "default-echoheaders-x-80", + "secure": false, + "endpoints": [ + { + "address": "10.2.3.4", + "port": "8080", + "maxFails": 0, + "failTimeout": 0 + } + ] + }, + { + "name": "default-echoheaders-xtp-echo-port", + "secure": false, + "endpoints": [ + { + "address": "127.0.0.1", + "port": "8181", + "maxFails": 0, + "failTimeout": 0 + } + ] + }, + { + "name": "default-echoheaders-y-80", + "secure": false, + "endpoints": [ + { + "address": "10.2.3.4", + "port": "8080", + "maxFails": 0, + "failTimeout": 0 + } + ] + }, + { + "name": "default-jenkins-8080", + "secure": false, + "endpoints": [ + { + "address": "127.0.0.1", + "port": "8181", + "maxFails": 0, + "failTimeout": 0 + } + ] + }, + { + "name": "default-kubernetes-443", + "secure": false, + "endpoints": [ + { + "address": "172.17.4.99", + "port": "443", + "maxFails": 0, + "failTimeout": 0 + } + ] + }, + { + "name": "upstream-default-backend", + "secure": false, + "endpoints": [ + { + "address": "10.2.3.11", + "port": "8080", + "maxFails": 0, + "failTimeout": 0 + } + ] + } + ] } diff --git a/test/e2e-image/Dockerfile b/test/e2e-image/Dockerfile index cd0bcb715..c16545e43 100644 --- a/test/e2e-image/Dockerfile +++ b/test/e2e-image/Dockerfile @@ -1,7 +1,7 @@ ARG E2E_BASE_IMAGE FROM ${E2E_BASE_IMAGE} AS BASE -FROM alpine:3.18.4 +FROM alpine:3.21 RUN apk update \ && apk upgrade && apk add -U --no-cache \ @@ -9,7 +9,8 @@ RUN apk update \ bash \ tzdata \ libc6-compat \ - openssl + openssl \ + sqlite-dev COPY --from=BASE /go/bin/ginkgo /usr/local/bin/ COPY --from=BASE /usr/local/bin/helm /usr/local/bin/ diff --git a/test/e2e-image/Makefile b/test/e2e-image/Makefile index bd3453253..f72651f48 100644 --- a/test/e2e-image/Makefile +++ b/test/e2e-image/Makefile @@ -1,6 +1,6 @@ DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) -E2E_BASE_IMAGE ?= "registry.k8s.io/ingress-nginx/e2e-test-runner:v20230907-5bb82dcb7@sha256:421cda0f65a949b8b67b5e62a45071702d19ed458a3e2ba753171b0e66943210" +E2E_BASE_IMAGE ?= "registry.k8s.io/ingress-nginx/e2e-test-runner:v20250112-a188f4eb@sha256:043038b1e30e5a0b64f3f919f096c5c9488ac3f617ac094b07fb9db8215f9441" image: echo "..entered Makefile in /test/e2e-image" diff --git a/test/e2e-image/namespace-overlays/disableleaderelection/values.yaml b/test/e2e-image/namespace-overlays/disableleaderelection/values.yaml new file mode 100644 index 000000000..f312a9fb4 --- /dev/null +++ b/test/e2e-image/namespace-overlays/disableleaderelection/values.yaml @@ -0,0 +1,34 @@ +# TODO: remove the need to use fullnameOverride +fullnameOverride: nginx-ingress +controller: + image: + repository: ingress-controller/controller + chroot: true + tag: 1.0.0-dev + digest: + digestChroot: + scope: + # Necessary to allow the ingress controller to get the topology information from the nodes + enabled: false + config: + worker-processes: "1" + readinessProbe: + initialDelaySeconds: 3 + periodSeconds: 1 + livenessProbe: + initialDelaySeconds: 3 + periodSeconds: 1 + service: + type: NodePort + extraArgs: + # e2e tests do not require information about ingress status + update-status: "false" + terminationGracePeriodSeconds: 1 + admissionWebhooks: + enabled: false + + disableLeaderElection: true + +rbac: + create: true + scope: false diff --git a/test/e2e/HTTPBUN_IMAGE b/test/e2e/HTTPBUN_IMAGE index 2d95865c7..491b333c7 100644 --- a/test/e2e/HTTPBUN_IMAGE +++ b/test/e2e/HTTPBUN_IMAGE @@ -1 +1 @@ -registry.k8s.io/ingress-nginx/e2e-test-httpbun:v20230505-v0.0.1 +registry.k8s.io/ingress-nginx/httpbun:v1.1.1@sha256:4569515d9b74470c915566a010792e7202b6769443fb1f3bb1b1e87376028634 diff --git a/test/e2e/admission/admission.go b/test/e2e/admission/admission.go index c41105e2d..873e6719d 100644 --- a/test/e2e/admission/admission.go +++ b/test/e2e/admission/admission.go @@ -44,33 +44,6 @@ var _ = framework.IngressNginxDescribeSerial("[Admission] admission controller", f.NewSlowEchoDeployment() }) - ginkgo.It("reject ingress with global-rate-limit annotations when memcached is not configured", func() { - host := admissionTestHost - - annotations := map[string]string{ - "nginx.ingress.kubernetes.io/global-rate-limit": "100", - "nginx.ingress.kubernetes.io/global-rate-limit-window": "1m", - } - ing := framework.NewSingleIngress("first-ingress", "/", host, f.Namespace, framework.EchoService, 80, annotations) - - ginkgo.By("rejects ingress when memcached is not configured") - - _, err := f.KubeClientSet.NetworkingV1().Ingresses(f.Namespace).Create(context.TODO(), ing, metav1.CreateOptions{}) - assert.NotNil(ginkgo.GinkgoT(), err, "creating ingress with global throttle annotations when memcached is not configured") - - ginkgo.By("accepts ingress when memcached is not configured") - - f.UpdateNginxConfigMapData("global-rate-limit-memcached-host", "memc.default.svc.cluster.local") - - _, err = f.KubeClientSet.NetworkingV1().Ingresses(f.Namespace).Create(context.TODO(), ing, metav1.CreateOptions{}) - assert.Nil(ginkgo.GinkgoT(), err, "creating ingress with global throttle annotations when memcached is configured") - - f.WaitForNginxServer(host, - func(server string) bool { - return strings.Contains(server, fmt.Sprintf("server_name %v", host)) - }) - }) - ginkgo.It("should not allow overlaps of host and paths without canary annotations", func() { host := admissionTestHost @@ -127,14 +100,8 @@ var _ = framework.IngressNginxDescribeSerial("[Admission] admission controller", }) ginkgo.It("should return an error if there is an error validating the ingress definition", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := admissionTestHost @@ -241,14 +208,8 @@ var _ = framework.IngressNginxDescribeSerial("[Admission] admission controller", }) ginkgo.It("should return an error if the Ingress V1 definition contains invalid annotations", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() out, err := createIngress(f.Namespace, invalidV1Ingress) assert.Empty(ginkgo.GinkgoT(), out) @@ -261,14 +222,8 @@ var _ = framework.IngressNginxDescribeSerial("[Admission] admission controller", }) ginkgo.It("should not return an error for an invalid Ingress when it has unknown class", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() out, err := createIngress(f.Namespace, invalidV1IngressWithOtherClass) assert.Equal(ginkgo.GinkgoT(), "ingress.networking.k8s.io/extensions-invalid-other created\n", out) assert.Nil(ginkgo.GinkgoT(), err, "creating an invalid ingress with unknown class using kubectl") diff --git a/test/e2e/annotations/auth.go b/test/e2e/annotations/auth.go index 415ffd951..ddda1dce5 100644 --- a/test/e2e/annotations/auth.go +++ b/test/e2e/annotations/auth.go @@ -277,14 +277,8 @@ var _ = framework.DescribeAnnotation("auth-*", func() { "nginx.ingress.kubernetes.io/auth-snippet": ` proxy_set_header My-Custom-Header 42;`, } - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) f.EnsureIngress(ing) @@ -297,15 +291,8 @@ var _ = framework.DescribeAnnotation("auth-*", func() { ginkgo.It(`should not set snippet "proxy_set_header My-Custom-Header 42;" when external auth is not configured`, func() { host := authHost - - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() annotations := map[string]string{ "nginx.ingress.kubernetes.io/auth-snippet": ` @@ -425,6 +412,7 @@ http { f.EnsureIngress(ing2) f.WaitForNginxServer(host, func(server string) bool { + //nolint:goconst //server_name is a constant return strings.Contains(server, "server_name "+host) }) }) @@ -665,7 +653,7 @@ http { func(server string) bool { return strings.Contains(server, `upstream auth-external-auth`) && strings.Contains(server, `keepalive 10;`) && - strings.Contains(server, `share_all_vars = false`) + strings.Contains(server, `set $auth_keepalive_share_vars false;`) }) }) @@ -685,7 +673,7 @@ http { func(server string) bool { return strings.Contains(server, `upstream auth-external-auth`) && strings.Contains(server, `keepalive 10;`) && - strings.Contains(server, `share_all_vars = true`) + strings.Contains(server, `set $auth_keepalive_share_vars true;`) }) }) }) diff --git a/test/e2e/annotations/authtls.go b/test/e2e/annotations/authtls.go index c7a05c053..3315065f1 100644 --- a/test/e2e/annotations/authtls.go +++ b/test/e2e/annotations/authtls.go @@ -322,6 +322,49 @@ var _ = framework.DescribeAnnotation("auth-tls-*", func() { Status(http.StatusOK) }) + ginkgo.It("should reload the nginx config when auth-tls-match-cn is updated", func() { + host := authTLSFooHost + nameSpace := f.Namespace + + clientConfig, err := framework.CreateIngressMASecret( + f.KubeClientSet, + host, + host, + nameSpace) + assert.Nil(ginkgo.GinkgoT(), err) + + // First add an annotation that forbids our connection + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/auth-tls-secret": nameSpace + "/" + host, + "nginx.ingress.kubernetes.io/auth-tls-verify-client": "on", + "nginx.ingress.kubernetes.io/auth-tls-match-cn": "CN=notvalid", + } + + ingress := f.EnsureIngress(framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, nameSpace, framework.EchoService, 80, annotations)) + + assertSslClientCertificateConfig(f, host, "on", "1") + + f.HTTPTestClientWithTLSConfig(clientConfig). + GET("/"). + WithURL(f.GetURL(framework.HTTPS)). + WithHeader("Host", host). + Expect(). + Status(http.StatusForbidden) + + // Update the annotation to something that allows the connection + ingress.Annotations["nginx.ingress.kubernetes.io/auth-tls-match-cn"] = "CN=authtls" + f.UpdateIngress(ingress) + + assertSslClientCertificateConfig(f, host, "on", "1") + + f.HTTPTestClientWithTLSConfig(clientConfig). + GET("/"). + WithURL(f.GetURL(framework.HTTPS)). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + }) + ginkgo.It("should return 200 using auth-tls-match-cn where atleast one of the regex options matches CN from client", func() { host := authTLSFooHost nameSpace := f.Namespace diff --git a/test/e2e/annotations/cors.go b/test/e2e/annotations/cors.go index dd28f5dd4..58f4445f7 100644 --- a/test/e2e/annotations/cors.go +++ b/test/e2e/annotations/cors.go @@ -632,4 +632,70 @@ var _ = framework.DescribeAnnotation("cors-*", func() { Status(http.StatusOK).Headers(). ValueEqual("Access-Control-Allow-Origin", []string{"*"}) }) + + ginkgo.It("should allow correct origin but not others - cors allow origin annotations contain trailing comma", func() { + host := corsHost + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/enable-cors": "true", + "nginx.ingress.kubernetes.io/cors-allow-origin": "https://origin-123.cors.com:8080, ,https://origin-321.cors.com:8080,", + } + + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + origin1 := "https://origin-123.cors.com:8080" + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", host). + WithHeader("Origin", origin1). + Expect(). + Headers().ContainsKey("Access-Control-Allow-Origin") + + origin2 := "https://origin-321.cors.com:8080" + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", host). + WithHeader("Origin", origin2). + Expect(). + Status(http.StatusOK).Headers(). + ValueEqual("Access-Control-Allow-Origin", []string{origin2}) + + origin3 := "https://unknown.cors.com:8080" + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", host). + WithHeader("Origin", origin3). + Expect(). + Headers(). + NotContainsKey("Access-Control-Allow-Origin") + }) + + ginkgo.It("should allow - origins with non-http[s] protocols", func() { + host := corsHost + origin := "test://localhost" + origin2 := "tauri://localhost:3000" + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/enable-cors": "true", + "nginx.ingress.kubernetes.io/cors-allow-origin": "test://localhost, tauri://localhost:3000", + } + + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", host). + WithHeader("Origin", origin). + Expect(). + Status(http.StatusOK).Headers(). + ValueEqual("Access-Control-Allow-Origin", []string{"test://localhost"}) + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", host). + WithHeader("Origin", origin2). + Expect(). + Status(http.StatusOK).Headers(). + ValueEqual("Access-Control-Allow-Origin", []string{"tauri://localhost:3000"}) + }) }) diff --git a/test/e2e/annotations/customheaders.go b/test/e2e/annotations/customheaders.go new file mode 100644 index 000000000..274ce8278 --- /dev/null +++ b/test/e2e/annotations/customheaders.go @@ -0,0 +1,110 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package annotations + +import ( + "fmt" + "net/http" + "strings" + + "github.com/onsi/ginkgo/v2" + + "k8s.io/ingress-nginx/test/e2e/framework" +) + +const ( + customHeaderHost = "custom-headers" +) + +var _ = framework.DescribeAnnotation("custom-headers-*", func() { + f := framework.NewDefaultFramework("custom-headers") + + ginkgo.BeforeEach(func() { + f.NewEchoDeployment() + }) + + ginkgo.It("should return status code 200 when no custom-headers is configured", func() { + ing := framework.NewSingleIngress(customHeaderHost, "/", customHeaderHost, f.Namespace, framework.EchoService, 80, nil) + f.EnsureIngress(ing) + + f.WaitForNginxServer(customHeaderHost, + func(server string) bool { + return strings.Contains(server, "server_name custom-headers") + }) + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", customHeaderHost). + Expect(). + Status(http.StatusOK). + Body().Contains(fmt.Sprintf("host=%v", customHeaderHost)) + }) + + ginkgo.It("should return status code 503 when custom-headers is configured with an invalid secret", func() { + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/custom-headers": f.Namespace + "/custom-headers", + } + + ing := framework.NewSingleIngress(customHeaderHost, "/", customHeaderHost, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(customHeaderHost, + func(server string) bool { + return strings.Contains(server, "server_name custom-headers") + }) + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", customHeaderHost). + Expect(). + Status(http.StatusServiceUnavailable). + Body().Contains("503 Service Temporarily Unavailable") + }) + + ginkgo.It(`should set "more_set_headers 'My-Custom-Header' '42';" when custom-headers are set`, func() { + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/custom-headers": f.Namespace + "/custom-headers", + } + + f.CreateConfigMap("custom-headers", map[string]string{ + "My-Custom-Header": "42", + "My-Custom-Header-Dollar": "$remote_addr", + }) + f.UpdateNginxConfigMapData("global-allowed-response-headers", "My-Custom-Header,My-Custom-Header-Dollar") + + ing := framework.NewSingleIngress(customHeaderHost, "/", customHeaderHost, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(customHeaderHost, + func(server string) bool { + return strings.Contains(server, `more_set_headers "My-Custom-Header: 42";`) + }) + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", customHeaderHost). + Expect(). + Status(http.StatusOK). + Header("My-Custom-Header").Contains("42") + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", customHeaderHost). + Expect(). + Status(http.StatusOK). + Header("My-Custom-Header-Dollar").Contains("$remote_addr") + }) +}) diff --git a/test/e2e/annotations/disableproxyintercepterrors.go b/test/e2e/annotations/disableproxyintercepterrors.go new file mode 100644 index 000000000..17efa4588 --- /dev/null +++ b/test/e2e/annotations/disableproxyintercepterrors.go @@ -0,0 +1,100 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package annotations + +import ( + "fmt" + "net/http" + "strings" + + networking "k8s.io/api/networking/v1" + + "github.com/onsi/ginkgo/v2" + "github.com/stretchr/testify/assert" + "k8s.io/ingress-nginx/test/e2e/framework" +) + +var _ = framework.DescribeAnnotation("disable-proxy-intercept-errors", func() { + f := framework.NewDefaultFramework("disable-proxy-intercept-errors") + + ginkgo.BeforeEach(func() { + f.NewHttpbunDeployment() + f.NewEchoDeployment() + }) + + ginkgo.It("configures Nginx correctly", func() { + host := "pie.foo.com" + + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/custom-http-errors": "404", + "nginx.ingress.kubernetes.io/disable-proxy-intercept-errors": "true", + "nginx.ingress.kubernetes.io/default-backend": framework.EchoService, + } + + ingHTTPBunService := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.HTTPBunService, 80, annotations) + f.EnsureIngress(ingHTTPBunService) + + var serverConfig string + f.WaitForNginxServer(host, func(sc string) bool { + serverConfig = sc + return strings.Contains(serverConfig, fmt.Sprintf("server_name %s", host)) + }) + + ginkgo.By("turning off proxy_intercept_errors directive") + assert.NotContains(ginkgo.GinkgoT(), serverConfig, "proxy_intercept_errors on;") + + // the plan for client side testing + // create ingress where we disable intercept for code 404 - that error should get to the client + // the same ingress should intercept any other error (>300 and not 404) where we will get intercepted error + ginkgo.By("client test to check response - with intercept disabled") + requestID := "proxy_intercept_errors" + + f.HTTPTestClient(). + GET("/status/404"). + WithHeader("Host", host). + WithHeader("x-request-id", requestID). + Expect(). + Status(http.StatusNotFound). + Body().Empty() + + ginkgo.By("client test to check response - with intercept enabled") + err := framework.UpdateIngress(f.KubeClientSet, f.Namespace, host, func(ingress *networking.Ingress) error { + ingress.ObjectMeta.Annotations["nginx.ingress.kubernetes.io/disable-proxy-intercept-errors"] = "false" + return nil + }) + assert.Nil(ginkgo.GinkgoT(), err) + + f.WaitForNginxServer(host, func(sc string) bool { + if serverConfig != sc { + serverConfig = sc + return true + } + return false + }) + + f.HTTPTestClient(). + GET("/status/404"). + WithHeader("Host", host). + WithHeader("x-request-id", requestID). + Expect(). + Status(http.StatusOK). + Body().Contains("x-code=404"). + Contains(fmt.Sprintf("x-ingress-name=%s", host)). + Contains(fmt.Sprintf("x-service-name=%s", framework.HTTPBunService)). + Contains(fmt.Sprintf("x-request-id=%s", requestID)) + }) +}) diff --git a/test/e2e/annotations/fromtowwwredirect.go b/test/e2e/annotations/fromtowwwredirect.go index b69cce93e..a3fb3b9b5 100644 --- a/test/e2e/annotations/fromtowwwredirect.go +++ b/test/e2e/annotations/fromtowwwredirect.go @@ -58,18 +58,12 @@ var _ = framework.DescribeAnnotation("from-to-www-redirect", func() { WithHeader("Host", fmt.Sprintf("%s.%s", "www", host)). Expect(). Status(http.StatusPermanentRedirect). - Header("Location").Equal("http://fromtowwwredirect.bar.com/foo") + Header("Location").Equal("http://fromtowwwredirect.bar.com:80/foo") }) ginkgo.It("should redirect from www HTTPS to HTTPS", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() ginkgo.By("setting up server for redirect from www") @@ -107,7 +101,7 @@ var _ = framework.DescribeAnnotation("from-to-www-redirect", func() { WithHeader("Host", toHost). Expect(). Status(http.StatusPermanentRedirect). - Header("Location").Equal(fmt.Sprintf("https://%v", fromHost)) + Header("Location").Equal(fmt.Sprintf("https://%v:443", fromHost)) ginkgo.By("sending request to domain should not redirect to www") f.HTTPTestClientWithTLSConfig(&tls.Config{ diff --git a/test/e2e/annotations/globalratelimit.go b/test/e2e/annotations/globalratelimit.go deleted file mode 100644 index 96be467fe..000000000 --- a/test/e2e/annotations/globalratelimit.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package annotations - -import ( - "fmt" - "net/http" - "strings" - - "github.com/onsi/ginkgo/v2" - "github.com/stretchr/testify/assert" - - "k8s.io/ingress-nginx/test/e2e/framework" -) - -var _ = framework.DescribeAnnotation("annotation-global-rate-limit", func() { - f := framework.NewDefaultFramework("global-rate-limit") - host := "global-rate-limit-annotation" - - ginkgo.BeforeEach(func() { - f.NewEchoDeployment() - }) - - ginkgo.It("generates correct configuration", func() { - annotations := make(map[string]string) - annotations["nginx.ingress.kubernetes.io/global-rate-limit"] = "5" - annotations["nginx.ingress.kubernetes.io/global-rate-limit-window"] = "2m" - - // We need to allow { and } characters for this annotation to work - f.UpdateNginxConfigMapData("annotation-value-word-blocklist", "load_module, lua_package, _by_lua, location, root") - // Sleep a while just to guarantee that the configmap is applied - framework.Sleep() - - ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) - ing = f.EnsureIngress(ing) - namespace := strings.ReplaceAll(string(ing.UID), "-", "") - - serverConfig := "" - f.WaitForNginxServer(host, func(server string) bool { - serverConfig = server - return true - }) - assert.Contains(ginkgo.GinkgoT(), serverConfig, - fmt.Sprintf(`global_throttle = { namespace = "%v", `+ - `limit = 5, window_size = 120, key = { { nil, nil, "remote_addr", nil, }, }, `+ - `ignored_cidrs = { } }`, - namespace)) - - f.HTTPTestClient().GET("/").WithHeader("Host", host).Expect().Status(http.StatusOK) - - ginkgo.By("regenerating the correct configuration after update") - annotations["nginx.ingress.kubernetes.io/global-rate-limit-key"] = "${remote_addr}${http_x_api_client}" - annotations["nginx.ingress.kubernetes.io/global-rate-limit-ignored-cidrs"] = "192.168.1.1, 234.234.234.0/24" - ing.SetAnnotations(annotations) - - f.WaitForReload(func() { - ing = f.UpdateIngress(ing) - }) - - serverConfig = "" - f.WaitForNginxServer(host, func(server string) bool { - serverConfig = server - return true - }) - assert.Contains(ginkgo.GinkgoT(), serverConfig, - fmt.Sprintf(`global_throttle = { namespace = "%v", `+ - `limit = 5, window_size = 120, `+ - `key = { { nil, "remote_addr", nil, nil, }, { nil, "http_x_api_client", nil, nil, }, }, `+ - `ignored_cidrs = { "192.168.1.1", "234.234.234.0/24", } }`, - namespace)) - - f.HTTPTestClient().GET("/").WithHeader("Host", host).Expect().Status(http.StatusOK) - }) -}) diff --git a/test/e2e/annotations/grpc.go b/test/e2e/annotations/grpc.go index b256b8ae4..2a9c5a983 100644 --- a/test/e2e/annotations/grpc.go +++ b/test/e2e/annotations/grpc.go @@ -22,11 +22,13 @@ import ( "fmt" "strings" + delaypb "github.com/Anddd7/pb/grpcbin" pb "github.com/moul/pb/grpcbin/go-grpc" "github.com/onsi/ginkgo/v2" "github.com/stretchr/testify/assert" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -35,7 +37,10 @@ import ( "k8s.io/ingress-nginx/test/e2e/framework" ) -const echoHost = "echo" +const ( + echoHost = "echo" + host = "grpc" +) var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { f := framework.NewDefaultFramework("grpc", framework.WithHTTPBunEnabled()) @@ -43,8 +48,6 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { ginkgo.It("should use grpc_pass in the configuration file", func() { f.NewGRPCFortuneTellerDeployment() - host := "grpc" - annotations := map[string]string{ "nginx.ingress.kubernetes.io/backend-protocol": "GRPC", } @@ -103,7 +106,8 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { return strings.Contains(server, "grpc_pass grpc://upstream_balancer;") }) - conn, err := grpc.Dial(f.GetNginxIP()+":443", + //nolint:goconst //string interpolation + conn, err := grpc.NewClient(f.GetNginxIP()+":443", grpc.WithTransportCredentials( credentials.NewTLS(&tls.Config{ ServerName: echoHost, @@ -164,7 +168,7 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { return strings.Contains(server, "grpc_pass grpc://upstream_balancer;") }) - conn, err := grpc.Dial(f.GetNginxIP()+":443", + conn, err := grpc.NewClient(f.GetNginxIP()+":443", grpc.WithTransportCredentials( credentials.NewTLS(&tls.Config{ ServerName: echoHost, @@ -189,14 +193,8 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { ginkgo.It("should return OK for service with backend protocol GRPCS", func() { f.NewGRPCBinDeployment() - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := echoHost @@ -238,7 +236,7 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { return strings.Contains(server, "grpc_pass grpcs://upstream_balancer;") }) - conn, err := grpc.Dial(f.GetNginxIP()+":443", + conn, err := grpc.NewClient(f.GetNginxIP()+":443", grpc.WithTransportCredentials( credentials.NewTLS(&tls.Config{ ServerName: echoHost, @@ -258,4 +256,89 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { metadata := res.GetMetadata() assert.Equal(ginkgo.GinkgoT(), metadata["content-type"].Values[0], "application/grpc") }) + + ginkgo.It("should return OK when request not exceed timeout", func() { + f.NewGRPCBinDelayDeployment() + + proxyTimeout := "10" + ingressName := "grpcbin-delay" + + annotations := make(map[string]string) + annotations["nginx.ingress.kubernetes.io/backend-protocol"] = "GRPC" + annotations["nginx.ingress.kubernetes.io/proxy-connect-timeout"] = proxyTimeout + annotations["nginx.ingress.kubernetes.io/proxy-send-timeout"] = proxyTimeout + annotations["nginx.ingress.kubernetes.io/proxy-read-timeout"] = proxyTimeout + + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, ingressName, 50051, annotations) + + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, fmt.Sprintf("grpc_connect_timeout %ss;", proxyTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_send_timeout %ss;", proxyTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_read_timeout %ss;", proxyTimeout)) + }) + + conn, err := grpc.NewClient( + f.GetNginxIP()+":80", + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithAuthority(host), + ) + assert.Nil(ginkgo.GinkgoT(), err, "error creating a connection") + defer conn.Close() + + client := delaypb.NewGrpcbinServiceClient(conn) + + res, err := client.Unary(context.Background(), &delaypb.UnaryRequest{ + Data: "hello", + }) + assert.Nil(ginkgo.GinkgoT(), err) + + metadata := res.GetResponseAttributes().RequestHeaders + assert.Equal(ginkgo.GinkgoT(), metadata["content-type"], "application/grpc") + assert.Equal(ginkgo.GinkgoT(), metadata[":authority"], host) + }) + + ginkgo.It("should return Error when request exceed timeout", func() { + f.NewGRPCBinDelayDeployment() + + proxyTimeout := "10" + ingressName := "grpcbin-delay" + + annotations := make(map[string]string) + annotations["nginx.ingress.kubernetes.io/backend-protocol"] = "GRPC" + annotations["nginx.ingress.kubernetes.io/proxy-connect-timeout"] = proxyTimeout + annotations["nginx.ingress.kubernetes.io/proxy-send-timeout"] = proxyTimeout + annotations["nginx.ingress.kubernetes.io/proxy-read-timeout"] = proxyTimeout + + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, ingressName, 50051, annotations) + + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, fmt.Sprintf("grpc_connect_timeout %ss;", proxyTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_send_timeout %ss;", proxyTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_read_timeout %ss;", proxyTimeout)) + }) + + conn, err := grpc.NewClient( + f.GetNginxIP()+":80", + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithAuthority(host), + ) + assert.Nil(ginkgo.GinkgoT(), err, "error creating a connection") + defer conn.Close() + + client := delaypb.NewGrpcbinServiceClient(conn) + + _, err = client.Unary(context.Background(), &delaypb.UnaryRequest{ + Data: "hello", + RequestAttributes: &delaypb.RequestAttributes{ + Delay: 15, + }, + }) + assert.Error(ginkgo.GinkgoT(), err) + }) }) diff --git a/test/e2e/annotations/modsecurity/modsecurity.go b/test/e2e/annotations/modsecurity/modsecurity.go index a3e7d80ba..730fc76e7 100644 --- a/test/e2e/annotations/modsecurity/modsecurity.go +++ b/test/e2e/annotations/modsecurity/modsecurity.go @@ -100,14 +100,8 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { }) ginkgo.It("should enable modsecurity with snippet", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := modSecurityFooHost nameSpace := f.Namespace @@ -173,14 +167,8 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { }) ginkgo.It("should enable modsecurity with snippet and block requests", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := modSecurityFooHost nameSpace := f.Namespace @@ -212,14 +200,8 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { }) ginkgo.It("should enable modsecurity globally and with modsecurity-snippet block requests", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := modSecurityFooHost nameSpace := f.Namespace @@ -251,16 +233,11 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { }) ginkgo.It("should enable modsecurity when enable-owasp-modsecurity-crs is set to true", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - "enable-modsecurity": "true", - "enable-owasp-modsecurity-crs": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() + + f.UpdateNginxConfigMapData("enable-modsecurity", "true") + f.UpdateNginxConfigMapData("enable-owasp-modsecurity-crs", "true") host := modSecurityFooHost nameSpace := f.Namespace @@ -290,6 +267,8 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { }) ginkgo.It("should enable modsecurity through the config map", func() { + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := modSecurityFooHost nameSpace := f.Namespace @@ -310,17 +289,9 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { f.EnsureIngress(ing) expectedComment := "SecRuleEngine On" - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - "enable-modsecurity": "true", - "enable-owasp-modsecurity-crs": "true", - "modsecurity-snippet": expectedComment, - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + f.UpdateNginxConfigMapData("enable-modsecurity", "true") + f.UpdateNginxConfigMapData("enable-owasp-modsecurity-crs", "true") + f.UpdateNginxConfigMapData("modsecurity-snippet", expectedComment) f.WaitForNginxServer(host, func(server string) bool { @@ -339,6 +310,9 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { host := modSecurityFooHost nameSpace := f.Namespace + f.UpdateNginxConfigMapData("annotations-risk-level", "Critical") // To enable snippet configurations + defer f.UpdateNginxConfigMapData("annotations-risk-level", "High") + snippet := `SecRequestBodyAccess On SecAuditEngine RelevantOnly SecAuditLogParts ABIJDEFHZ @@ -378,14 +352,9 @@ var _ = framework.DescribeAnnotation("modsecurity owasp", func() { }) ginkgo.It("should disable default modsecurity conf setting when modsecurity-snippet is specified", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() + host := modSecurityFooHost nameSpace := f.Namespace diff --git a/test/e2e/annotations/proxy.go b/test/e2e/annotations/proxy.go index 235b828e7..8e9866021 100644 --- a/test/e2e/annotations/proxy.go +++ b/test/e2e/annotations/proxy.go @@ -160,11 +160,13 @@ var _ = framework.DescribeAnnotation("proxy-*", func() { proxyBuffering := "on" proxyBuffersNumber := "8" proxyBufferSize := "8k" + proxyBusyBuffersSize := "16k" annotations := make(map[string]string) annotations["nginx.ingress.kubernetes.io/proxy-buffering"] = proxyBuffering annotations["nginx.ingress.kubernetes.io/proxy-buffers-number"] = proxyBuffersNumber annotations["nginx.ingress.kubernetes.io/proxy-buffer-size"] = proxyBufferSize + annotations["nginx.ingress.kubernetes.io/proxy-busy-buffers-size"] = proxyBusyBuffersSize ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) f.EnsureIngress(ing) @@ -174,6 +176,7 @@ var _ = framework.DescribeAnnotation("proxy-*", func() { return strings.Contains(server, fmt.Sprintf("proxy_buffering %s;", proxyBuffering)) && strings.Contains(server, fmt.Sprintf("proxy_buffer_size %s;", proxyBufferSize)) && strings.Contains(server, fmt.Sprintf("proxy_buffers %s %s;", proxyBuffersNumber, proxyBufferSize)) && + strings.Contains(server, fmt.Sprintf("proxy_busy_buffers_size %s;", proxyBusyBuffersSize)) && strings.Contains(server, fmt.Sprintf("proxy_request_buffering %s;", proxyBuffering)) }) }) diff --git a/test/e2e/annotations/proxyssl.go b/test/e2e/annotations/proxyssl.go index 989d681c1..898cbed48 100644 --- a/test/e2e/annotations/proxyssl.go +++ b/test/e2e/annotations/proxyssl.go @@ -47,7 +47,7 @@ var _ = framework.DescribeAnnotation("proxy-ssl-*", func() { ing := framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, f.Namespace, framework.EchoService, 80, annotations) f.EnsureIngress(ing) - assertProxySSL(f, host, "", "DEFAULT", "TLSv1 TLSv1.1 TLSv1.2", "off", 1, "") + assertProxySSL(f, host, "", "DEFAULT", "TLSv1.2", "off", 1, "") f.HTTPTestClient(). GET("/"). @@ -77,7 +77,7 @@ var _ = framework.DescribeAnnotation("proxy-ssl-*", func() { ing := framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, f.Namespace, framework.EchoService, 80, annotations) f.EnsureIngress(ing) - assertProxySSL(f, host, "", "DEFAULT", "TLSv1 TLSv1.1 TLSv1.2", "on", 2, "on") + assertProxySSL(f, host, "", "DEFAULT", "TLSv1.2", "on", 2, "on") f.HTTPTestClient(). GET("/"). @@ -105,7 +105,7 @@ var _ = framework.DescribeAnnotation("proxy-ssl-*", func() { ing := framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, f.Namespace, framework.EchoService, 80, annotations) f.EnsureIngress(ing) - assertProxySSL(f, host, "", "HIGH:!AES", "TLSv1 TLSv1.1 TLSv1.2", "off", 1, "") + assertProxySSL(f, host, "", "HIGH:!AES", "TLSv1.2", "off", 1, "") f.HTTPTestClient(). GET("/"). @@ -171,7 +171,7 @@ var _ = framework.DescribeAnnotation("proxy-ssl-*", func() { wlValue := "true" f.UpdateNginxConfigMapData(wlKey, wlValue) - assertProxySSL(f, host, secretName, "DEFAULT", "TLSv1 TLSv1.1 TLSv1.2", "on", 1, "on") + assertProxySSL(f, host, secretName, "DEFAULT", "TLSv1.2", "on", 1, "on") f.WaitForNginxCustomConfiguration("## start server proxyssl.com", "location ", func(server string) bool { return (!strings.Contains(server, "proxy_ssl_trusted_certificate") && diff --git a/test/e2e/annotations/relativeredirects.go b/test/e2e/annotations/relativeredirects.go new file mode 100644 index 000000000..430b357e4 --- /dev/null +++ b/test/e2e/annotations/relativeredirects.go @@ -0,0 +1,107 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package annotations + +import ( + "fmt" + "net/http" + "strings" + + "github.com/onsi/ginkgo/v2" + "github.com/stretchr/testify/assert" + "k8s.io/ingress-nginx/test/e2e/framework" +) + +const ( + relativeRedirectsHostname = "rr.foo.com" + relativeRedirectsRedirectPath = "/something" + relativeRedirectsRelativeRedirectURL = "/new-location" +) + +var _ = framework.DescribeAnnotation("relative-redirects", func() { + f := framework.NewDefaultFramework("relative-redirects") + + ginkgo.BeforeEach(func() { + f.NewHttpbunDeployment() + f.NewEchoDeployment() + }) + + ginkgo.It("configures Nginx correctly", func() { + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/relative-redirects": "true", + } + + ing := framework.NewSingleIngress(relativeRedirectsHostname, "/", relativeRedirectsHostname, f.Namespace, framework.HTTPBunService, 80, annotations) + f.EnsureIngress(ing) + + var serverConfig string + f.WaitForNginxServer(relativeRedirectsHostname, func(srvCfg string) bool { + serverConfig = srvCfg + return strings.Contains(serverConfig, fmt.Sprintf("server_name %s", relativeRedirectsHostname)) + }) + + ginkgo.By("turning off absolute_redirect directive") + assert.Contains(ginkgo.GinkgoT(), serverConfig, "absolute_redirect off;") + }) + + ginkgo.It("should respond with absolute URL in Location", func() { + absoluteRedirectURL := fmt.Sprintf("http://%s%s", relativeRedirectsHostname, relativeRedirectsRelativeRedirectURL) + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/permanent-redirect": relativeRedirectsRelativeRedirectURL, + "nginx.ingress.kubernetes.io/relative-redirects": "false", + } + + ginkgo.By("setup ingress") + ing := framework.NewSingleIngress(relativeRedirectsHostname, relativeRedirectsRedirectPath, relativeRedirectsHostname, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(relativeRedirectsHostname, func(srvCfg string) bool { + return strings.Contains(srvCfg, fmt.Sprintf("server_name %s", relativeRedirectsHostname)) + }) + + ginkgo.By("sending request to redirected URL path") + f.HTTPTestClient(). + GET(relativeRedirectsRedirectPath). + WithHeader("Host", relativeRedirectsHostname). + Expect(). + Status(http.StatusMovedPermanently). + Header("Location").Equal(absoluteRedirectURL) + }) + + ginkgo.It("should respond with relative URL in Location", func() { + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/permanent-redirect": relativeRedirectsRelativeRedirectURL, + "nginx.ingress.kubernetes.io/relative-redirects": "true", + } + + ginkgo.By("setup ingress") + ing := framework.NewSingleIngress(relativeRedirectsHostname, relativeRedirectsRedirectPath, relativeRedirectsHostname, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(relativeRedirectsHostname, func(srvCfg string) bool { + return strings.Contains(srvCfg, fmt.Sprintf("server_name %s", relativeRedirectsHostname)) + }) + + ginkgo.By("sending request to redirected URL path") + f.HTTPTestClient(). + GET(relativeRedirectsRedirectPath). + WithHeader("Host", relativeRedirectsHostname). + Expect(). + Status(http.StatusMovedPermanently). + Header("Location").Equal(relativeRedirectsRelativeRedirectURL) + }) +}) diff --git a/test/e2e/annotations/serversnippet.go b/test/e2e/annotations/serversnippet.go index 1195b728a..c94960a3d 100644 --- a/test/e2e/annotations/serversnippet.go +++ b/test/e2e/annotations/serversnippet.go @@ -33,14 +33,8 @@ var _ = framework.DescribeAnnotation("server-snippet", func() { }) ginkgo.It(`add valid directives to server via server snippet`, func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "serversnippet.foo.com" annotations := map[string]string{ @@ -68,14 +62,8 @@ var _ = framework.DescribeAnnotation("server-snippet", func() { }) ginkgo.It(`drops server snippet if disabled by the administrator`, func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + f.UpdateNginxConfigMapData("annotations-risk-level", "Critical") // To enable snippet configurations + defer f.UpdateNginxConfigMapData("annotations-risk-level", "High") host := "noserversnippet.foo.com" annotations := map[string]string{ @@ -85,11 +73,6 @@ var _ = framework.DescribeAnnotation("server-snippet", func() { } ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) - f.UpdateNginxConfigMapData("allow-snippet-annotations", "false") - defer func() { - // Return to the original value - f.UpdateNginxConfigMapData("allow-snippet-annotations", "true") - }() // Sleep a while just to guarantee that the configmap is applied framework.Sleep() f.EnsureIngress(ing) diff --git a/test/e2e/annotations/snippet.go b/test/e2e/annotations/snippet.go index 0c6148a4f..9e3160dcc 100644 --- a/test/e2e/annotations/snippet.go +++ b/test/e2e/annotations/snippet.go @@ -33,15 +33,8 @@ var _ = framework.DescribeAnnotation("configuration-snippet", func() { ginkgo.It("set snippet more_set_headers in all locations", func() { host := "configurationsnippet.foo.com" - - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() annotations := map[string]string{ "nginx.ingress.kubernetes.io/configuration-snippet": `more_set_headers "Foo1: Bar1";`, @@ -71,6 +64,8 @@ var _ = framework.DescribeAnnotation("configuration-snippet", func() { }) ginkgo.It("drops snippet more_set_header in all locations if disabled by admin", func() { + f.UpdateNginxConfigMapData("annotations-risk-level", "Critical") // To enable snippet configurations + defer f.UpdateNginxConfigMapData("annotations-risk-level", "High") host := "noconfigurationsnippet.foo.com" annotations := map[string]string{ "nginx.ingress.kubernetes.io/configuration-snippet": `more_set_headers "Foo1: Bar1";`, diff --git a/test/e2e/annotations/sslciphers.go b/test/e2e/annotations/sslciphers.go index 58010421d..aece7fc41 100644 --- a/test/e2e/annotations/sslciphers.go +++ b/test/e2e/annotations/sslciphers.go @@ -54,4 +54,27 @@ var _ = framework.DescribeAnnotation("ssl-ciphers", func() { Expect(). Status(http.StatusOK) }) + + ginkgo.It("should keep ssl ciphers", func() { + host := "ciphers.foo.com" + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/ssl-ciphers": "ALL:!aNULL:!EXPORT56:RC4+RSA@STRENGTH:+HIGH@SECLEVEL=0:+MEDIUM:+LOW:+SSLv2:+EXP", + "nginx.ingress.kubernetes.io/ssl-prefer-server-ciphers": "true", + } + + ing := framework.NewSingleIngress(host, "/something", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, "ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA@STRENGTH:+HIGH@SECLEVEL=0:+MEDIUM:+LOW:+SSLv2:+EXP;") && + strings.Contains(server, "ssl_prefer_server_ciphers on;") + }) + f.HTTPTestClient(). + GET("/something"). + WithURL(f.GetURL(framework.HTTPS)). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + }) }) diff --git a/test/e2e/annotations/streamsnippet.go b/test/e2e/annotations/streamsnippet.go index 432537b4a..f91cdc34e 100644 --- a/test/e2e/annotations/streamsnippet.go +++ b/test/e2e/annotations/streamsnippet.go @@ -39,14 +39,8 @@ var _ = framework.DescribeSetting("stream-snippet", func() { }) ginkgo.It("should add value of stream-snippet to nginx config", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "foo.com" diff --git a/test/e2e/cgroups/cgroups.go b/test/e2e/cgroups/cgroups.go new file mode 100644 index 000000000..eab194324 --- /dev/null +++ b/test/e2e/cgroups/cgroups.go @@ -0,0 +1,115 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cgroups + +import ( + "log" + "os" + "path/filepath" + + "github.com/onsi/ginkgo/v2" + "github.com/stretchr/testify/assert" + + "k8s.io/ingress-nginx/test/e2e/framework" + + "k8s.io/ingress-nginx/pkg/util/runtime" +) + +var _ = framework.IngressNginxDescribeSerial("[CGroups] cgroups", func() { + f := framework.NewDefaultFramework("cgroups") + + ginkgo.BeforeEach(func() { + f.NewEchoDeployment() + f.NewSlowEchoDeployment() + }) + + ginkgo.It("detects cgroups version v1", func() { + cgroupPath := "/testing/sys/fs/cgroup/" + if err := os.MkdirAll(cgroupPath, os.ModePerm); err != nil { + log.Fatal(err) + } + + quotaFile, err := os.Create(filepath.Join(cgroupPath, "cpu.cfs_quota_us")) + if err != nil { + log.Fatal(err) + } + + periodFile, err := os.Create(filepath.Join(cgroupPath, "cpu.cfs_period_us")) + if err != nil { + log.Fatal(err) + } + + _, err = quotaFile.WriteString("4") + if err != nil { + log.Fatal(err) + } + + err = quotaFile.Sync() + if err != nil { + log.Fatal(err) + } + + _, err = periodFile.WriteString("2") + if err != nil { + log.Fatal(err) + } + + err = periodFile.Sync() + if err != nil { + log.Fatal(err) + } + + assert.Equal(ginkgo.GinkgoT(), runtime.GetCgroupVersion(cgroupPath), int64(1)) + assert.Equal(ginkgo.GinkgoT(), runtime.NumCPUWithCustomPath(cgroupPath), 2) + + os.Remove(filepath.Join(cgroupPath, "cpu.cfs_quota_us")) + os.Remove(filepath.Join(cgroupPath, "cpu.cfs_period_us")) + }) + + ginkgo.It("detect cgroups version v2", func() { + cgroupPath := "/testing/sys/fs/cgroup/" + if err := os.MkdirAll(cgroupPath, os.ModePerm); err != nil { + log.Fatal(err) + } + + _, err := os.Create(filepath.Join(cgroupPath, "cgroup.controllers")) + if err != nil { + log.Fatal(err) + } + + file, err := os.Create(filepath.Join(cgroupPath, "cpu.max")) + if err != nil { + log.Fatal(err) + } + + _, err = file.WriteString("4 2") + if err != nil { + log.Fatal(err) + } + + err = file.Sync() + if err != nil { + log.Fatal(err) + } + + assert.Equal(ginkgo.GinkgoT(), runtime.GetCgroupVersion(cgroupPath), int64(2)) + assert.Equal(ginkgo.GinkgoT(), runtime.NumCPUWithCustomPath(cgroupPath), 2) + + os.Remove(filepath.Join(cgroupPath, "cpu.max")) + os.Remove(filepath.Join(cgroupPath, "cgroup.controllers")) + }) +}) diff --git a/test/e2e/disableleaderelection/disable_leader.go b/test/e2e/disableleaderelection/disable_leader.go new file mode 100644 index 000000000..fd7369dfb --- /dev/null +++ b/test/e2e/disableleaderelection/disable_leader.go @@ -0,0 +1,93 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package disableleaderelection + +import ( + "net/http" + "strings" + + "github.com/onsi/ginkgo/v2" + + "k8s.io/ingress-nginx/test/e2e/framework" +) + +var _ = framework.IngressNginxDescribe("[Disable Leader] Routing works when leader election was disabled", func() { + f := framework.NewDefaultFramework("disableleaderelection") + + ginkgo.BeforeEach(func() { + f.NewEchoDeployment() + }) + + ginkgo.It("should create multiple ingress routings rules when leader election has disabled", func() { + host1 := "leader.election.disabled.com" + host2 := "leader.election.disabled2.com" + + ing1 := framework.NewSingleIngress(host1, "/foo", host1, f.Namespace, framework.EchoService, 80, nil) + f.EnsureIngress(ing1) + + ing2 := framework.NewSingleIngress(host2, "/ping", host2, f.Namespace, framework.EchoService, 80, nil) + f.EnsureIngress(ing2) + + f.WaitForNginxServer(host1, + func(server string) bool { + return strings.Contains(server, host1) && + strings.Contains(server, "location /foo") + }) + + f.WaitForNginxServer(host2, + func(server string) bool { + return strings.Contains(server, host2) && + strings.Contains(server, "location /ping") + }) + + f.HTTPTestClient(). + GET("/foo"). + WithHeader("Host", host1). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/bar"). + WithHeader("Host", host1). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/foo"). + WithHeader("Host", host2). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/ping"). + WithHeader("Host", host2). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/pong"). + WithHeader("Host", host2). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/ping"). + WithHeader("Host", host1). + Expect(). + Status(http.StatusNotFound) + }) +}) diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index 25d714f88..9bf005164 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -32,8 +32,10 @@ import ( _ "k8s.io/ingress-nginx/test/e2e/admission" _ "k8s.io/ingress-nginx/test/e2e/annotations" _ "k8s.io/ingress-nginx/test/e2e/annotations/modsecurity" + _ "k8s.io/ingress-nginx/test/e2e/cgroups" _ "k8s.io/ingress-nginx/test/e2e/dbg" _ "k8s.io/ingress-nginx/test/e2e/defaultbackend" + _ "k8s.io/ingress-nginx/test/e2e/disableleaderelection" _ "k8s.io/ingress-nginx/test/e2e/endpointslices" _ "k8s.io/ingress-nginx/test/e2e/gracefulshutdown" _ "k8s.io/ingress-nginx/test/e2e/ingress" diff --git a/test/e2e/endpointslices/topology.go b/test/e2e/endpointslices/topology.go index 38c5f8b76..70f7ff86b 100644 --- a/test/e2e/endpointslices/topology.go +++ b/test/e2e/endpointslices/topology.go @@ -84,7 +84,7 @@ var _ = framework.IngressNginxDescribeSerial("[TopologyHints] topology aware rou } if gotHints { - // we have 2 replics, if there is just one backend it means that we are routing according slices hints to same zone as controller is + // we have 2 replicas, if there is just one backend it means that we are routing according slices hints to same zone as controller is assert.Equal(ginkgo.GinkgoT(), 1, gotBackends) } else { // two replicas should have two endpoints without topology hints diff --git a/test/e2e/framework/deployment.go b/test/e2e/framework/deployment.go index 08a5353b2..f213e2e98 100644 --- a/test/e2e/framework/deployment.go +++ b/test/e2e/framework/deployment.go @@ -43,11 +43,11 @@ const HTTPBunService = "httpbun" // NipService name of external service using nip.io const NIPService = "external-nip" -// HTTPBunImage is the default image that is used to deploy HTTPBun with the framwork +// HTTPBunImage is the default image that is used to deploy HTTPBun with the framework var HTTPBunImage = os.Getenv("HTTPBUN_IMAGE") // EchoImage is the default image to be used by the echo service -const EchoImage = "registry.k8s.io/ingress-nginx/e2e-test-echo@sha256:4938d1d91a2b7d19454460a8c1b010b89f6ff92d2987fd889ac3e8fc3b70d91a" //#nosec G101 +const EchoImage = "registry.k8s.io/ingress-nginx/e2e-test-echo:v1.1.1@sha256:a1e0152e2eeab26e3f6fd3986f3d82b17bc7711717cae5392dcd18dd447ba6ef" //#nosec G101 // TODO: change all Deployment functions to use these options // in order to reduce complexity and have a unified API across the diff --git a/test/e2e/framework/exec.go b/test/e2e/framework/exec.go index 9e4b55122..8d528c37a 100644 --- a/test/e2e/framework/exec.go +++ b/test/e2e/framework/exec.go @@ -102,7 +102,7 @@ func (f *Framework) NamespaceContent() (string, error) { } eout := strings.TrimSpace(execErr.String()) - if len(eout) > 0 { + if eout != "" { return "", fmt.Errorf("stderr: %v", eout) } @@ -117,11 +117,7 @@ func (f *Framework) newIngressController(namespace, namespaceOverlay string) err isChroot = "false" } - enableAnnotationValidations, ok := os.LookupEnv("ENABLE_VALIDATIONS") - if !ok { - enableAnnotationValidations = "false" - } - cmd := exec.Command("./wait-for-nginx.sh", namespace, namespaceOverlay, isChroot, enableAnnotationValidations) + cmd := exec.Command("./wait-for-nginx.sh", namespace, namespaceOverlay, isChroot) out, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("unexpected error waiting for ingress controller deployment: %v.\nLogs:\n%v", err, string(out)) diff --git a/test/e2e/framework/fastcgi_helloserver.go b/test/e2e/framework/fastcgi_helloserver.go index 73f9ef340..c414c4da3 100644 --- a/test/e2e/framework/fastcgi_helloserver.go +++ b/test/e2e/framework/fastcgi_helloserver.go @@ -59,7 +59,7 @@ func (f *Framework) NewNewFastCGIHelloServerDeploymentWithReplicas(replicas int3 Containers: []corev1.Container{ { Name: "fastcgi-helloserver", - Image: "registry.k8s.io/ingress-nginx/e2e-test-fastcgi-helloserver@sha256:0e08c836cc58f1ea862578de99b13bc4264fe071e816f96dc1d79857bfba7473", + Image: "registry.k8s.io/ingress-nginx/fastcgi-helloserver:v1.1.1@sha256:6af4d8c7745c6727aab759db616a58fd68d784d07ce7a32d1ad149c331fd9a6f", Env: []corev1.EnvVar{}, Ports: []corev1.ContainerPort{ { diff --git a/test/e2e/framework/framework.go b/test/e2e/framework/framework.go index b62ad691c..204da7df0 100644 --- a/test/e2e/framework/framework.go +++ b/test/e2e/framework/framework.go @@ -16,6 +16,7 @@ package framework import ( "context" "crypto/tls" + "encoding/json" "fmt" "net" "net/http" @@ -25,6 +26,7 @@ import ( "k8s.io/ingress-nginx/test/e2e/framework/httpexpect" "github.com/onsi/ginkgo/v2" + ginkgotypes "github.com/onsi/ginkgo/v2/types" "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -99,7 +101,7 @@ func NewDefaultFramework(baseName string, opts ...func(*Framework)) *Framework { } // NewSimpleFramework makes a new framework that allows the usage of a namespace -// for arbitraty tests. +// for arbitrary tests. func NewSimpleFramework(baseName string, opts ...func(*Framework)) *Framework { defer ginkgo.GinkgoRecover() @@ -178,7 +180,7 @@ func (f *Framework) AfterEach() { assert.Nil(ginkgo.GinkgoT(), err, "deleting IngressClass") }(f.KubeClientSet, f.IngressClass) - if !ginkgo.CurrentSpecReport().Failed() { + if !ginkgo.CurrentSpecReport().Failed() || ginkgo.CurrentSpecReport().State.Is(ginkgotypes.SpecStateInterrupted) { return } @@ -282,6 +284,15 @@ func (f *Framework) WaitForNginxConfiguration(matcher func(cfg string) bool) { Sleep(1 * time.Second) } +// WaitForLuaConfiguration waits until the nginx configuration contains a particular configuration +// `cfg` passed to matcher is normalized by replacing all tabs and spaces with single space. +func (f *Framework) WaitForLuaConfiguration(matcher func(jsonCfg map[string]interface{}) bool) { + //nolint:staticcheck // TODO: will replace it since wait.Poll is deprecated + err := wait.Poll(Poll, DefaultTimeout, f.matchLuaConditions(matcher)) + assert.Nil(ginkgo.GinkgoT(), err, "waiting for nginx lua configuration condition/s") + Sleep(1 * time.Second) +} + // WaitForNginxCustomConfiguration waits until the nginx configuration given part (from, to) contains a particular configuration func (f *Framework) WaitForNginxCustomConfiguration(from, to string, matcher func(cfg string) bool) { //nolint:staticcheck // TODO: will replace it since wait.Poll is deprecated @@ -312,7 +323,7 @@ func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) b return false, nil } - if klog.V(10).Enabled() && len(o) > 0 { + if klog.V(10).Enabled() && o != "" { klog.InfoS("NGINX", "configuration", o) } @@ -325,6 +336,29 @@ func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) b } } +func (f *Framework) matchLuaConditions(matcher func(jsonCfg map[string]interface{}) bool) wait.ConditionFunc { + return func() (bool, error) { + cmd := "cat /etc/nginx/lua/cfg.json" + + o, err := f.ExecCommand(f.pod, cmd) + if err != nil { + return false, nil + } + + if klog.V(10).Enabled() && o != "" { + klog.InfoS("Lua", "configuration", o) + } + + luaConfig := make(map[string]interface{}) // Use unstructured so we can walk through JSON + if err := json.Unmarshal([]byte(o), &luaConfig); err != nil { + return false, err + } + + // passes the lua interface to the function + return matcher(luaConfig), nil + } +} + func (f *Framework) matchNginxCustomConditions(from, to string, matcher func(cfg string) bool) wait.ConditionFunc { return func() (bool, error) { cmd := fmt.Sprintf("cat /etc/nginx/nginx.conf| awk '/%v/,/%v/'", from, to) @@ -334,7 +368,7 @@ func (f *Framework) matchNginxCustomConditions(from, to string, matcher func(cfg return false, nil } - if klog.V(10).Enabled() && len(o) > 0 { + if klog.V(10).Enabled() && o != "" { klog.InfoS("NGINX", "configuration", o) } @@ -382,6 +416,20 @@ func (f *Framework) SetNginxConfigMapData(cmData map[string]string) { f.WaitForReload(fn) } +// SetNginxConfigMapData sets ingress-nginx's nginx-ingress-controller configMap data +func (f *Framework) AllowSnippetConfiguration() func() { + f.SetNginxConfigMapData(map[string]string{ + "allow-snippet-annotations": "true", + "annotations-risk-level": "Critical", // To enable snippet configurations + }) + return func() { + f.SetNginxConfigMapData(map[string]string{ + "allow-snippet-annotations": "false", + "annotations-risk-level": "High", + }) + } +} + // CreateConfigMap creates a new configmap in the current namespace func (f *Framework) CreateConfigMap(name string, data map[string]string) { _, err := f.KubeClientSet.CoreV1().ConfigMaps(f.Namespace).Create(context.TODO(), &v1.ConfigMap{ @@ -500,7 +548,7 @@ func (f *Framework) newHTTPTestClient(config *tls.Config, setIngressURL bool) *h Transport: &http.Transport{ TLSClientConfig: config, }, - CheckRedirect: func(req *http.Request, via []*http.Request) error { + CheckRedirect: func(_ *http.Request, _ []*http.Request) error { return http.ErrUseLastResponse }, }, httpexpect.NewAssertReporter()) diff --git a/test/e2e/framework/grpc_delay.go b/test/e2e/framework/grpc_delay.go new file mode 100644 index 000000000..58d10b2e9 --- /dev/null +++ b/test/e2e/framework/grpc_delay.go @@ -0,0 +1,109 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package framework + +import ( + "github.com/onsi/ginkgo/v2" + "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/util/intstr" +) + +// NewGRPCBinDelayDeployment creates a new single replica +// deployment of the grpcbin image in a particular namespace +func (f *Framework) NewGRPCBinDelayDeployment() { + f.NewNewGRPCBinDelayDeploymentWithReplicas(1) +} + +// NewNewGRPCBinDelayDeploymentWithReplicas creates a new deployment of the +// grpcbin image in a particular namespace. Number of replicas is configurable +func (f *Framework) NewNewGRPCBinDelayDeploymentWithReplicas(replicas int32) { + name := "grpcbin-delay" + + deployment := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: f.Namespace, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: NewInt32(replicas), + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": name, + }, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": name, + }, + }, + Spec: corev1.PodSpec{ + TerminationGracePeriodSeconds: NewInt64(0), + Containers: []corev1.Container{ + { + Name: name, + Image: "ghcr.io/anddd7/grpcbin:v1.0.6", + Env: []corev1.EnvVar{}, + Ports: []corev1.ContainerPort{ + { + Name: "grpc", + ContainerPort: 50051, + }, + }, + }, + }, + }, + }, + }, + } + + d := f.EnsureDeployment(deployment) + + err := waitForPodsReady(f.KubeClientSet, DefaultTimeout, int(replicas), f.Namespace, &metav1.ListOptions{ + LabelSelector: fields.SelectorFromSet(fields.Set(d.Spec.Template.ObjectMeta.Labels)).String(), + }) + assert.Nil(ginkgo.GinkgoT(), err, "failed to wait for to become ready") + + service := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: f.Namespace, + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Name: "grpc", + Port: 50051, + TargetPort: intstr.FromInt(50051), + Protocol: "TCP", + }, + }, + Selector: map[string]string{ + "app": name, + }, + }, + } + + f.EnsureService(service) + + err = WaitForEndpoints(f.KubeClientSet, DefaultTimeout, name, f.Namespace, int(replicas)) + assert.Nil(ginkgo.GinkgoT(), err, "waiting for endpoints to become ready") +} diff --git a/test/e2e/framework/httpexpect/request.go b/test/e2e/framework/httpexpect/request.go index 0ae85dd79..4daba136e 100644 --- a/test/e2e/framework/httpexpect/request.go +++ b/test/e2e/framework/httpexpect/request.go @@ -93,7 +93,7 @@ func (h *HTTPRequest) ForceResolve(ip string, port uint16) *HTTPRequest { return h } newTransport := oldTransport.Clone() - newTransport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { + newTransport.DialContext = func(ctx context.Context, network, _ string) (net.Conn, error) { return dialer.DialContext(ctx, network, resolveAddr) } h.client.Transport = newTransport diff --git a/test/e2e/framework/httpexpect/response.go b/test/e2e/framework/httpexpect/response.go index 1c7624752..e324e94ff 100644 --- a/test/e2e/framework/httpexpect/response.go +++ b/test/e2e/framework/httpexpect/response.go @@ -234,6 +234,7 @@ func (r *HTTPResponse) checkContentType(expectedType string, expectedCharset ... } if mediaType != expectedType { + //nolint:goconst //string interpolation r.chain.fail("\nexpected \"Content-Type\" header with %q media type,"+ "\nbut got %q", expectedType, mediaType) return false diff --git a/test/e2e/gracefulshutdown/shutdown.go b/test/e2e/gracefulshutdown/shutdown.go index 604143da8..e9883338f 100644 --- a/test/e2e/gracefulshutdown/shutdown.go +++ b/test/e2e/gracefulshutdown/shutdown.go @@ -37,7 +37,7 @@ var _ = framework.IngressNginxDescribe("[Shutdown] ingress controller", func() { f.NewSlowEchoDeployment() }) - ginkgo.It("should shutdown in less than 60 secons without pending connections", func() { + ginkgo.It("should shutdown in less than 60 seconds without pending connections", func() { f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.Namespace, framework.SlowEchoService, 80, nil)) f.WaitForNginxServer(host, diff --git a/test/e2e/ingress/multiple_rules.go b/test/e2e/ingress/multiple_rules.go index f44b2f8dd..9247dc1d3 100644 --- a/test/e2e/ingress/multiple_rules.go +++ b/test/e2e/ingress/multiple_rules.go @@ -36,14 +36,8 @@ var _ = framework.IngressNginxDescribe("single ingress - multiple hosts", func() }) ginkgo.It("should set the correct $service_name NGINX variable", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() annotations := map[string]string{ "nginx.ingress.kubernetes.io/configuration-snippet": `more_set_input_headers "service-name: $service_name";`, diff --git a/test/e2e/ingress/pathtype_exact.go b/test/e2e/ingress/pathtype_exact.go index d0564cbf6..2660e32a4 100644 --- a/test/e2e/ingress/pathtype_exact.go +++ b/test/e2e/ingress/pathtype_exact.go @@ -35,14 +35,8 @@ var _ = framework.IngressNginxDescribe("[Ingress] [PathType] exact", func() { }) ginkgo.It("should choose exact location for /exact", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "exact.path" diff --git a/test/e2e/ingress/pathtype_mixed.go b/test/e2e/ingress/pathtype_mixed.go index e7bf2532e..3212089c9 100644 --- a/test/e2e/ingress/pathtype_mixed.go +++ b/test/e2e/ingress/pathtype_mixed.go @@ -37,14 +37,8 @@ var _ = framework.IngressNginxDescribe("[Ingress] [PathType] mix Exact and Prefi exactPathType := networking.PathTypeExact ginkgo.It("should choose the correct location", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "mixed.path" diff --git a/test/e2e/ingress/pathtype_prefix.go b/test/e2e/ingress/pathtype_prefix.go index fa664ce27..ce11ca8bf 100644 --- a/test/e2e/ingress/pathtype_prefix.go +++ b/test/e2e/ingress/pathtype_prefix.go @@ -68,4 +68,138 @@ var _ = framework.IngressNginxDescribe("[Ingress] [PathType] prefix checks", fun Expect(). Status(http.StatusOK) }) + + ginkgo.It("should test prefix path using simple regex pattern for /id/{int}", func() { + host := "echo.com.br" + + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/use-regex": `true`, + } + + ing := framework.NewSingleIngress(host, "/id/[0-9]+", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.HTTPTestClient(). + GET("/id/1"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/id/12"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/id/123"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/id/aaa"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/id/123a"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + }) + + ginkgo.It("should test prefix path using regex pattern for /id/{int} ignoring non-digits characters at end of string", func() { + host := "echo.regex.br" + + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/use-regex": `true`, + } + + ing := framework.NewSingleIngress(host, "/id/[0-9]+$", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.HTTPTestClient(). + GET("/id/1"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/id/aaa"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/id/123a"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + }) + + ginkgo.It("should test prefix path using fixed path size regex pattern /id/{int}{3}", func() { + host := "echo.regex.size.br" + + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/use-regex": `true`, + } + + ing := framework.NewSingleIngress(host, "/id/[0-9]{3}$", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.HTTPTestClient(). + GET("/id/99"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/id/123"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/id/9999"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/id/123a"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + }) + + ginkgo.It("should correctly route multi-segment path patterns", func() { + host := "echo.multi.segment.br" + + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/use-regex": `true`, + } + + ing := framework.NewSingleIngress(host, "/id/[0-9]+/post/[a-zA-Z]+$", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.HTTPTestClient(). + GET("/id/123/post/abc"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + + f.HTTPTestClient(). + GET("/id/123/post/abc123"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + + f.HTTPTestClient(). + GET("/id/abc/post/abc"). + WithHeader("Host", host). + Expect(). + Status(http.StatusNotFound) + }) }) diff --git a/test/e2e/lua/dynamic_configuration.go b/test/e2e/lua/dynamic_configuration.go index 8ec1ef839..a5e2196ce 100644 --- a/test/e2e/lua/dynamic_configuration.go +++ b/test/e2e/lua/dynamic_configuration.go @@ -48,12 +48,7 @@ var _ = framework.IngressNginxDescribe("[Lua] dynamic configuration", func() { ginkgo.It("configures balancer Lua middleware correctly", func() { f.WaitForNginxConfiguration(func(cfg string) bool { - return strings.Contains(cfg, "balancer.init_worker()") && strings.Contains(cfg, "balancer.balance()") - }) - - host := "foo.com" - f.WaitForNginxServer(host, func(server string) bool { - return strings.Contains(server, "balancer.rewrite()") && strings.Contains(server, "balancer.log()") + return strings.Contains(cfg, "balancer_by_lua_file /etc/nginx/lua/nginx/ngx_conf_balancer.lua") }) }) diff --git a/test/e2e/metrics/metrics.go b/test/e2e/metrics/metrics.go index 907b53732..bec09bb37 100644 --- a/test/e2e/metrics/metrics.go +++ b/test/e2e/metrics/metrics.go @@ -36,6 +36,7 @@ const waitForMetrics = 2 * time.Second var _ = framework.IngressNginxDescribe("[metrics] exported prometheus metrics", func() { f := framework.NewDefaultFramework("metrics") host := "foo.com" + wildcardHost := "wildcard." + host ginkgo.BeforeEach(func() { f.NewEchoDeployment() @@ -91,4 +92,50 @@ var _ = framework.IngressNginxDescribe("[metrics] exported prometheus metrics", assert.Nil(ginkgo.GinkgoT(), err) assert.NotNil(ginkgo.GinkgoT(), mf) }) + ginkgo.It("request metrics per undefined host are present when flag is set", func() { + err := f.UpdateIngressControllerDeployment(func(deployment *appsv1.Deployment) error { + args := deployment.Spec.Template.Spec.Containers[0].Args + args = append(args, "--metrics-per-undefined-host=true") + deployment.Spec.Template.Spec.Containers[0].Args = args + _, err := f.KubeClientSet.AppsV1().Deployments(f.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) + return err + }) + assert.Nil(ginkgo.GinkgoT(), err, "updating deployment") + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", wildcardHost). + Expect(). + Status(http.StatusNotFound) + time.Sleep(waitForMetrics) + + ip := f.GetNginxPodIP() + reqMetrics, err := f.GetMetric("nginx_ingress_controller_requests", ip) + assert.Nil(ginkgo.GinkgoT(), err) + assert.NotNil(ginkgo.GinkgoT(), reqMetrics.Metric) + assert.Len(ginkgo.GinkgoT(), reqMetrics.Metric, 1) + + containedLabel := false + for _, label := range reqMetrics.Metric[0].Label { + if *label.Name == "host" && *label.Value == wildcardHost { + containedLabel = true + break + } + } + + assert.Truef(ginkgo.GinkgoT(), containedLabel, "expected reqMetrics to contain label with \"name\"=\"host\" \"value\"=%q, but it did not: %s", wildcardHost, reqMetrics.String()) + }) + ginkgo.It("request metrics per undefined host are not present when flag is not set", func() { + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", wildcardHost). + Expect(). + Status(http.StatusNotFound) + time.Sleep(waitForMetrics) + + ip := f.GetNginxPodIP() + reqMetrics, err := f.GetMetric("nginx_ingress_controller_requests", ip) + assert.EqualError(ginkgo.GinkgoT(), err, "there is no metric with name nginx_ingress_controller_requests") + assert.Nil(ginkgo.GinkgoT(), reqMetrics) + }) }) diff --git a/test/e2e/run-chart-test.sh b/test/e2e/run-chart-test.sh index 6df4fb1e7..7e3f2fe9b 100755 --- a/test/e2e/run-chart-test.sh +++ b/test/e2e/run-chart-test.sh @@ -62,7 +62,7 @@ export KUBECONFIG="${KUBECONFIG:-$HOME/.kube/kind-config-$KIND_CLUSTER_NAME}" if [ "${SKIP_CLUSTER_CREATION:-false}" = "false" ]; then echo "[dev-env] creating Kubernetes cluster with kind" - export K8S_VERSION=${K8S_VERSION:-v1.26.3@sha256:61b92f38dff6ccc29969e7aa154d34e38b89443af1a2c14e6cfbd2df6419c66f} + export K8S_VERSION=${K8S_VERSION:-v1.32.0@sha256:c48c62eac5da28cdadcf560d1d8616cfa6783b58f0d94cf63ad1bf49600cb027} kind create cluster \ --verbosity=${KIND_LOG_LEVEL} \ @@ -78,7 +78,7 @@ fi if [ "${SKIP_IMAGE_CREATION:-false}" = "false" ]; then if ! command -v ginkgo &> /dev/null; then - go install github.com/onsi/ginkgo/v2/ginkgo@v2.9.5 + go install github.com/onsi/ginkgo/v2/ginkgo@v2.22.2 fi echo "[dev-env] building image" make -C ${DIR}/../../ clean-image build image @@ -91,26 +91,28 @@ echo "[dev-env] copying docker images to cluster..." kind load docker-image --name="${KIND_CLUSTER_NAME}" --nodes=${KIND_WORKERS} ${REGISTRY}/controller:${TAG} if [ "${SKIP_CERT_MANAGER_CREATION:-false}" = "false" ]; then - curl -fsSL -o cmctl.tar.gz https://github.com/cert-manager/cert-manager/releases/download/v1.11.1/cmctl-linux-amd64.tar.gz - tar xzf cmctl.tar.gz - chmod +x cmctl - ./cmctl help - echo "[dev-env] apply cert-manager ..." - kubectl apply --wait -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml - kubectl wait --timeout=30s --for=condition=available deployment/cert-manager -n cert-manager - kubectl get validatingwebhookconfigurations cert-manager-webhook -ojson | jq '.webhooks[].clientConfig' - kubectl get endpoints -n cert-manager cert-manager-webhook - ./cmctl check api --wait=2m + echo "[dev-env] deploying cert-manager..." + + # Get OS & platform for downloading cmctl. + os="$(uname -o | tr "[:upper:]" "[:lower:]" | sed "s/gnu\///")" + platform="$(uname -m | sed "s/aarch64/arm64/;s/x86_64/amd64/")" + + # Download cmctl. Cannot validate checksum as OS & platform may vary. + curl --fail --location "https://github.com/cert-manager/cmctl/releases/download/v2.1.1/cmctl_${os}_${platform}.tar.gz" | tar --extract --gzip cmctl + + # Install cert-manager. + ./cmctl x install + ./cmctl check api --wait 1m fi echo "[dev-env] running helm chart e2e tests..." -# Uses a custom chart-testing image to avoid timeouts waiting for namespace deletion. -# The changes can be found here: https://github.com/aledbf/chart-testing/commit/41fe0ae0733d0c9a538099fb3cec522e888e3d82 -docker run --rm --interactive --network host \ - --name ct \ - --volume $KUBECONFIG:/root/.kube/config \ - --volume "${DIR}/../../":/workdir \ - --workdir /workdir \ - aledbf/chart-testing:v3.3.1-next ct install \ - --charts charts/ingress-nginx \ - --helm-extra-args "--timeout 60s" +docker run \ + --name ct \ + --volume "${KUBECONFIG}:/root/.kube/config:ro" \ + --volume "${DIR}/../../:/workdir" \ + --network host \ + --workdir /workdir \ + --entrypoint ct \ + --rm \ + registry.k8s.io/ingress-nginx/e2e-test-runner:v20250112-a188f4eb@sha256:043038b1e30e5a0b64f3f919f096c5c9488ac3f617ac094b07fb9db8215f9441 \ + install --charts charts/ingress-nginx diff --git a/test/e2e/run-e2e-suite.sh b/test/e2e/run-e2e-suite.sh index 015895e56..909368e96 100755 --- a/test/e2e/run-e2e-suite.sh +++ b/test/e2e/run-e2e-suite.sh @@ -78,7 +78,7 @@ kubectl run --rm \ --env="E2E_NODES=${E2E_NODES}" \ --env="FOCUS=${FOCUS}" \ --env="IS_CHROOT=${IS_CHROOT:-false}"\ - --env="ENABLE_VALIDATIONS=${ENABLE_VALIDATIONS:-false}"\ + --env="SKIP_OPENTELEMETRY_TESTS=${SKIP_OPENTELEMETRY_TESTS:-false}"\ --env="E2E_CHECK_LEAKS=${E2E_CHECK_LEAKS}" \ --env="NGINX_BASE_IMAGE=${NGINX_BASE_IMAGE}" \ --env="HTTPBUN_IMAGE=${HTTPBUN_IMAGE}" \ diff --git a/test/e2e/run-kind-e2e.sh b/test/e2e/run-kind-e2e.sh index 4dc1bddd0..e41d31afd 100755 --- a/test/e2e/run-kind-e2e.sh +++ b/test/e2e/run-kind-e2e.sh @@ -39,14 +39,13 @@ fi KIND_LOG_LEVEL="1" IS_CHROOT="${IS_CHROOT:-false}" -ENABLE_VALIDATIONS="${ENABLE_VALIDATIONS:-false}" export KIND_CLUSTER_NAME=${KIND_CLUSTER_NAME:-ingress-nginx-dev} DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Use 1.0.0-dev to make sure we use the latest configuration in the helm template export TAG=1.0.0-dev export ARCH=${ARCH:-amd64} export REGISTRY=ingress-controller -NGINX_BASE_IMAGE=$(cat "$DIR"/../../NGINX_BASE) +NGINX_BASE_IMAGE=${NGINX_BASE_IMAGE:-$(cat "$DIR"/../../NGINX_BASE)} export NGINX_BASE_IMAGE=$NGINX_BASE_IMAGE export DOCKER_CLI_EXPERIMENTAL=enabled export KUBECONFIG="${KUBECONFIG:-$HOME/.kube/kind-config-$KIND_CLUSTER_NAME}" @@ -64,7 +63,7 @@ echo "Running e2e with nginx base image ${NGINX_BASE_IMAGE}" if [ "${SKIP_CLUSTER_CREATION}" = "false" ]; then echo "[dev-env] creating Kubernetes cluster with kind" - export K8S_VERSION=${K8S_VERSION:-v1.26.3@sha256:61b92f38dff6ccc29969e7aa154d34e38b89443af1a2c14e6cfbd2df6419c66f} + export K8S_VERSION=${K8S_VERSION:-v1.32.0@sha256:c48c62eac5da28cdadcf560d1d8616cfa6783b58f0d94cf63ad1bf49600cb027} # delete the cluster if it exists if kind get clusters | grep "${KIND_CLUSTER_NAME}"; then @@ -85,10 +84,10 @@ fi if [ "${SKIP_INGRESS_IMAGE_CREATION}" = "false" ]; then echo "[dev-env] building image" if [ "${IS_CHROOT}" = "true" ]; then - make -C "${DIR}"/../../ clean-image build image-chroot + make BASE_IMAGE="${NGINX_BASE_IMAGE}" -C "${DIR}"/../../ clean-image build image-chroot docker tag ${REGISTRY}/controller-chroot:${TAG} ${REGISTRY}/controller:${TAG} else - make -C "${DIR}"/../../ clean-image build image + make BASE_IMAGE="${NGINX_BASE_IMAGE}" -C "${DIR}"/../../ clean-image build image fi echo "[dev-env] .. done building controller images" @@ -96,7 +95,7 @@ fi if [ "${SKIP_E2E_IMAGE_CREATION}" = "false" ]; then if ! command -v ginkgo &> /dev/null; then - go install github.com/onsi/ginkgo/v2/ginkgo@v2.9.5 + go install github.com/onsi/ginkgo/v2/ginkgo@v2.22.2 fi echo "[dev-env] .. done building controller images" diff --git a/test/e2e/settings/badannotationvalues.go b/test/e2e/settings/badannotationvalues.go index f61b5bada..aa9906909 100644 --- a/test/e2e/settings/badannotationvalues.go +++ b/test/e2e/settings/badannotationvalues.go @@ -34,14 +34,8 @@ var _ = framework.DescribeAnnotation("Bad annotation values", func() { }) ginkgo.It("[BAD_ANNOTATIONS] should drop an ingress if there is an invalid character in some annotation", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "invalid-value-test" annotations := map[string]string{ @@ -50,7 +44,6 @@ var _ = framework.DescribeAnnotation("Bad annotation values", func() { } ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) - f.UpdateNginxConfigMapData("allow-snippet-annotations", "true") f.UpdateNginxConfigMapData("annotation-value-word-blocklist", "something_forbidden,otherthing_forbidden,{") f.EnsureIngress(ing) @@ -73,14 +66,8 @@ var _ = framework.DescribeAnnotation("Bad annotation values", func() { }) ginkgo.It("[BAD_ANNOTATIONS] should drop an ingress if there is a forbidden word in some annotation", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "forbidden-value-test" @@ -93,7 +80,6 @@ var _ = framework.DescribeAnnotation("Bad annotation values", func() { } ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) - f.UpdateNginxConfigMapData("allow-snippet-annotations", "true") f.UpdateNginxConfigMapData("annotation-value-word-blocklist", "something_forbidden,otherthing_forbidden,content_by_lua_block") // Sleep a while just to guarantee that the configmap is applied framework.Sleep() @@ -117,14 +103,9 @@ var _ = framework.DescribeAnnotation("Bad annotation values", func() { }) ginkgo.It("[BAD_ANNOTATIONS] should allow an ingress if there is a default blocklist config in place", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() + hostValid := "custom-allowed-value-test" annotationsValid := map[string]string{ "nginx.ingress.kubernetes.io/configuration-snippet": ` @@ -155,14 +136,8 @@ var _ = framework.DescribeAnnotation("Bad annotation values", func() { }) ginkgo.It("[BAD_ANNOTATIONS] should drop an ingress if there is a custom blocklist config in place and allow others to pass", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() host := "custom-forbidden-value-test" annotations := map[string]string{ diff --git a/test/e2e/settings/disable_sync_events.go b/test/e2e/settings/disable_sync_events.go index 033fd9194..0d55c96e4 100644 --- a/test/e2e/settings/disable_sync_events.go +++ b/test/e2e/settings/disable_sync_events.go @@ -44,6 +44,7 @@ var _ = framework.IngressNginxDescribe("[Flag] disable-sync-events", func() { return strings.Contains(server, fmt.Sprintf("server_name %v", host)) }) + //nolint:goconst //string interpolation events, err := f.KubeClientSet.CoreV1().Events(ing.Namespace).List(context.TODO(), metav1.ListOptions{FieldSelector: "reason=Sync,involvedObject.name=" + host}) assert.Nil(ginkgo.GinkgoT(), err, "listing events") diff --git a/test/e2e/settings/enable_real_ip.go b/test/e2e/settings/enable_real_ip.go index 778011b9f..bf16e1ea0 100644 --- a/test/e2e/settings/enable_real_ip.go +++ b/test/e2e/settings/enable_real_ip.go @@ -47,6 +47,7 @@ var _ = framework.DescribeSetting("enable-real-ip", func() { f.WaitForNginxServer(host, func(server string) bool { + //nolint:goconst //already a const return strings.Contains(server, "server_name "+host) && !strings.Contains(server, "proxy_set_header X-Forwarded-Proto $full_x_forwarded_proto;") }) diff --git a/test/e2e/settings/geoip2.go b/test/e2e/settings/geoip2.go index e37286d5c..9c6d59dc5 100644 --- a/test/e2e/settings/geoip2.go +++ b/test/e2e/settings/geoip2.go @@ -54,7 +54,7 @@ var _ = framework.DescribeSetting("Geoip2", func() { }) assert.Nil(ginkgo.GinkgoT(), err, "updating ingress controller deployment flags") - filename := fmt.Sprintf("/etc/nginx/geoip/%s.mmdb", edition) + filename := fmt.Sprintf("/etc/ingress-controller/geoip/%s.mmdb", edition) exec, err := f.ExecIngressPod(fmt.Sprintf(`sh -c "mkdir -p '%s' && wget -O '%s' '%s' 2>&1"`, filepath.Dir(filename), filename, testdataURL)) framework.Logf(exec) assert.Nil(ginkgo.GinkgoT(), err, fmt.Sprintln("error downloading test geoip2 db", filename)) @@ -69,15 +69,9 @@ var _ = framework.DescribeSetting("Geoip2", func() { ginkgo.It("should only allow requests from specific countries", func() { ginkgo.Skip("GeoIP test are temporarily disabled") - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - "use-geoip2": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() + f.UpdateNginxConfigMapData("use-geoip2", "true") httpSnippetAllowingOnlyAustralia := `map $geoip2_city_country_code $blocked_country { default 1; @@ -124,4 +118,52 @@ var _ = framework.DescribeSetting("Geoip2", func() { Expect(). Status(http.StatusOK) }) + + ginkgo.It("should up and running nginx controller using autoreload flag", func() { + edition := "GeoLite2-Country" + + err := f.UpdateIngressControllerDeployment(func(deployment *appsv1.Deployment) error { + args := deployment.Spec.Template.Spec.Containers[0].Args + args = append(args, "--maxmind-edition-ids="+edition) + deployment.Spec.Template.Spec.Containers[0].Args = args + _, err := f.KubeClientSet.AppsV1().Deployments(f.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) + return err + }) + assert.Nil(ginkgo.GinkgoT(), err, "updating ingress controller deployment flags") + + filename := fmt.Sprintf("/etc/ingress-controller/geoip/%s.mmdb", edition) + exec, err := f.ExecIngressPod(fmt.Sprintf(`sh -c "mkdir -p '%s' && wget -O '%s' '%s' 2>&1"`, filepath.Dir(filename), filename, testdataURL)) + framework.Logf(exec) + assert.Nil(ginkgo.GinkgoT(), err, fmt.Sprintln("error downloading test geoip2 db", filename)) + + f.SetNginxConfigMapData(map[string]string{ + "use-geoip2": "true", + "geoip2-autoreload-in-minutes": "5", + }) + + // Check Configmap Autoreload Patterns + f.WaitForNginxConfiguration( + func(cfg string) bool { + return strings.Contains(cfg, fmt.Sprintf("geoip2 %s", filename)) && + strings.Contains(cfg, "auto_reload 5m;") + }, + ) + + // Check if Nginx could up, running and routing with auto_reload configs + host := "ping.com" + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, nil) + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, host) && + strings.Contains(server, "location /") + }) + + f.HTTPTestClient(). + GET("/"). + WithHeader("Host", host). + Expect(). + Status(http.StatusOK) + }) }) diff --git a/test/e2e/settings/global_external_auth.go b/test/e2e/settings/global_external_auth.go index 741e6f955..f589a63e9 100644 --- a/test/e2e/settings/global_external_auth.go +++ b/test/e2e/settings/global_external_auth.go @@ -32,8 +32,8 @@ import ( ) const ( - disable = "false" - noAuthLocaltionSetting = "no-auth-locations" + disable = "false" + noAuthLocationSetting = "no-auth-locations" ) var _ = framework.DescribeSetting("[Security] global-auth-url", func() { @@ -51,7 +51,7 @@ var _ = framework.DescribeSetting("[Security] global-auth-url", func() { fooPath := "/foo" barPath := "/bar" - noAuthSetting := noAuthLocaltionSetting + noAuthSetting := noAuthLocationSetting noAuthLocations := barPath enableGlobalExternalAuthAnnotation := "nginx.ingress.kubernetes.io/enable-global-auth" diff --git a/test/e2e/settings/globalratelimit.go b/test/e2e/settings/globalratelimit.go deleted file mode 100644 index e266350ad..000000000 --- a/test/e2e/settings/globalratelimit.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package settings - -import ( - "fmt" - "net/http" - "strconv" - "strings" - - "github.com/onsi/ginkgo/v2" - "github.com/stretchr/testify/assert" - "k8s.io/ingress-nginx/test/e2e/framework" -) - -var _ = framework.DescribeSetting("settings-global-rate-limit", func() { - f := framework.NewDefaultFramework("global-rate-limit") - host := "global-rate-limit" - - ginkgo.BeforeEach(func() { - f.NewEchoDeployment() - }) - - ginkgo.It("generates correct NGINX configuration", func() { - annotations := make(map[string]string) - ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) - f.EnsureIngress(ing) - - ginkgo.By("generating correct defaults") - - ngxCfg := "" - f.WaitForNginxConfiguration(func(cfg string) bool { - if strings.Contains(cfg, "global_throttle") { - ngxCfg = cfg - return true - } - return false - }) - - assert.Contains(ginkgo.GinkgoT(), ngxCfg, fmt.Sprintf(`global_throttle = { `+ - `memcached = { host = "%v", port = %d, connect_timeout = %d, max_idle_timeout = %d, `+ - `pool_size = %d, }, status_code = %d, }`, - "", 11211, 50, 10000, 50, 429)) - - f.HTTPTestClient().GET("/").WithHeader("Host", host).Expect().Status(http.StatusOK) - - ginkgo.By("applying customizations") - - memcachedHost := "memc.default.svc.cluster.local" - memcachedPort := 11211 - memcachedConnectTimeout := 100 - memcachedMaxIdleTimeout := 5000 - memcachedPoolSize := 100 - statusCode := 503 - - f.SetNginxConfigMapData(map[string]string{ - "global-rate-limit-memcached-host": memcachedHost, - "global-rate-limit-memcached-port": strconv.Itoa(memcachedPort), - "global-rate-limit-memcached-connect-timeout": strconv.Itoa(memcachedConnectTimeout), - "global-rate-limit-memcached-max-idle-timeout": strconv.Itoa(memcachedMaxIdleTimeout), - "global-rate-limit-memcached-pool-size": strconv.Itoa(memcachedPoolSize), - "global-rate-limit-status-code": strconv.Itoa(statusCode), - }) - - ngxCfg = "" - f.WaitForNginxConfiguration(func(cfg string) bool { - if strings.Contains(cfg, "global_throttle") { - ngxCfg = cfg - return true - } - return false - }) - - assert.Contains(ginkgo.GinkgoT(), ngxCfg, fmt.Sprintf(`global_throttle = { `+ - `memcached = { host = "%v", port = %d, connect_timeout = %d, max_idle_timeout = %d, `+ - `pool_size = %d, }, status_code = %d, }`, - memcachedHost, memcachedPort, memcachedConnectTimeout, memcachedMaxIdleTimeout, - memcachedPoolSize, statusCode)) - - f.HTTPTestClient().GET("/").WithHeader("Host", host).Expect().Status(http.StatusOK) - }) -}) diff --git a/test/e2e/settings/grpc.go b/test/e2e/settings/grpc.go new file mode 100644 index 000000000..ae3175034 --- /dev/null +++ b/test/e2e/settings/grpc.go @@ -0,0 +1,110 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package settings + +import ( + "context" + "crypto/tls" + "fmt" + "strings" + + pb "github.com/moul/pb/grpcbin/go-grpc" + "github.com/onsi/ginkgo/v2" + "github.com/stretchr/testify/assert" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + + "k8s.io/ingress-nginx/test/e2e/framework" +) + +const echoHost = "echo" + +var _ = framework.DescribeSetting("GRPC", func() { + f := framework.NewDefaultFramework("grpc-buffersize", framework.WithHTTPBunEnabled()) + + ginkgo.It("should set the correct GRPC Buffer Size", func() { + f.SetNginxConfigMapData(map[string]string{ + "grpc-buffer-size-kb": "8", + }) + + f.WaitForNginxConfiguration( + func(cfg string) bool { + return strings.Contains(cfg, "grpc_buffer_size 8k") + }) + + f.NewGRPCBinDeployment() + + host := echoHost + + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "grpcbin-test", + Namespace: f.Namespace, + }, + Spec: corev1.ServiceSpec{ + ExternalName: fmt.Sprintf("grpcbin.%v.svc.cluster.local", f.Namespace), + Type: corev1.ServiceTypeExternalName, + Ports: []corev1.ServicePort{ + { + Name: host, + Port: 9000, + TargetPort: intstr.FromInt(9000), + Protocol: "TCP", + }, + }, + }, + } + f.EnsureService(svc) + + annotations := map[string]string{ + "nginx.ingress.kubernetes.io/backend-protocol": "GRPC", + } + + ing := framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, f.Namespace, "grpcbin-test", 9000, annotations) + + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, "grpc_pass grpc://upstream_balancer;") + }) + + conn, err := grpc.NewClient(f.GetNginxIP()+":443", + grpc.WithTransportCredentials( + credentials.NewTLS(&tls.Config{ + ServerName: echoHost, + InsecureSkipVerify: true, //nolint:gosec // Ignore certificate validation in testing + }), + ), + ) + assert.Nil(ginkgo.GinkgoT(), err, "error creating a connection") + defer conn.Close() + + client := pb.NewGRPCBinClient(conn) + ctx := context.Background() + + res, err := client.HeadersUnary(ctx, &pb.EmptyMessage{}) + assert.Nil(ginkgo.GinkgoT(), err) + + metadata := res.GetMetadata() + assert.Equal(ginkgo.GinkgoT(), metadata["content-type"].Values[0], "application/grpc") + assert.Equal(ginkgo.GinkgoT(), metadata[":authority"].Values[0], host) + }) +}) diff --git a/test/e2e/settings/gzip.go b/test/e2e/settings/gzip.go index 68e80d3a0..c7e580e07 100644 --- a/test/e2e/settings/gzip.go +++ b/test/e2e/settings/gzip.go @@ -18,6 +18,7 @@ package settings import ( "fmt" + "net/http" "strings" "github.com/onsi/ginkgo/v2" @@ -29,11 +30,27 @@ import ( var _ = framework.DescribeSetting("gzip", func() { f := framework.NewDefaultFramework("gzip") + host := "gzip" + + ginkgo.BeforeEach(func() { + f.NewHttpbunDeployment() + f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.Namespace, framework.HTTPBunService, 80, nil)) + }) + ginkgo.It("should be disabled by default", func() { f.WaitForNginxConfiguration( func(cfg string) bool { return !strings.Contains(cfg, "gzip on;") - }) + }, + ) + + f.HTTPTestClient(). + GET("/xml"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentEncoding() }) ginkgo.It("should be enabled with default settings", func() { @@ -50,7 +67,16 @@ var _ = framework.DescribeSetting("gzip", func() { strings.Contains(cfg, fmt.Sprintf("gzip_types %s;", defaultCfg.GzipTypes)) && strings.Contains(cfg, "gzip_proxied any;") && strings.Contains(cfg, "gzip_vary on;") - }) + }, + ) + + f.HTTPTestClient(). + GET("/xml"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentEncoding("gzip") }) ginkgo.It("should set gzip_comp_level to 4", func() { @@ -61,7 +87,16 @@ var _ = framework.DescribeSetting("gzip", func() { func(cfg string) bool { return strings.Contains(cfg, "gzip on;") && strings.Contains(cfg, "gzip_comp_level 4;") - }) + }, + ) + + f.HTTPTestClient(). + GET("/xml"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentEncoding("gzip") }) ginkgo.It("should set gzip_disable to msie6", func() { @@ -72,28 +107,87 @@ var _ = framework.DescribeSetting("gzip", func() { func(cfg string) bool { return strings.Contains(cfg, "gzip on;") && strings.Contains(cfg, `gzip_disable "msie6";`) - }) + }, + ) + + f.HTTPTestClient(). + GET("/xml"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + WithHeader("User-Agent", "Mozilla/4.8 [en] (Windows NT 5.1; U)"). + Expect(). + Status(http.StatusOK). + ContentEncoding("gzip") + + f.HTTPTestClient(). + GET("/xml"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + WithHeader("User-Agent", "Mozilla/45.0 (compatible; MSIE 6.0; Windows NT 5.1)"). + Expect(). + Status(http.StatusOK). + ContentEncoding() }) ginkgo.It("should set gzip_min_length to 100", func() { f.UpdateNginxConfigMapData("use-gzip", "true") f.UpdateNginxConfigMapData("gzip-min-length", "100") + f.UpdateNginxConfigMapData("gzip-types", "application/octet-stream") f.WaitForNginxConfiguration( func(cfg string) bool { return strings.Contains(cfg, "gzip on;") && - strings.Contains(cfg, "gzip_min_length 100;") - }) + strings.Contains(cfg, "gzip_min_length 100;") && + strings.Contains(cfg, "gzip_types application/octet-stream;") + }, + ) + + f.HTTPTestClient(). + GET("/bytes/99"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentType("application/octet-stream"). + ContentEncoding() + + f.HTTPTestClient(). + GET("/bytes/100"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentType("application/octet-stream"). + ContentEncoding("gzip") }) - ginkgo.It("should set gzip_types to application/javascript", func() { + ginkgo.It("should set gzip_types to text/html", func() { f.UpdateNginxConfigMapData("use-gzip", "true") - f.UpdateNginxConfigMapData("gzip-types", "application/javascript") + f.UpdateNginxConfigMapData("gzip-types", "text/html") f.WaitForNginxConfiguration( func(cfg string) bool { return strings.Contains(cfg, "gzip on;") && - strings.Contains(cfg, "gzip_types application/javascript;") - }) + strings.Contains(cfg, "gzip_types text/html;") + }, + ) + + f.HTTPTestClient(). + GET("/xml"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentType("application/xml"). + ContentEncoding() + + f.HTTPTestClient(). + GET("/html"). + WithHeader("Host", host). + WithHeader("Accept-Encoding", "gzip"). + Expect(). + Status(http.StatusOK). + ContentType("text/html"). + ContentEncoding("gzip") }) }) diff --git a/test/e2e/settings/no_tls_redirect_locations.go b/test/e2e/settings/no_tls_redirect_locations.go index 8339eb23e..18fd09e26 100644 --- a/test/e2e/settings/no_tls_redirect_locations.go +++ b/test/e2e/settings/no_tls_redirect_locations.go @@ -33,7 +33,7 @@ var _ = framework.DescribeSetting("Add no tls redirect locations", func() { f.EnsureIngress(ing) f.WaitForNginxConfiguration(func(server string) bool { - return !strings.Contains(server, "force_no_ssl_redirect = true,") + return strings.Contains(server, "set $force_no_ssl_redirect \"false\"") }) wlKey := "no-tls-redirect-locations" @@ -42,7 +42,7 @@ var _ = framework.DescribeSetting("Add no tls redirect locations", func() { f.UpdateNginxConfigMapData(wlKey, wlValue) f.WaitForNginxConfiguration(func(server string) bool { - return strings.Contains(server, "force_no_ssl_redirect = true,") + return strings.Contains(server, "set $force_no_ssl_redirect \"true\"") }) }) }) diff --git a/test/e2e/settings/ocsp/ocsp.go b/test/e2e/settings/ocsp/ocsp.go index 4d419c5d0..b2d50292a 100644 --- a/test/e2e/settings/ocsp/ocsp.go +++ b/test/e2e/settings/ocsp/ocsp.go @@ -34,6 +34,7 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/ingress-nginx/test/e2e/framework" @@ -47,12 +48,15 @@ var _ = framework.DescribeSetting("OCSP", func() { }) ginkgo.It("should enable OCSP and contain stapling information in the connection", func() { - ginkgo.Skip("Skipped due to a bug with cfssl and Alpine") host := "www.example.com" f.UpdateNginxConfigMapData("enable-ocsp", "true") err := prepareCertificates(f.Namespace) + if err != nil { + ginkgo.By(fmt.Sprintf("Prepare Certs error %v", err.Error())) + } + assert.Nil(ginkgo.GinkgoT(), err) ing := framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, f.Namespace, framework.EchoService, 80, nil) @@ -104,8 +108,9 @@ var _ = framework.DescribeSetting("OCSP", func() { err = framework.WaitForEndpoints(f.KubeClientSet, framework.DefaultTimeout, "ocspserve", f.Namespace, 1) assert.Nil(ginkgo.GinkgoT(), err, "waiting for endpoints to become ready") - f.WaitForNginxConfiguration(func(cfg string) bool { - return strings.Contains(cfg, "certificate.is_ocsp_stapling_enabled = true") + f.WaitForLuaConfiguration(func(jsonCfg map[string]interface{}) bool { + val, ok, err := unstructured.NestedBool(jsonCfg, "enable_ocsp") + return err == nil && ok && val }) f.WaitForNginxServer(host, @@ -292,7 +297,7 @@ func ocspserveDeployment(namespace string) (*appsv1.Deployment, *corev1.Service) Containers: []corev1.Container{ { Name: name, - Image: "registry.k8s.io/ingress-nginx/e2e-test-cfssl@sha256:adaa118c179c41cb33fb567004a1f0c71b8fce6bc13263efa63d42dddd5b4346", + Image: "registry.k8s.io/ingress-nginx/cfssl:v1.1.1@sha256:bcd576c6d0a01d4710969195e804c02da62b71b5c35c6816df9b7584d5445437", Command: []string{ "/bin/bash", "-c", diff --git a/test/e2e/settings/opentelemetry.go b/test/e2e/settings/opentelemetry.go index 15b5d165e..b5fc6ff4e 100644 --- a/test/e2e/settings/opentelemetry.go +++ b/test/e2e/settings/opentelemetry.go @@ -31,7 +31,7 @@ const ( opentelemetryOperationName = "opentelemetry-operation-name" opentelemetryLocationOperationName = "opentelemetry-location-operation-name" opentelemetryConfig = "opentelemetry-config" - opentelemetryConfigPath = "/etc/nginx/opentelemetry.toml" + opentelemetryConfigPath = "/etc/ingress-controller/telemetry/opentelemetry.toml" enable = "true" ) diff --git a/test/e2e/settings/opentracing.go b/test/e2e/settings/opentracing.go deleted file mode 100644 index 76d96498d..000000000 --- a/test/e2e/settings/opentracing.go +++ /dev/null @@ -1,256 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package settings - -import ( - "fmt" - "net/http" - "strings" - "time" - - "github.com/onsi/ginkgo/v2" - "github.com/stretchr/testify/assert" - - "k8s.io/ingress-nginx/test/e2e/framework" -) - -const ( - enableOpentracing = "enable-opentracing" - opentracingTrustIncomingSpan = "opentracing-trust-incoming-span" - - zipkinCollectorHost = "zipkin-collector-host" - - jaegerCollectorHost = "jaeger-collector-host" - jaegerSamplerHost = "jaeger-sampler-host" - jaegerPropagationFormat = "jaeger-propagation-format" - // jaegerEndpoint = "jaeger-endpoint" - - datadogCollectorHost = "datadog-collector-host" - - opentracingOperationName = "opentracing-operation-name" - opentracingOperationValue = "HTTP $request_method $uri" - - opentracingLocationOperationName = "opentracing-location-operation-name" - - localhost = "127.0.0.1" -) - -var _ = framework.IngressNginxDescribe("Configure OpenTracing", func() { - f := framework.NewDefaultFramework("enable-opentracing") - - ginkgo.BeforeEach(func() { - f.NewEchoDeployment() - }) - - ginkgo.AfterEach(func() { - }) - - ginkgo.It("should not exists opentracing directive", func() { - config := map[string]string{} - config[enableOpentracing] = disable - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return !strings.Contains(cfg, "opentracing on") - }) - }) - - ginkgo.It("should exists opentracing directive when is enabled", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[zipkinCollectorHost] = localhost - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return strings.Contains(cfg, "opentracing on") - }) - }) - - ginkgo.It("should include opentracing_trust_incoming_span off directive when disabled", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[opentracingTrustIncomingSpan] = disable - config[zipkinCollectorHost] = localhost - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return strings.Contains(cfg, "opentracing_trust_incoming_span off") - }) - }) - - ginkgo.It("should not exists opentracing_operation_name directive when is empty", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[zipkinCollectorHost] = localhost - config[opentracingOperationName] = "" - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return !strings.Contains(cfg, "opentracing_operation_name") - }) - }) - - ginkgo.It("should exists opentracing_operation_name directive when is configured", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[zipkinCollectorHost] = localhost - config[opentracingOperationName] = opentracingOperationValue - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return strings.Contains(cfg, `opentracing_operation_name "HTTP $request_method $uri"`) - }) - }) - - ginkgo.It("should not exists opentracing_location_operation_name directive when is empty", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[zipkinCollectorHost] = localhost - config[opentracingLocationOperationName] = "" - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return !strings.Contains(cfg, "opentracing_location_operation_name") - }) - }) - - ginkgo.It("should exists opentracing_location_operation_name directive when is configured", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[zipkinCollectorHost] = localhost - config[opentracingLocationOperationName] = opentracingOperationValue - f.SetNginxConfigMapData(config) - - f.EnsureIngress(framework.NewSingleIngress(enableOpentracing, "/", enableOpentracing, f.Namespace, "http-svc", 80, nil)) - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return strings.Contains(cfg, "opentracing_location_operation_name \"HTTP $request_method $uri\"") - }) - }) - - ginkgo.It("should enable opentracing using zipkin", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[zipkinCollectorHost] = localhost - f.SetNginxConfigMapData(config) - - framework.Sleep(10 * time.Second) - log, err := f.NginxLogs() - assert.Nil(ginkgo.GinkgoT(), err, "obtaining nginx logs") - assert.NotContains(ginkgo.GinkgoT(), log, "Unexpected failure reloading the backend", "reloading nginx after a configmap change") - }) - - ginkgo.It("should enable opentracing using jaeger", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[jaegerCollectorHost] = localhost - f.SetNginxConfigMapData(config) - - framework.Sleep(10 * time.Second) - log, err := f.NginxLogs() - assert.Nil(ginkgo.GinkgoT(), err, "obtaining nginx logs") - assert.NotContains(ginkgo.GinkgoT(), log, "Unexpected failure reloading the backend", "reloading nginx after a configmap change") - }) - - ginkgo.It("should enable opentracing using jaeger with sampler host", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[jaegerCollectorHost] = localhost - config[jaegerSamplerHost] = localhost - f.SetNginxConfigMapData(config) - - framework.Sleep(10 * time.Second) - log, err := f.NginxLogs() - assert.Nil(ginkgo.GinkgoT(), err, "obtaining nginx logs") - assert.NotContains(ginkgo.GinkgoT(), log, "Unexpected failure reloading the backend", "reloading nginx after a configmap change") - }) - - ginkgo.It("should propagate the w3c header when configured with jaeger", func() { - host := "jaeger-w3c" - config := map[string]string{} - config[enableOpentracing] = enable - config[jaegerCollectorHost] = localhost - config[jaegerPropagationFormat] = "w3c" - f.SetNginxConfigMapData(config) - - framework.Sleep(10 * time.Second) - log, err := f.NginxLogs() - assert.Nil(ginkgo.GinkgoT(), err, "obtaining nginx logs") - assert.NotContains(ginkgo.GinkgoT(), log, "Unexpected failure reloading the backend", "reloading nginx after a configmap change") - - ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, nil) - f.EnsureIngress(ing) - - f.WaitForNginxServer(host, - func(server string) bool { - return strings.Contains(server, fmt.Sprintf("server_name %s ;", host)) - }) - - f.HTTPTestClient(). - GET("/"). - WithHeader("Host", host). - Expect(). - Status(http.StatusOK). - Body(). - Match("traceparent=[0-9a-f]{2}-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}") - }) - - /* - ginkgo.It("should enable opentracing using jaeger with an HTTP endpoint", func() { - config := map[string]string{} - config[enableOpentracing] = TRUE - config[jaegerEndpoint] = "http://127.0.0.1/api/traces" - f.SetNginxConfigMapData(config) - - framework.Sleep(10 * time.Second) - log, err := f.NginxLogs() - assert.Nil(ginkgo.GinkgoT(), err, "obtaining nginx logs") - assert.NotContains(ginkgo.GinkgoT(), log, "Unexpected failure reloading the backend", "reloading nginx after a configmap change") - }) - */ - - ginkgo.It("should enable opentracing using datadog", func() { - config := map[string]string{} - config[enableOpentracing] = enable - config[datadogCollectorHost] = "http://127.0.0.1" - f.SetNginxConfigMapData(config) - - framework.Sleep(10 * time.Second) - log, err := f.NginxLogs() - assert.Nil(ginkgo.GinkgoT(), err, "obtaining nginx logs") - assert.NotContains(ginkgo.GinkgoT(), log, "Unexpected failure reloading the backend", "reloading nginx after a configmap change") - }) -}) diff --git a/test/e2e/settings/plugins.go b/test/e2e/settings/plugins.go deleted file mode 100644 index 659acd42c..000000000 --- a/test/e2e/settings/plugins.go +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright 2020 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package settings - -import ( - "fmt" - "net/http" - "strings" - - "github.com/onsi/ginkgo/v2" - "k8s.io/ingress-nginx/test/e2e/framework" -) - -var _ = framework.IngressNginxDescribe("plugins", func() { - f := framework.NewDefaultFramework("plugins") - - ginkgo.BeforeEach(func() { - f.NewEchoDeployment() - }) - - ginkgo.It("should exist a x-hello-world header", func() { - f.UpdateNginxConfigMapData("plugins", "hello_world, invalid") - - host := "example.com" - f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, nil)) - - f.WaitForNginxConfiguration( - func(server string) bool { - return strings.Contains(server, fmt.Sprintf("server_name %v", host)) && - strings.Contains(server, `plugins.init({ "hello_world","invalid" })`) - }) - - f.HTTPTestClient(). - GET("/"). - WithHeader("Host", host). - WithHeader("User-Agent", "hello"). - Expect(). - Status(http.StatusOK). - Body().Contains("x-hello-world=1") - }) -}) diff --git a/test/e2e/settings/pod_security_policy.go b/test/e2e/settings/pod_security_policy.go deleted file mode 100644 index b21fb870e..000000000 --- a/test/e2e/settings/pod_security_policy.go +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package settings - -import ( - "context" - "net/http" - "strconv" - "strings" - - "github.com/onsi/ginkgo/v2" - "github.com/stretchr/testify/assert" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - policyv1beta1 "k8s.io/api/policy/v1beta1" - rbacv1 "k8s.io/api/rbac/v1" - k8sErrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "k8s.io/ingress-nginx/test/e2e/framework" -) - -const ( - ingressControllerPSP = "ingress-controller-psp" -) - -var _ = framework.IngressNginxDescribe("[Security] Pod Security Policies", func() { - f := framework.NewDefaultFramework("pod-security-policies") - - ginkgo.It("should be running with a Pod Security Policy", func() { - k8sversion, err := f.KubeClientSet.Discovery().ServerVersion() - if err != nil { - assert.Nil(ginkgo.GinkgoT(), err, "getting version") - } - - numversion, err := strconv.Atoi(k8sversion.Minor) - if err != nil { - assert.Nil(ginkgo.GinkgoT(), err, "converting version") - } - - if numversion > 24 { - ginkgo.Skip("PSP not supported in this version") - } - - psp := createPodSecurityPolicy() - _, err = f.KubeClientSet.PolicyV1beta1().PodSecurityPolicies().Create(context.TODO(), psp, metav1.CreateOptions{}) - if !k8sErrors.IsAlreadyExists(err) { - assert.Nil(ginkgo.GinkgoT(), err, "creating Pod Security Policy") - } - - role, err := f.KubeClientSet.RbacV1().Roles(f.Namespace).Get(context.TODO(), "nginx-ingress", metav1.GetOptions{}) - assert.Nil(ginkgo.GinkgoT(), err, "getting ingress controller cluster role") - assert.NotNil(ginkgo.GinkgoT(), role) - - role.Rules = append(role.Rules, rbacv1.PolicyRule{ - APIGroups: []string{"policy"}, - Resources: []string{"podsecuritypolicies"}, - ResourceNames: []string{ingressControllerPSP}, - Verbs: []string{"use"}, - }) - - _, err = f.KubeClientSet.RbacV1().Roles(f.Namespace).Update(context.TODO(), role, metav1.UpdateOptions{}) - assert.Nil(ginkgo.GinkgoT(), err, "updating ingress controller cluster role to use a pod security policy") - - // update the deployment just to trigger a rolling update and the use of the security policy - err = f.UpdateIngressControllerDeployment(func(deployment *appsv1.Deployment) error { - args := deployment.Spec.Template.Spec.Containers[0].Args - args = append(args, "--v=2") - deployment.Spec.Template.Spec.Containers[0].Args = args - _, err := f.KubeClientSet.AppsV1().Deployments(f.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) - - return err - }) - assert.Nil(ginkgo.GinkgoT(), err, "unexpected error updating ingress controller deployment flags") - - f.WaitForNginxListening(80) - - f.NewEchoDeployment() - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return strings.Contains(cfg, "server_tokens off") - }) - - f.HTTPTestClient(). - GET("/"). - WithHeader("Host", "foo.bar.com"). - Expect(). - Status(http.StatusNotFound) - }) -}) - -func createPodSecurityPolicy() *policyv1beta1.PodSecurityPolicy { - trueValue := true - return &policyv1beta1.PodSecurityPolicy{ - ObjectMeta: metav1.ObjectMeta{ - Name: ingressControllerPSP, - }, - Spec: policyv1beta1.PodSecurityPolicySpec{ - AllowPrivilegeEscalation: &trueValue, - RequiredDropCapabilities: []corev1.Capability{"All"}, - RunAsUser: policyv1beta1.RunAsUserStrategyOptions{ - Rule: "RunAsAny", - }, - SELinux: policyv1beta1.SELinuxStrategyOptions{ - Rule: "RunAsAny", - }, - FSGroup: policyv1beta1.FSGroupStrategyOptions{ - Ranges: []policyv1beta1.IDRange{ - { - Min: 1, - Max: 65535, - }, - }, - Rule: "MustRunAs", - }, - SupplementalGroups: policyv1beta1.SupplementalGroupsStrategyOptions{ - Ranges: []policyv1beta1.IDRange{ - { - Min: 1, - Max: 65535, - }, - }, - Rule: "MustRunAs", - }, - }, - } -} diff --git a/test/e2e/settings/pod_security_policy_volumes.go b/test/e2e/settings/pod_security_policy_volumes.go deleted file mode 100644 index f8fc58300..000000000 --- a/test/e2e/settings/pod_security_policy_volumes.go +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package settings - -import ( - "context" - "net/http" - "strconv" - "strings" - - "github.com/onsi/ginkgo/v2" - "github.com/stretchr/testify/assert" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - k8sErrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "k8s.io/ingress-nginx/test/e2e/framework" -) - -var _ = framework.IngressNginxDescribe("[Security] Pod Security Policies with volumes", func() { - f := framework.NewDefaultFramework("pod-security-policies-volumes") - - ginkgo.It("should be running with a Pod Security Policy", func() { - k8sversion, err := f.KubeClientSet.Discovery().ServerVersion() - if err != nil { - assert.Nil(ginkgo.GinkgoT(), err, "getting version") - } - - numversion, err := strconv.Atoi(k8sversion.Minor) - if err != nil { - assert.Nil(ginkgo.GinkgoT(), err, "converting version") - } - - if numversion > 24 { - ginkgo.Skip("PSP not supported in this version") - } - psp := createPodSecurityPolicy() - _, err = f.KubeClientSet.PolicyV1beta1().PodSecurityPolicies().Create(context.TODO(), psp, metav1.CreateOptions{}) - if !k8sErrors.IsAlreadyExists(err) { - assert.Nil(ginkgo.GinkgoT(), err, "creating Pod Security Policy") - } - - role, err := f.KubeClientSet.RbacV1().Roles(f.Namespace).Get(context.TODO(), "nginx-ingress", metav1.GetOptions{}) - assert.Nil(ginkgo.GinkgoT(), err, "getting ingress controller cluster role") - assert.NotNil(ginkgo.GinkgoT(), role) - - role.Rules = append(role.Rules, rbacv1.PolicyRule{ - APIGroups: []string{"policy"}, - Resources: []string{"podsecuritypolicies"}, - ResourceNames: []string{ingressControllerPSP}, - Verbs: []string{"use"}, - }) - - _, err = f.KubeClientSet.RbacV1().Roles(f.Namespace).Update(context.TODO(), role, metav1.UpdateOptions{}) - assert.Nil(ginkgo.GinkgoT(), err, "updating ingress controller cluster role to use a pod security policy") - - err = f.UpdateIngressControllerDeployment(func(deployment *appsv1.Deployment) error { - args := deployment.Spec.Template.Spec.Containers[0].Args - args = append(args, "--v=2") - deployment.Spec.Template.Spec.Containers[0].Args = args - - deployment.Spec.Template.Spec.Volumes = []corev1.Volume{ - { - Name: "ssl", VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - { - Name: "tmp", VolumeSource: corev1.VolumeSource{ - EmptyDir: &corev1.EmptyDirVolumeSource{}, - }, - }, - } - - fsGroup := int64(33) - deployment.Spec.Template.Spec.SecurityContext = &corev1.PodSecurityContext{ - FSGroup: &fsGroup, - } - - deployment.Spec.Template.Spec.Containers[0].VolumeMounts = []corev1.VolumeMount{ - { - Name: "ssl", MountPath: "/etc/my-amazing-ssl", - }, - { - Name: "tmp", MountPath: "/my-other-tmp", - }, - } - - _, err := f.KubeClientSet.AppsV1().Deployments(f.Namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) - - return err - }) - assert.Nil(ginkgo.GinkgoT(), err, "updating ingress controller deployment") - - f.WaitForNginxListening(80) - - f.NewEchoDeployment() - - f.WaitForNginxConfiguration( - func(cfg string) bool { - return strings.Contains(cfg, "server_tokens off") - }) - - f.HTTPTestClient(). - GET("/"). - WithHeader("Host", "foo.bar.com"). - Expect(). - Status(http.StatusNotFound) - }) -}) diff --git a/test/e2e/settings/proxy_host.go b/test/e2e/settings/proxy_host.go index 35aafc53d..bb5dc9c01 100644 --- a/test/e2e/settings/proxy_host.go +++ b/test/e2e/settings/proxy_host.go @@ -34,14 +34,9 @@ var _ = framework.IngressNginxDescribe("Dynamic $proxy_host", func() { }) ginkgo.It("should exist a proxy_host", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() + upstreamName := fmt.Sprintf("%v-%v-80", f.Namespace, framework.EchoService) annotations := map[string]string{ "nginx.ingress.kubernetes.io/configuration-snippet": `more_set_headers "Custom-Header: $proxy_host"`, @@ -63,14 +58,8 @@ var _ = framework.IngressNginxDescribe("Dynamic $proxy_host", func() { }) ginkgo.It("should exist a proxy_host using the upstream-vhost annotation value", func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "true", - }) - defer func() { - f.SetNginxConfigMapData(map[string]string{ - "allow-snippet-annotations": "false", - }) - }() + disableSnippet := f.AllowSnippetConfiguration() + defer disableSnippet() upstreamName := fmt.Sprintf("%v-%v-80", f.Namespace, framework.EchoService) upstreamVHost := "different.host" diff --git a/test/e2e/settings/server_snippet.go b/test/e2e/settings/server_snippet.go index 8ddf10fd9..1e2084bd8 100644 --- a/test/e2e/settings/server_snippet.go +++ b/test/e2e/settings/server_snippet.go @@ -38,6 +38,7 @@ var _ = framework.DescribeSetting("configmap server-snippet", func() { f.SetNginxConfigMapData(map[string]string{ "allow-snippet-annotations": "true", + "annotations-risk-level": "Critical", "server-snippet": ` more_set_headers "Globalfoo: Foooo";`, }) @@ -45,6 +46,7 @@ var _ = framework.DescribeSetting("configmap server-snippet", func() { defer func() { f.SetNginxConfigMapData(map[string]string{ "allow-snippet-annotations": "false", + "annotations-risk-level": "High", }) }() annotations := map[string]string{ @@ -101,6 +103,7 @@ var _ = framework.DescribeSetting("configmap server-snippet", func() { f.SetNginxConfigMapData(map[string]string{ "allow-snippet-annotations": "false", + "annotations-risk-level": "Critical", // To allow Configuration Snippet "server-snippet": ` more_set_headers "Globalfoo: Foooo";`, }) @@ -108,6 +111,7 @@ var _ = framework.DescribeSetting("configmap server-snippet", func() { defer func() { f.SetNginxConfigMapData(map[string]string{ "allow-snippet-annotations": "false", + "annotations-risk-level": "High", }) }() annotations := map[string]string{ diff --git a/test/e2e/settings/tls.go b/test/e2e/settings/tls.go index 51f760df8..1ebf358c1 100644 --- a/test/e2e/settings/tls.go +++ b/test/e2e/settings/tls.go @@ -25,10 +25,11 @@ import ( "github.com/onsi/ginkgo/v2" "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/ingress-nginx/test/e2e/framework" ) -var _ = framework.DescribeSetting("[SSL] TLS protocols, ciphers and headers)", func() { +var _ = framework.DescribeSetting("[SSL] TLS protocols, ciphers and headers", func() { f := framework.NewDefaultFramework("settings-tls") host := "settings-tls" @@ -109,8 +110,9 @@ var _ = framework.DescribeSetting("[SSL] TLS protocols, ciphers and headers)", f ginkgo.It("setting max-age parameter", func() { f.UpdateNginxConfigMapData(hstsMaxAge, "86400") - f.WaitForNginxConfiguration(func(server string) bool { - return strings.Contains(server, `hsts_max_age = 86400,`) + f.WaitForLuaConfiguration(func(jsonCfg map[string]interface{}) bool { + val, ok, err := unstructured.NestedString(jsonCfg, "hsts_max_age") + return err == nil && ok && val == "86400" }) f.HTTPTestClientWithTLSConfig(tlsConfig). @@ -128,8 +130,9 @@ var _ = framework.DescribeSetting("[SSL] TLS protocols, ciphers and headers)", f hstsIncludeSubdomains: "false", }) - f.WaitForNginxConfiguration(func(server string) bool { - return strings.Contains(server, `hsts_include_subdomains = false,`) + f.WaitForLuaConfiguration(func(jsonCfg map[string]interface{}) bool { + val, ok, err := unstructured.NestedBool(jsonCfg, "hsts_include_subdomains") + return err == nil && ok && !val }) f.HTTPTestClientWithTLSConfig(tlsConfig). @@ -148,8 +151,9 @@ var _ = framework.DescribeSetting("[SSL] TLS protocols, ciphers and headers)", f hstsIncludeSubdomains: "false", }) - f.WaitForNginxConfiguration(func(server string) bool { - return strings.Contains(server, `hsts_preload = true,`) + f.WaitForLuaConfiguration(func(jsonCfg map[string]interface{}) bool { + val, ok, err := unstructured.NestedBool(jsonCfg, "hsts_preload") + return err == nil && ok && val }) f.HTTPTestClientWithTLSConfig(tlsConfig). diff --git a/test/e2e/settings/validations/validations.go b/test/e2e/settings/validations/validations.go index ac95a453a..881de39b4 100644 --- a/test/e2e/settings/validations/validations.go +++ b/test/e2e/settings/validations/validations.go @@ -48,8 +48,8 @@ var _ = framework.IngressNginxDescribeSerial("annotation validations", func() { framework.Sleep() annotations := map[string]string{ - "nginx.ingress.kubernetes.io/default-backend": "default/bla", // low risk - "nginx.ingress.kubernetes.io/denylist-source-range": "1.1.1.1/32", // medium risk + "nginx.ingress.kubernetes.io/default-backend": "bla", // low risk + "nginx.ingress.kubernetes.io/denylist-source-range": "1.1.1.1/32", // medium risk } ginkgo.By("allow ingress with low/medium risk annotations") @@ -82,8 +82,8 @@ var _ = framework.IngressNginxDescribeSerial("annotation validations", func() { framework.Sleep() annotations := map[string]string{ - "nginx.ingress.kubernetes.io/default-backend": "default/bla", // low risk - "nginx.ingress.kubernetes.io/denylist-source-range": "1.1.1.1/32", // medium risk + "nginx.ingress.kubernetes.io/default-backend": "bla", // low risk + "nginx.ingress.kubernetes.io/denylist-source-range": "1.1.1.1/32", // medium risk } ginkgo.By("allow ingress with low/medium risk annotations") diff --git a/test/e2e/tcpudp/tcp.go b/test/e2e/tcpudp/tcp.go index f06d6c9a3..856184d18 100644 --- a/test/e2e/tcpudp/tcp.go +++ b/test/e2e/tcpudp/tcp.go @@ -133,7 +133,7 @@ var _ = framework.IngressNginxDescribe("[TCP] tcp-services", func() { // Execute the test. Use the `external name` service to resolve a domain name. resolver := net.Resolver{ PreferGo: true, - Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + Dial: func(ctx context.Context, _, _ string) (net.Conn, error) { d := net.Dialer{} return d.DialContext(ctx, "tcp", fmt.Sprintf("%v:5353", ip)) }, diff --git a/test/e2e/wait-for-nginx.sh b/test/e2e/wait-for-nginx.sh index 0726bde10..73023aba1 100755 --- a/test/e2e/wait-for-nginx.sh +++ b/test/e2e/wait-for-nginx.sh @@ -24,7 +24,6 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" export NAMESPACE=$1 export NAMESPACE_OVERLAY=$2 export IS_CHROOT=$3 -export ENABLE_VALIDATIONS=$4 echo "deploying NGINX Ingress controller in namespace $NAMESPACE" @@ -48,16 +47,6 @@ metadata: EOF -OTEL_MODULE=$(cat <