diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index a86eb257635..9008aeb6adb 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -10,6 +10,9 @@ updates:
schedule:
interval: "weekly"
day: "sunday"
+ cooldown:
+ default-days: 3
+ semver-major-days: 15
labels:
- area/dependency
- release-note/none-required
@@ -18,89 +21,25 @@ updates:
patterns:
- "k8s.io/*"
- target-branch: main
- package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "weekly"
- day: "sunday"
- labels:
- - area/tooling
- - release-note/none-required
- groups:
- artifact-actions:
- patterns:
- - "actions/upload-artifact"
- - "actions/download-artifact"
-
-# release branch N targets
-- target-branch: release-1.33
package-ecosystem: "gomod"
- directory: "/"
- schedule:
- interval: "weekly"
- day: "sunday"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
- labels:
- - area/dependency
- - release-note/none-required
- groups:
- k8s-dependencies:
- patterns:
- - "k8s.io/*"
-- target-branch: release-1.33
- package-ecosystem: "github-actions"
- directory: "/"
+ directory: "/tools"
schedule:
interval: "weekly"
day: "sunday"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
+ cooldown:
+ default-days: 3
+ semver-major-days: 15
labels:
- area/tooling
- release-note/none-required
- groups:
- artifact-actions:
- patterns:
- - "actions/upload-artifact"
- - "actions/download-artifact"
-
-# release branch N-1 targets
-- target-branch: release-1.32
- package-ecosystem: "gomod"
- directory: "/"
- schedule:
- interval: "weekly"
- day: "sunday"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
- labels:
- - area/dependency
- - release-note/none-required
- groups:
- k8s-dependencies:
- patterns:
- - "k8s.io/*"
-- target-branch: release-1.32
+- target-branch: main
package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "sunday"
- ignore:
- - dependency-name: "*"
- update-types:
- - "version-update:semver-major"
- - "version-update:semver-minor"
+ cooldown:
+ default-days: 3
labels:
- area/tooling
- release-note/none-required
@@ -110,13 +49,15 @@ updates:
- "actions/upload-artifact"
- "actions/download-artifact"
-# release branch N-2 targets
-- target-branch: release-1.31
+# release branch targets
+- target-branch: release-1.33
package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
day: "sunday"
+ cooldown:
+ default-days: 3
ignore:
- dependency-name: "*"
update-types:
@@ -129,12 +70,14 @@ updates:
k8s-dependencies:
patterns:
- "k8s.io/*"
-- target-branch: release-1.31
+- target-branch: release-1.33
package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "sunday"
+ cooldown:
+ default-days: 3
ignore:
- dependency-name: "*"
update-types:
@@ -148,3 +91,5 @@ updates:
patterns:
- "actions/upload-artifact"
- "actions/download-artifact"
+
+
diff --git a/.github/reviewers.yaml b/.github/reviewers.yaml
deleted file mode 100644
index a42a3554aea..00000000000
--- a/.github/reviewers.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-reviewers:
- defaults:
- - team:contour-reviewers
-
-options:
- ignore_draft: true
- number_of_reviewers: 1
diff --git a/.github/workflows/build_daily.yaml b/.github/workflows/build_daily.yaml
index 420969d49c8..270037c9dcc 100644
--- a/.github/workflows/build_daily.yaml
+++ b/.github/workflows/build_daily.yaml
@@ -12,16 +12,16 @@ permissions:
env:
GOPROXY: https://proxy.golang.org/
- GO_VERSION: 1.25.1
+ GO_VERSION: 1.26.4
jobs:
e2e-envoy-deployment:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -31,7 +31,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -48,10 +48,10 @@ jobs:
e2e-ipv6:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -61,7 +61,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
diff --git a/.github/workflows/build_main.yaml b/.github/workflows/build_main.yaml
index 5eb825d5b89..6737a7407d4 100644
--- a/.github/workflows/build_main.yaml
+++ b/.github/workflows/build_main.yaml
@@ -14,15 +14,15 @@ jobs:
permissions:
packages: write
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
+ uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
with:
version: latest
- name: Log in to GHCR
- uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
+ uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
registry: ghcr.io
username: ${{ github.actor }}
diff --git a/.github/workflows/build_tag.yaml b/.github/workflows/build_tag.yaml
index f4c228fa8a1..39dbc2efb3c 100644
--- a/.github/workflows/build_tag.yaml
+++ b/.github/workflows/build_tag.yaml
@@ -18,7 +18,7 @@ permissions:
env:
GOPROXY: https://proxy.golang.org/
- GO_VERSION: 1.25.1
+ GO_VERSION: 1.26.4
jobs:
build:
@@ -26,15 +26,15 @@ jobs:
permissions:
packages: write
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
+ uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
with:
version: latest
- name: Log in to GHCR
- uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
+ uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -49,10 +49,10 @@ jobs:
runs-on: ubuntu-latest
needs: [build]
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -62,7 +62,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -77,7 +77,7 @@ jobs:
export CONTOUR_E2E_IMAGE="ghcr.io/projectcontour/contour:$(git describe --tags)"
make setup-kind-cluster run-gateway-conformance cleanup-kind
- name: Upload gateway conformance report
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: gateway-conformance-report
path: gateway-conformance-report/projectcontour-contour-*.yaml
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 5f5d8c9a96a..7cc88dcf385 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -12,9 +12,13 @@ on:
permissions:
contents: read
+concurrency:
+ group: codeql-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
env:
GOPROXY: https://proxy.golang.org/
- GO_VERSION: 1.25.1
+ GO_VERSION: 1.26.4
jobs:
CodeQL-Build:
@@ -22,10 +26,10 @@ jobs:
permissions:
security-events: write
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -35,17 +39,36 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
+ uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
with:
languages: go
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
- name: Autobuild
- uses: github/codeql-action/autobuild@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
+ uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
+ uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
+ with:
+ category: /language:go
+
+ CodeQL-for-Actions:
+ runs-on: ubuntu-latest
+ permissions:
+ security-events: write
+ steps:
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
+ with:
+ persist-credentials: false
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
+ with:
+ languages: actions
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
+ with:
+ category: /language:actions
diff --git a/.github/workflows/label_check.yaml b/.github/workflows/label_check.yaml
index 5f51733c2c2..cd4b1dfc4da 100644
--- a/.github/workflows/label_check.yaml
+++ b/.github/workflows/label_check.yaml
@@ -23,17 +23,17 @@ jobs:
name: Check release-note label set
runs-on: ubuntu-latest
steps:
- - uses: mheap/github-action-required-labels@8afbe8ae6ab7647d0c9f0cfa7c2f939650d22509 # v5.5
+ - uses: mheap/github-action-required-labels@0ac283b4e65c1fb28ce6079dea5546ceca98ccbe # v5.5
with:
mode: minimum
count: 1
labels: "release-note/major, release-note/minor, release-note/small, release-note/docs, release-note/infra, release-note/deprecation, release-note/none-required"
- - uses: mheap/github-action-required-labels@8afbe8ae6ab7647d0c9f0cfa7c2f939650d22509 # v5.5
+ - uses: mheap/github-action-required-labels@0ac283b4e65c1fb28ce6079dea5546ceca98ccbe # v5.5
with:
mode: maximum
count: 1
labels: "release-note/major, release-note/minor, release-note/small, release-note/docs, release-note/infra, release-note/none-required"
- - uses: mheap/github-action-required-labels@8afbe8ae6ab7647d0c9f0cfa7c2f939650d22509 # v5.5
+ - uses: mheap/github-action-required-labels@0ac283b4e65c1fb28ce6079dea5546ceca98ccbe # v5.5
with:
mode: maximum
count: 1
@@ -43,10 +43,10 @@ jobs:
needs: [check-label]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -56,7 +56,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: 'stable'
cache: false
diff --git a/.github/workflows/openssf-scorecard.yaml b/.github/workflows/openssf-scorecard.yaml
index 4d01dbf07b7..31a7b037d48 100644
--- a/.github/workflows/openssf-scorecard.yaml
+++ b/.github/workflows/openssf-scorecard.yaml
@@ -21,21 +21,21 @@ jobs:
security-events: write
id-token: write
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: "Run analysis"
- uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2
+ uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
publish_results: true
- name: "Upload artifact"
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: SARIF file
path: results.sarif
- name: "Upload to code-scanning"
- uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
+ uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
with:
sarif_file: results.sarif
diff --git a/.github/workflows/prbuild.yaml b/.github/workflows/prbuild.yaml
index 5cf5472009d..ce648e30eba 100644
--- a/.github/workflows/prbuild.yaml
+++ b/.github/workflows/prbuild.yaml
@@ -13,34 +13,34 @@ permissions:
env:
GOPROXY: https://proxy.golang.org/
- GO_VERSION: 1.25.1
+ GO_VERSION: 1.26.4
jobs:
lint:
runs-on: ubuntu-latest
steps:
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: golangci-lint
- uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8.0.0
+ uses: golangci/golangci-lint-action@82606bf257cbaff209d206a39f5134f0cfbfd2ee # v9.2.1
with:
- version: v2.4.0
+ version: v2.9.0
args: --build-tags=e2e,conformance,gcp,oidc,none
codespell:
name: Codespell
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Codespell
- uses: codespell-project/actions-codespell@406322ec52dd7b488e48c1c4b82e2a8b3a1bf630 # v2.1
+ uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2.2
with:
skip: .git,*.png,*.woff,*.woff2,*.eot,*.ttf,*.jpg,*.ico,*.svg,./site/themes/contour/static/fonts/README.md,./vendor,./site/public,./hack/actions/check-changefile-exists.go,go.mod,go.sum
ignore_words_file: './.codespell.ignorewords'
@@ -49,10 +49,10 @@ jobs:
codegen:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -62,7 +62,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -81,11 +81,11 @@ jobs:
- codegen
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
+ uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
with:
version: latest
- name: Build image
@@ -94,7 +94,7 @@ jobs:
run: |
make multiarch-build
- name: Upload image
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: image
path: image/contour-*.tar
@@ -114,26 +114,26 @@ jobs:
# image to use) for each kubernetes_version value.
include:
- kubernetes_version: "kubernetes:latest"
- node_image: "docker.io/kindest/node:v1.34.0@sha256:7416a61b42b1662ca6ca89f02028ac133a309a2a30ba309614e8ec94d976dc5a"
+ node_image: "docker.io/kindest/node:v1.36.1@sha256:3489c7674813ba5d8b1a9977baea8a6e553784dab7b84759d1014dbd78f7ebd5"
- kubernetes_version: "kubernetes:n-1"
- node_image: "docker.io/kindest/node:v1.33.4@sha256:25a6018e48dfcaee478f4a59af81157a437f15e6e140bf103f85a2e7cd0cbbf2"
+ node_image: "docker.io/kindest/node:v1.35.5@sha256:ce977ae6d65918d0b58a5f8b5e940429c2ce42fa3a5619ec2bbc60b949c0ac95"
- kubernetes_version: "kubernetes:n-2"
- node_image: "docker.io/kindest/node:v1.32.8@sha256:abd489f042d2b644e2d033f5c2d900bc707798d075e8186cb65e3f1367a9d5a1"
+ node_image: "docker.io/kindest/node:v1.34.8@sha256:02722c2dedddcfc00febf5d27fbeb9b7b2c14294c82109ff4a85d89ac9ba3256"
- config_type: "ConfigmapConfiguration"
use_config_crd: "false"
- config_type: "ContourConfiguration"
use_config_crd: "true"
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Download image
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: image
path: image
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -143,7 +143,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -173,24 +173,24 @@ jobs:
# image to use) for each kubernetes_version value.
include:
- kubernetes_version: "kubernetes:latest"
- node_image: "docker.io/kindest/node:v1.34.0@sha256:7416a61b42b1662ca6ca89f02028ac133a309a2a30ba309614e8ec94d976dc5a"
+ node_image: "docker.io/kindest/node:v1.36.1@sha256:3489c7674813ba5d8b1a9977baea8a6e553784dab7b84759d1014dbd78f7ebd5"
- kubernetes_version: "kubernetes:n-1"
- node_image: "docker.io/kindest/node:v1.33.4@sha256:25a6018e48dfcaee478f4a59af81157a437f15e6e140bf103f85a2e7cd0cbbf2"
+ node_image: "docker.io/kindest/node:v1.35.5@sha256:ce977ae6d65918d0b58a5f8b5e940429c2ce42fa3a5619ec2bbc60b949c0ac95"
- kubernetes_version: "kubernetes:n-2"
- node_image: "docker.io/kindest/node:v1.32.8@sha256:abd489f042d2b644e2d033f5c2d900bc707798d075e8186cb65e3f1367a9d5a1"
+ node_image: "docker.io/kindest/node:v1.34.8@sha256:02722c2dedddcfc00febf5d27fbeb9b7b2c14294c82109ff4a85d89ac9ba3256"
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
# Fetch history for all tags and branches so we can figure out most
# recent release tag.
fetch-depth: 0
- name: Download image
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: image
path: image
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -200,7 +200,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -224,10 +224,10 @@ jobs:
- codegen
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -237,7 +237,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -251,7 +251,7 @@ jobs:
make check-coverage
- name: codeCoverage
if: ${{ success() }}
- uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
+ uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage.out
@@ -262,10 +262,10 @@ jobs:
- codegen
runs-on: macos-latest
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Windows)
@@ -275,7 +275,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -291,15 +291,15 @@ jobs:
runs-on: ubuntu-latest
needs: [build-image]
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Download image
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: image
path: image
- - uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
# * Module download cache
# * Build cache (Linux)
@@ -309,7 +309,7 @@ jobs:
key: ${{ runner.os }}-${{ github.job }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-${{ github.job }}-go-
- - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
+ - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version: ${{ env.GO_VERSION }}
cache: false
diff --git a/.github/workflows/request-reviews.yaml b/.github/workflows/request-reviews.yaml
deleted file mode 100644
index 467d23c7d73..00000000000
--- a/.github/workflows/request-reviews.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: Request Reviews
-
-on:
- pull_request_target:
- types: [opened, ready_for_review, reopened]
-
-permissions:
- contents: read
-
-jobs:
- request-reviews:
- runs-on: ubuntu-latest
- steps:
- - uses: necojackarc/auto-request-review@e89da1a8cd7c8c16d9de9c6e763290b6b0e3d424 # v0.13.0
- with:
- token: ${{ secrets.PAT_FOR_AUTO_REQUEST_REVIEW }}
- config: .github/reviewers.yaml
diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml
index f1bb1ec5a26..e8c08025c31 100644
--- a/.github/workflows/stale.yaml
+++ b/.github/workflows/stale.yaml
@@ -17,7 +17,7 @@ jobs:
issues: write
pull-requests: write
steps:
- - uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0
+ - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
exempt-all-milestones: true
diff --git a/.github/workflows/trivy-scan.yaml b/.github/workflows/trivy-scan.yaml
index f5c00861238..ad92831a752 100644
--- a/.github/workflows/trivy-scan.yaml
+++ b/.github/workflows/trivy-scan.yaml
@@ -17,17 +17,15 @@ jobs:
branch:
- main
- release-1.33
- - release-1.32
- - release-1.31
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
ref: ${{ matrix.branch }}
- - uses: aquasecurity/trivy-action@b6643a29fecd7f34b3597bc6acb0a98b03d33ff8 # 0.33.1
+ - uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # 0.36.0
with:
scanners: vuln
scan-type: 'fs'
@@ -35,6 +33,6 @@ jobs:
output: 'trivy-results.sarif'
ignore-unfixed: true
severity: 'HIGH,CRITICAL'
- - uses: github/codeql-action/upload-sarif@192325c86100d080feab897ff886c34abd4c83a3 # v3.29.5
+ - uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3.29.5
with:
sarif_file: 'trivy-results.sarif'
diff --git a/.github/workflows/welcome-new-contributors.yaml b/.github/workflows/welcome-new-contributors.yaml
deleted file mode 100644
index 4e9fb0d5c5c..00000000000
--- a/.github/workflows/welcome-new-contributors.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: 'Welcome New Contributors'
-
-on:
- issues:
- types: [opened]
- # Workloads with pull_request_target and the GitHub Token secret should never include executing untrusted code
- # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target
- # And https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
- pull_request_target:
- types: [opened]
-
-permissions:
- contents: read
-
-jobs:
- welcome-new-contributor:
- runs-on: ubuntu-latest
- permissions:
- issues: write
- pull-requests: write
- steps:
- - name: 'Greet the contributor'
- uses: garg3133/welcome-new-contributors@a38583ed8282e23d63d7bf919ca2d9fb95300ca6 # v1.2
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
- issue-message: >
- Hey @contributor_name! Thanks for opening your first issue. We appreciate your contribution and welcome you to our community!
- We are glad to have you here and to have your input on Contour.
- You can also join us on [our mailing list](https://groups.google.com/g/project-contour) and [in our channel](https://kubernetes.slack.com/archives/C8XRH2R4J)
- in the [Kubernetes Slack Workspace](https://communityinviter.com/apps/kubernetes/community)
- pr-message: >
- Hi @contributor_name! Welcome to our community and thank you for opening your first Pull Request.
- Someone will review it soon. Thank you for committing to making Contour better.
- You can also join us on [our mailing list](https://groups.google.com/g/project-contour) and [in our channel](https://kubernetes.slack.com/archives/C8XRH2R4J)
- in the [Kubernetes Slack Workspace](https://communityinviter.com/apps/kubernetes/community)
diff --git a/.golangci.yml b/.golangci.yml
index 3079a8055da..c12cd9df96c 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -107,6 +107,9 @@ linters:
- testifylint
path: test/e2e
text: require must only be used in the goroutine running the test function
+ - linters:
+ - staticcheck
+ text: "SA1019.*SubjectName.*migrate to using the plural field subjectNames"
paths:
- third_party$
- builtin$
diff --git a/Makefile b/Makefile
index fb612ff585f..14a0a3d528f 100644
--- a/Makefile
+++ b/Makefile
@@ -40,7 +40,7 @@ endif
IMAGE_PLATFORMS ?= linux/amd64,linux/arm64
# Base build image to use.
-BUILD_BASE_IMAGE ?= m.daocloud.io/docker.io/library/golang:1.25.1
+BUILD_BASE_IMAGE ?= m.daocloud.io/docker.io/library/golang:1.26.4@sha256:68cb6d68bed024785b69195b89af7ac7a444f27791435f98647edff595aa0479
# Enable build with CGO.
BUILD_CGO_ENABLED ?= 0
@@ -134,9 +134,9 @@ multiarch-build:
--build-arg "BUILD_CGO_ENABLED=$(BUILD_CGO_ENABLED)" \
--build-arg "BUILD_EXTRA_GO_LDFLAGS=$(BUILD_EXTRA_GO_LDFLAGS)" \
--build-arg "BUILD_GOEXPERIMENT=$(BUILD_GOEXPERIMENT)" \
- --label "commit.sync.upstream=3e57486" \
+ --label "commit.sync.upstream=da87188" \
$(DOCKER_BUILD_LABELS) \
- -t release-ci.daocloud.io/skoala/contour:v1.30.0-3e57486 \
+ -t release-ci.daocloud.io/skoala/contour:v1.33.5-da87188 \
$(shell pwd) \
--push
@@ -223,9 +223,9 @@ lint-flags:
.PHONY: format
format: ## Run gofumpt to format the codebase.
@echo Running gofumpt...
- @go run mvdan.cc/gofumpt@v0.5.0 -l -w -extra .
+ @go tool -modfile=tools/go.mod mvdan.cc/gofumpt -l -w -extra .
@echo Running gci...
- @go run github.com/daixiang0/gci@v0.12.1 write . --skip-generated -s standard -s default -s "prefix(github.com/projectcontour/contour)" --custom-order
+ @go tool -modfile=tools/go.mod github.com/daixiang0/gci write . --skip-generated -s standard -s default -s "prefix(github.com/projectcontour/contour)" --custom-order
.PHONY: generate
generate: ## Re-generate generated code and documentation
@@ -273,7 +273,7 @@ generate-metrics-docs:
.PHONY: generate-go
generate-go:
@echo "Generating mocks..."
- @go run github.com/vektra/mockery/v2
+ @go tool -modfile=tools/go.mod github.com/vektra/mockery/v2
.PHONY: check-generate
check-generate: generate
@@ -328,7 +328,7 @@ e2e: | setup-kind-cluster load-contour-image-kind run-e2e cleanup-kind ## Run E2
run-e2e:
CONTOUR_E2E_LOCAL_HOST=$(CONTOUR_E2E_LOCAL_HOST) \
CONTOUR_E2E_IMAGE=$(CONTOUR_E2E_IMAGE) \
- go run github.com/onsi/ginkgo/v2/ginkgo -tags=e2e -mod=readonly -skip-package=upgrade,bench -keep-going -randomize-suites -randomize-all -poll-progress-after=120s --focus '$(CONTOUR_E2E_TEST_FOCUS)' -r $(CONTOUR_E2E_PACKAGE_FOCUS)
+ go tool -modfile=tools/go.mod github.com/onsi/ginkgo/v2/ginkgo -tags=e2e -mod=readonly -skip-package=upgrade,bench -keep-going -randomize-suites -randomize-all -poll-progress-after=120s --focus '$(CONTOUR_E2E_TEST_FOCUS)' -r $(CONTOUR_E2E_PACKAGE_FOCUS)
.PHONY: cleanup-kind
cleanup-kind:
@@ -352,7 +352,7 @@ upgrade: | setup-kind-cluster load-contour-image-kind run-upgrade cleanup-kind #
run-upgrade:
CONTOUR_UPGRADE_FROM_VERSION=$(CONTOUR_UPGRADE_FROM_VERSION) \
CONTOUR_E2E_IMAGE=$(CONTOUR_E2E_IMAGE) \
- go run github.com/onsi/ginkgo/v2/ginkgo -tags=e2e -mod=readonly -randomize-all -poll-progress-after=300s -v ./test/e2e/upgrade
+ go tool -modfile=tools/go.mod github.com/onsi/ginkgo/v2/ginkgo -tags=e2e -mod=readonly -randomize-all -poll-progress-after=300s -v ./test/e2e/upgrade
.PHONY: check-ingress-conformance
check-ingress-conformance: | install-contour-working run-ingress-conformance cleanup-kind ## Run Ingress controller conformance
@@ -378,7 +378,7 @@ teardown-gcp-bench-cluster:
.PHONY: run-bench
run-bench:
- go run github.com/onsi/ginkgo/v2/ginkgo -tags=e2e -mod=readonly -keep-going -randomize-suites -randomize-all -poll-progress-after=4h -timeout=5h -r -v ./test/e2e/bench
+ go tool -modfile=tools/go.mod github.com/onsi/ginkgo/v2/ginkgo -tags=e2e -mod=readonly -keep-going -randomize-suites -randomize-all -poll-progress-after=4h -timeout=5h -r -v ./test/e2e/bench
.PHONY: bench
bench: deploy-gcp-bench-cluster run-bench teardown-gcp-bench-cluster
diff --git a/RELEASES.md b/RELEASES.md
index c950030d2ab..5c5ff42cac9 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -13,7 +13,7 @@ If for any reason this release cadence has to be adjusted (for example due to op
Patch releases are based on the major/minor release branch. There is no specific release cadence for patch releases. However, the project will create patch releases to address critical community and security issues (for example to address high severity security issues in Contour or in Envoy).The project will issue patch releases for all supported versions of Contour.
### Release Support Matrix
-Per the [Contour support policy](https://projectcontour.io/resources/support/), the project is in the process of transitioning to supporting three Contour releases. Please see the support policy page to see what versions are currently supported.
+Per the [Contour support policy](https://projectcontour.io/resources/support/), the project supports a single release track at a time. Please see the support policy page for details.
Also, please consult the [Contour Compatibility Matrix](https://projectcontour.io/resources/compatibility-matrix/) for details of what each version of Contour requires for each of its dependencies like Envoy, Kubernetes, and so on.
diff --git a/SITE_CONTRIBUTION.md b/SITE_CONTRIBUTION.md
index cd1105dd9ce..a36285808bb 100644
--- a/SITE_CONTRIBUTION.md
+++ b/SITE_CONTRIBUTION.md
@@ -58,8 +58,7 @@ A reference table, located at the end of the Markdown file, uses the following f
[4]: https://httpbin.org/
[5]: https://github.com/projectcontour/community/wiki/Office-Hours
[6]: {{< param slack_url >}}
-[7]: https://github.com/bitnami/charts/tree/master/bitnami/contour
-[8]: https://www.youtube.com/watch?v=xUJbTnN3Dmw
+[7]: https://www.youtube.com/watch?v=xUJbTnN3Dmw
```
## Using URL parameters
diff --git a/apis/projectcontour/v1/helpers.go b/apis/projectcontour/v1/helpers.go
index 63d83df146f..8b2bdcf8328 100644
--- a/apis/projectcontour/v1/helpers.go
+++ b/apis/projectcontour/v1/helpers.go
@@ -15,6 +15,7 @@ package v1
import (
"fmt"
+ "maps"
)
// AuthorizationConfigured returns whether authorization is
@@ -86,14 +87,10 @@ func (r *Route) GetPrefixReplacements() []ReplacePrefix {
func (r *Route) AuthorizationContext(parent map[string]string) map[string]string {
values := make(map[string]string, len(parent))
- for k, v := range parent {
- values[k] = v
- }
+ maps.Copy(values, parent)
if r.AuthPolicy != nil {
- for k, v := range r.AuthPolicy.Context {
- values[k] = v
- }
+ maps.Copy(values, r.AuthPolicy.Context)
}
if len(values) == 0 {
diff --git a/apis/projectcontour/v1/httpproxy.go b/apis/projectcontour/v1/httpproxy.go
index 597213c98f8..bcc89daf0ee 100644
--- a/apis/projectcontour/v1/httpproxy.go
+++ b/apis/projectcontour/v1/httpproxy.go
@@ -239,15 +239,39 @@ type ExtensionServiceReference struct {
Name string `json:"name,omitempty" protobuf:"bytes,3,opt,name=name"`
}
+// AuthorizationServiceType indicates the protocol
+// implemented by the external authorization server.
+type AuthorizationServiceType string
+
+const (
+ AuthorizationGRPCService AuthorizationServiceType = "grpc"
+ AuthorizationHTTPService AuthorizationServiceType = "http"
+)
+
// AuthorizationServer configures an external server to authenticate
// client requests. The external server must implement the v3 Envoy
-// external authorization GRPC protocol (https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto).
+// external authorization GRPC protocol (https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto)
+// or the HTTP authorization server protocol.
+// +kubebuilder:validation:XValidation:message="httpSettings can only be set when serviceType is 'http'",rule="!has(self.httpSettings) || self.serviceType == 'http'"
type AuthorizationServer struct {
// ExtensionServiceRef specifies the extension resource that will authorize client requests.
//
// +optional
ExtensionServiceRef ExtensionServiceReference `json:"extensionRef,omitempty"`
+ // ServiceType sets the protocol used to communicate with
+ // the external authorization server.
+ //
+ // +optional
+ // +kubebuilder:validation:Enum=http;grpc
+ // +kubebuilder:default=grpc
+ ServiceType AuthorizationServiceType `json:"serviceType,omitempty"`
+
+ // HTTPAuthorizationServerSettings defines configurations for interacting with an external HTTP authorization server.
+ //
+ // +optional
+ HTTPServerSettings *HTTPAuthorizationServerSettings `json:"httpSettings,omitempty"`
+
// AuthPolicy sets a default authorization policy for client requests.
// This policy will be used unless overridden by individual routes.
//
@@ -276,6 +300,64 @@ type AuthorizationServer struct {
WithRequestBody *AuthorizationServerBufferSettings `json:"withRequestBody,omitempty"`
}
+// HTTPAuthorizationServerSettings defines configurations for interacting with an external HTTP authorization server.
+type HTTPAuthorizationServerSettings struct {
+ // PathPrefix Sets a prefix to the value of authorization request header Path.
+ //
+ // +optional
+ PathPrefix string `json:"pathPrefix,omitempty"`
+
+ // AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ // Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ //
+ // +optional
+ AllowedAuthorizationHeaders []HTTPAuthorizationServerAllowedHeaders `json:"allowedAuthorizationHeaders,omitempty"`
+
+ // AllowedUpstreamHeaders specifies response headers from the authorization server
+ // that may be added to the original client request before sending it to the upstream.
+ //
+ // +optional
+ AllowedUpstreamHeaders []HTTPAuthorizationServerAllowedHeaders `json:"allowedUpstreamHeaders,omitempty"`
+}
+
+// HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+// in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+// experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+// +kubebuilder:validation:XValidation:message="only one of prefix, suffix, exact, and contains should be set in the allowedHeader",rule="(has(self.exact) ? 1 : 0) + (has(self.prefix) ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains) ? 1 : 0) == 1"
+type HTTPAuthorizationServerAllowedHeaders struct {
+ // Exact specifies a string that the header name must be equal to.
+ //
+ // +optional
+ Exact string `json:"exact,omitempty"`
+
+ // Prefix defines a prefix match for the header name.
+ //
+ // +optional
+ Prefix string `json:"prefix,omitempty"`
+
+ // Suffix defines a suffix match for a header name.
+ //
+ // +optional
+ Suffix string `json:"suffix,omitempty"`
+
+ // To streamline user experience and mitigate potential issues, we do not support regex.
+ // Additionally, it's essential to ensure that any regex patterns adhere to the configured runtime key, re2.max_program_size.error_level
+ // by verifying that the program size is smaller than the specified value.
+ // This necessitates thorough validation of user input.
+ //
+ // Regex string `json:"regex,omitempty"`
+
+ // Contains specifies a substring that must be present in the header name.
+ //
+ // +optional
+ Contains string `json:"contains,omitempty"`
+
+ // IgnoreCase specifies whether string matching should be case-insensitive.
+ //
+ // +optional
+ IgnoreCase bool `json:"ignoreCase,omitempty"`
+}
+
// AuthorizationServerBufferSettings enables ExtAuthz filter to buffer client request data and send it as part of authorization request
type AuthorizationServerBufferSettings struct {
// MaxRequestBytes sets the maximum size of message body ExtAuthz filter will hold in-memory.
@@ -565,6 +647,7 @@ type VirtualHost struct {
}
// JWTProvider defines how to verify JWTs on requests.
+// +kubebuilder:validation:XValidation:message="exactly one of remoteJWKS or localJWKS must be set",rule="(has(self.remoteJWKS) && !has(self.localJWKS)) || (!has(self.remoteJWKS) && has(self.localJWKS))"
type JWTProvider struct {
// Unique name for the provider.
// +kubebuilder:validation:Required
@@ -590,9 +673,13 @@ type JWTProvider struct {
// +optional
Audiences []string `json:"audiences,omitempty"`
- // Remote JWKS to use for verifying JWT signatures.
- // +kubebuilder:validation:Required
- RemoteJWKS RemoteJWKS `json:"remoteJWKS"`
+ // Remote JWKS fetches signing keys from an HTTP(S) endpoint.
+ // +optional
+ RemoteJWKS RemoteJWKS `json:"remoteJWKS,omitzero"`
+
+ // Local JWKS loads signing keys from a Kubernetes Secret.
+ // +optional
+ LocalJWKS LocalJWKS `json:"localJWKS,omitzero"`
// Whether the JWT should be forwarded to the backend
// service after successful verification. By default,
@@ -601,6 +688,19 @@ type JWTProvider struct {
ForwardJWT bool `json:"forwardJWT,omitempty"`
}
+// LocalJWKS defines how to fetch a JWKS from a Kubernetes secret.
+type LocalJWKS struct {
+ // The name of the secret that contains the JWKS.
+ // +kubebuilder:validation:Required
+ // +kubebuilder:validation:MinLength=1
+ SecretName string `json:"secretName"`
+
+ // The key of the secret that contains the JWKS.
+ // +kubebuilder:validation:Required
+ // +kubebuilder:validation:MinLength=1
+ Key string `json:"key"`
+}
+
// RemoteJWKS defines how to fetch a JWKS from an HTTP endpoint.
type RemoteJWKS struct {
// The URI for the JWKS.
@@ -1619,6 +1719,7 @@ type UpstreamValidation struct {
// +kubebuilder:validation:MaxLength=317
CACertificate string `json:"caSecret"`
// Key which is expected to be present in the 'subjectAltName' of the presented certificate.
+ //
// Deprecated: migrate to using the plural field subjectNames.
// +kubebuilder:validation:MinLength=1
// +kubebuilder:validation:MaxLength=250
diff --git a/apis/projectcontour/v1/zz_generated.deepcopy.go b/apis/projectcontour/v1/zz_generated.deepcopy.go
index f80ad8ad792..a47969a33fb 100644
--- a/apis/projectcontour/v1/zz_generated.deepcopy.go
+++ b/apis/projectcontour/v1/zz_generated.deepcopy.go
@@ -50,6 +50,11 @@ func (in *AuthorizationPolicy) DeepCopy() *AuthorizationPolicy {
func (in *AuthorizationServer) DeepCopyInto(out *AuthorizationServer) {
*out = *in
out.ExtensionServiceRef = in.ExtensionServiceRef
+ if in.HTTPServerSettings != nil {
+ in, out := &in.HTTPServerSettings, &out.HTTPServerSettings
+ *out = new(HTTPAuthorizationServerSettings)
+ (*in).DeepCopyInto(*out)
+ }
if in.AuthPolicy != nil {
in, out := &in.AuthPolicy, &out.AuthPolicy
*out = new(AuthorizationPolicy)
@@ -370,6 +375,46 @@ func (in *GlobalRateLimitPolicy) DeepCopy() *GlobalRateLimitPolicy {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *HTTPAuthorizationServerAllowedHeaders) DeepCopyInto(out *HTTPAuthorizationServerAllowedHeaders) {
+ *out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPAuthorizationServerAllowedHeaders.
+func (in *HTTPAuthorizationServerAllowedHeaders) DeepCopy() *HTTPAuthorizationServerAllowedHeaders {
+ if in == nil {
+ return nil
+ }
+ out := new(HTTPAuthorizationServerAllowedHeaders)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *HTTPAuthorizationServerSettings) DeepCopyInto(out *HTTPAuthorizationServerSettings) {
+ *out = *in
+ if in.AllowedAuthorizationHeaders != nil {
+ in, out := &in.AllowedAuthorizationHeaders, &out.AllowedAuthorizationHeaders
+ *out = make([]HTTPAuthorizationServerAllowedHeaders, len(*in))
+ copy(*out, *in)
+ }
+ if in.AllowedUpstreamHeaders != nil {
+ in, out := &in.AllowedUpstreamHeaders, &out.AllowedUpstreamHeaders
+ *out = make([]HTTPAuthorizationServerAllowedHeaders, len(*in))
+ copy(*out, *in)
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPAuthorizationServerSettings.
+func (in *HTTPAuthorizationServerSettings) DeepCopy() *HTTPAuthorizationServerSettings {
+ if in == nil {
+ return nil
+ }
+ out := new(HTTPAuthorizationServerSettings)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *HTTPDirectResponsePolicy) DeepCopyInto(out *HTTPDirectResponsePolicy) {
*out = *in
@@ -737,6 +782,7 @@ func (in *JWTProvider) DeepCopyInto(out *JWTProvider) {
copy(*out, *in)
}
in.RemoteJWKS.DeepCopyInto(&out.RemoteJWKS)
+ out.LocalJWKS = in.LocalJWKS
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JWTProvider.
@@ -786,6 +832,21 @@ func (in *LoadBalancerPolicy) DeepCopy() *LoadBalancerPolicy {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalJWKS) DeepCopyInto(out *LocalJWKS) {
+ *out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalJWKS.
+func (in *LocalJWKS) DeepCopy() *LocalJWKS {
+ if in == nil {
+ return nil
+ }
+ out := new(LocalJWKS)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *LocalRateLimitPolicy) DeepCopyInto(out *LocalRateLimitPolicy) {
*out = *in
diff --git a/apis/projectcontour/v1alpha1/accesslog.go b/apis/projectcontour/v1alpha1/accesslog.go
index ab65f7e9651..65a22a2990d 100644
--- a/apis/projectcontour/v1alpha1/accesslog.go
+++ b/apis/projectcontour/v1alpha1/accesslog.go
@@ -63,6 +63,8 @@ var jsonFields = map[string]string{
"user_agent": "%REQ(USER-AGENT)%",
"x_forwarded_for": "%REQ(X-FORWARDED-FOR)%",
"x_trace_id": "%REQ(X-TRACE-ID)%",
+ "tls_ja3_fingerprint": "%TLS_JA3_FINGERPRINT%",
+ "tls_ja4_fingerprint": "%TLS_JA4_FINGERPRINT%",
"contour_config_kind": "%METADATA(ROUTE:envoy.access_loggers.file:io.projectcontour.kind)%",
"contour_config_namespace": "%METADATA(ROUTE:envoy.access_loggers.file:io.projectcontour.namespace)%",
"contour_config_name": "%METADATA(ROUTE:envoy.access_loggers.file:io.projectcontour.name)%",
@@ -122,6 +124,8 @@ var envoySimpleOperators = map[string]struct{}{
"RESPONSE_TX_DURATION": {},
"ROUTE_NAME": {},
"START_TIME": {},
+ "TLS_JA3_FINGERPRINT": {},
+ "TLS_JA4_FINGERPRINT": {},
"UPSTREAM_CLUSTER": {},
"UPSTREAM_FILTER_STATE": {},
"UPSTREAM_HEADER_BYTES_RECEIVED": {},
@@ -289,7 +293,7 @@ func (s AccessLogFormatString) Validate() error {
// 2. Operator Name: "START_TIME"
// 3. Arguments: "(%s)"
// 4. Truncation length: ":3"
-var commandOperatorRegexp = regexp.MustCompile(`%(([A-Z_]+)(\([^)]+\)(:[0-9]+)?)?%)?`)
+var commandOperatorRegexp = regexp.MustCompile(`%(([A-Z0-9_]+)(\([^)]+\)(:[0-9]+)?)?%)?`)
func parseAccessLogFormatString(format string) error {
// FindAllStringSubmatch will always return a slice with matches where every slice is a slice
diff --git a/apis/projectcontour/v1alpha1/accesslog_test.go b/apis/projectcontour/v1alpha1/accesslog_test.go
index eed731970cf..98e5aa297f6 100644
--- a/apis/projectcontour/v1alpha1/accesslog_test.go
+++ b/apis/projectcontour/v1alpha1/accesslog_test.go
@@ -80,6 +80,10 @@ func TestValidateAccessLogJSONFields(t *testing.T) {
{"dog=pug", "cat=black"},
{"grpc_status"},
{"grpc_status_number"},
+ {"tls_ja3_fingerprint"},
+ {"tls_ja4_fingerprint"},
+ {"@timestamp", "ja3=%TLS_JA3_FINGERPRINT%"},
+ {"@timestamp", "ja4=%TLS_JA4_FINGERPRINT%"},
}
for _, c := range successCases {
@@ -133,6 +137,9 @@ func TestAccessLogFormatString(t *testing.T) {
"%UPSTREAM_PEER_CERT_V_END%\n",
"%UPSTREAM_PEER_CERT%\n",
"%UPSTREAM_FILTER_STATE%\n",
+ "%TLS_JA3_FINGERPRINT%\n",
+ "%TLS_JA4_FINGERPRINT%\n",
+ "ja3=%TLS_JA3_FINGERPRINT% ja4=%TLS_JA4_FINGERPRINT%\n",
}
for _, c := range successCases {
diff --git a/apis/projectcontour/v1alpha1/contourconfig.go b/apis/projectcontour/v1alpha1/contourconfig.go
index e8070f3a46e..2d4f64e5dcc 100644
--- a/apis/projectcontour/v1alpha1/contourconfig.go
+++ b/apis/projectcontour/v1alpha1/contourconfig.go
@@ -410,7 +410,7 @@ type EnvoyListenerConfig struct {
// TLS holds various configurable Envoy TLS listener values.
// +optional
- TLS *EnvoyTLS `json:"tls,omitempty"`
+ TLS *EnvoyListenerTLS `json:"tls,omitempty"`
// SocketOptions defines configurable socket options for the listeners.
// Single set of options are applied to all listeners.
@@ -465,7 +465,8 @@ type SocketOptions struct {
TrafficClass int32 `json:"trafficClass,omitempty"`
}
-// EnvoyTLS describes tls parameters for Envoy listneners.
+// EnvoyTLS describes TLS protocol parameters shared between
+// listener and upstream TLS contexts.
type EnvoyTLS struct {
// MinimumProtocolVersion is the minimum TLS version this vhost should
// negotiate.
@@ -524,6 +525,46 @@ type EnvoyTLS struct {
CipherSuites []string `json:"cipherSuites,omitempty"`
}
+// EnvoyListenerTLS describes TLS parameters for Envoy listeners.
+// It extends EnvoyTLS with listener-specific settings like TLS fingerprinting.
+type EnvoyListenerTLS struct {
+ EnvoyTLS `json:",inline"`
+
+ // Fingerprint defines TLS fingerprinting configuration
+ // for the TLS Inspector listener filter.
+ // +optional
+ Fingerprint *TLSFingerprint `json:"fingerprint,omitempty"`
+}
+
+// TLSFingerprint defines TLS fingerprinting configuration for the TLS Inspector.
+type TLSFingerprint struct {
+ // JA3 enables JA3 fingerprinting in the TLS Inspector.
+ // When true, populates JA3 hash in dynamic metadata.
+ // +optional
+ JA3 *bool `json:"ja3,omitempty"`
+
+ // JA4 enables JA4 fingerprinting in the TLS Inspector.
+ // When true, populates JA4 hash in dynamic metadata.
+ // +optional
+ JA4 *bool `json:"ja4,omitempty"`
+}
+
+// GetJA3 returns the JA3 fingerprinting setting, or nil if not configured.
+func (t *EnvoyListenerTLS) GetJA3() *bool {
+ if t == nil || t.Fingerprint == nil {
+ return nil
+ }
+ return t.Fingerprint.JA3
+}
+
+// GetJA4 returns the JA4 fingerprinting setting, or nil if not configured.
+func (t *EnvoyListenerTLS) GetJA4() *bool {
+ if t == nil || t.Fingerprint == nil {
+ return nil
+ }
+ return t.Fingerprint.JA4
+}
+
// EnvoyListener defines parameters for an Envoy Listener.
type EnvoyListener struct {
// Defines an Envoy Listener Address.
@@ -830,6 +871,16 @@ type TracingConfig struct {
// +optional
OverallSampling *string `json:"overallSampling,omitempty"`
+ // ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ // contour's default is 100.
+ // +optional
+ ClientSampling *string `json:"clientSampling,omitempty"`
+
+ // RandomSampling defines the random sampling rate for all requests.
+ // contour's default is 100.
+ // +optional
+ RandomSampling *string `json:"randomSampling,omitempty"`
+
// MaxPathTagLength defines maximum length of the request path
// to extract and include in the HttpUrl tag.
// contour's default is 256.
diff --git a/apis/projectcontour/v1alpha1/contourconfig_helpers.go b/apis/projectcontour/v1alpha1/contourconfig_helpers.go
index 3e980ed38ca..4b04fc7c6c1 100644
--- a/apis/projectcontour/v1alpha1/contourconfig_helpers.go
+++ b/apis/projectcontour/v1alpha1/contourconfig_helpers.go
@@ -64,6 +64,20 @@ func (t *TracingConfig) Validate() error {
}
}
+ if t.ClientSampling != nil {
+ _, err := strconv.ParseFloat(*t.ClientSampling, 64)
+ if err != nil {
+ return fmt.Errorf("invalid tracing client sampling: %v", err)
+ }
+ }
+
+ if t.RandomSampling != nil {
+ _, err := strconv.ParseFloat(*t.RandomSampling, 64)
+ if err != nil {
+ return fmt.Errorf("invalid tracing random sampling: %v", err)
+ }
+ }
+
var customTagNames []string
for _, customTag := range t.CustomTags {
@@ -179,7 +193,7 @@ func ValidateTLSProtocolVersions(minVersion, maxVersion string) error {
func isValidTLSCipher(cipherSpec string) bool {
// Equal-preference group: [cipher1|cipher2|...]
if strings.HasPrefix(cipherSpec, "[") && strings.HasSuffix(cipherSpec, "]") {
- for _, cipher := range strings.Split(strings.Trim(cipherSpec, "[]"), "|") {
+ for cipher := range strings.SplitSeq(strings.Trim(cipherSpec, "[]"), "|") {
if _, ok := ValidTLSCiphers[cipher]; !ok {
return false
}
diff --git a/apis/projectcontour/v1alpha1/contourconfig_helpers_test.go b/apis/projectcontour/v1alpha1/contourconfig_helpers_test.go
index ff3afd005f5..6c09b69d2f9 100644
--- a/apis/projectcontour/v1alpha1/contourconfig_helpers_test.go
+++ b/apis/projectcontour/v1alpha1/contourconfig_helpers_test.go
@@ -93,7 +93,7 @@ func TestContourConfigurationSpecValidate(t *testing.T) {
c = contour_v1alpha1.ContourConfigurationSpec{
Envoy: &contour_v1alpha1.EnvoyConfig{
Listener: &contour_v1alpha1.EnvoyListenerConfig{
- TLS: &contour_v1alpha1.EnvoyTLS{},
+ TLS: &contour_v1alpha1.EnvoyListenerTLS{},
},
},
}
@@ -200,6 +200,18 @@ func TestContourConfigurationSpecValidate(t *testing.T) {
c.Tracing.OverallSampling = ptr.To("10")
require.NoError(t, c.Validate())
+ c.Tracing.ClientSampling = ptr.To("invalid")
+ require.Error(t, c.Validate())
+
+ c.Tracing.ClientSampling = ptr.To("20")
+ require.NoError(t, c.Validate())
+
+ c.Tracing.RandomSampling = ptr.To("not-a-number")
+ require.Error(t, c.Validate())
+
+ c.Tracing.RandomSampling = ptr.To("30")
+ require.NoError(t, c.Validate())
+
customTags := []*contour_v1alpha1.CustomTag{
{
TagName: "first tag",
diff --git a/apis/projectcontour/v1alpha1/contourdeployment.go b/apis/projectcontour/v1alpha1/contourdeployment.go
index d792ef37f09..38bf950e237 100644
--- a/apis/projectcontour/v1alpha1/contourdeployment.go
+++ b/apis/projectcontour/v1alpha1/contourdeployment.go
@@ -335,7 +335,7 @@ type NetworkPublishing struct {
// If unset, defaults to "Local".
//
// +optional
- ExternalTrafficPolicy core_v1.ServiceExternalTrafficPolicyType `json:"externalTrafficPolicy,omitempty"`
+ ExternalTrafficPolicy core_v1.ServiceExternalTrafficPolicy `json:"externalTrafficPolicy,omitempty"`
// IPFamilyPolicy represents the dual-stack-ness requested or required by
// this Service. If there is no value provided, then this field will be set
diff --git a/apis/projectcontour/v1alpha1/extensionservice.go b/apis/projectcontour/v1alpha1/extensionservice.go
index c074de546e7..c936f98c786 100644
--- a/apis/projectcontour/v1alpha1/extensionservice.go
+++ b/apis/projectcontour/v1alpha1/extensionservice.go
@@ -62,7 +62,7 @@ type ExtensionServiceTarget struct {
// ExtensionServiceSpec defines the desired state of an ExtensionService resource.
type ExtensionServiceSpec struct {
// Services specifies the set of Kubernetes Service resources that
- // receive GRPC extension API requests.
+ // receive extension API requests.
// If no weights are specified for any of the entries in
// this array, traffic will be spread evenly across all the
// services.
@@ -78,15 +78,15 @@ type ExtensionServiceSpec struct {
UpstreamValidation *contour_v1.UpstreamValidation `json:"validation,omitempty"`
// Protocol may be used to specify (or override) the protocol used to reach this Service.
- // Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+ // Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.
//
// +optional
- // +kubebuilder:validation:Enum=h2;h2c
+ // +kubebuilder:validation:Enum=http/1.1;h2;h2c
Protocol *string `json:"protocol,omitempty"`
- // The policy for load balancing GRPC service requests. Note that the
+ // The policy for load balancing service requests. Note that the
// `Cookie` and `RequestHash` load balancing strategies cannot be used
- // here.
+ // here for GRPC service requests.
//
// +optional
LoadBalancerPolicy *contour_v1.LoadBalancerPolicy `json:"loadBalancerPolicy,omitempty"`
diff --git a/apis/projectcontour/v1alpha1/zz_generated.deepcopy.go b/apis/projectcontour/v1alpha1/zz_generated.deepcopy.go
index 76811476e39..b8b985cd8d2 100644
--- a/apis/projectcontour/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/projectcontour/v1alpha1/zz_generated.deepcopy.go
@@ -654,7 +654,7 @@ func (in *EnvoyListenerConfig) DeepCopyInto(out *EnvoyListenerConfig) {
}
if in.TLS != nil {
in, out := &in.TLS, &out.TLS
- *out = new(EnvoyTLS)
+ *out = new(EnvoyListenerTLS)
(*in).DeepCopyInto(*out)
}
if in.SocketOptions != nil {
@@ -689,6 +689,27 @@ func (in *EnvoyListenerConfig) DeepCopy() *EnvoyListenerConfig {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EnvoyListenerTLS) DeepCopyInto(out *EnvoyListenerTLS) {
+ *out = *in
+ in.EnvoyTLS.DeepCopyInto(&out.EnvoyTLS)
+ if in.Fingerprint != nil {
+ in, out := &in.Fingerprint, &out.Fingerprint
+ *out = new(TLSFingerprint)
+ (*in).DeepCopyInto(*out)
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvoyListenerTLS.
+func (in *EnvoyListenerTLS) DeepCopy() *EnvoyListenerTLS {
+ if in == nil {
+ return nil
+ }
+ out := new(EnvoyListenerTLS)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EnvoyLogging) DeepCopyInto(out *EnvoyLogging) {
*out = *in
@@ -1293,6 +1314,31 @@ func (in *TLS) DeepCopy() *TLS {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TLSFingerprint) DeepCopyInto(out *TLSFingerprint) {
+ *out = *in
+ if in.JA3 != nil {
+ in, out := &in.JA3, &out.JA3
+ *out = new(bool)
+ **out = **in
+ }
+ if in.JA4 != nil {
+ in, out := &in.JA4, &out.JA4
+ *out = new(bool)
+ **out = **in
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSFingerprint.
+func (in *TLSFingerprint) DeepCopy() *TLSFingerprint {
+ if in == nil {
+ return nil
+ }
+ out := new(TLSFingerprint)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TimeoutParameters) DeepCopyInto(out *TimeoutParameters) {
*out = *in
@@ -1361,6 +1407,16 @@ func (in *TracingConfig) DeepCopyInto(out *TracingConfig) {
*out = new(string)
**out = **in
}
+ if in.ClientSampling != nil {
+ in, out := &in.ClientSampling, &out.ClientSampling
+ *out = new(string)
+ **out = **in
+ }
+ if in.RandomSampling != nil {
+ in, out := &in.RandomSampling, &out.RandomSampling
+ *out = new(string)
+ **out = **in
+ }
if in.MaxPathTagLength != nil {
in, out := &in.MaxPathTagLength, &out.MaxPathTagLength
*out = new(uint32)
diff --git a/changelogs/CHANGELOG-v1.31.3.md b/changelogs/CHANGELOG-v1.31.3.md
new file mode 100644
index 00000000000..65c1eddd654
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.31.3.md
@@ -0,0 +1,26 @@
+We are delighted to present version v1.31.3 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Updates Envoy to v1.34.12. See the [Envoy release notes](https://www.envoyproxy.io/docs/envoy/v1.34.12/version_history/v1.34/v1.34) for more information about the content of the release.
+- Updates Go to v1.24.11. See the [Go release notes](https://go.dev/doc/devel/release#go1.24.minor) for more information about the content of the release.
+
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+
+# Compatible Kubernetes Versions
+
+Contour v1.31.3 is tested against Kubernetes 1.30 through 1.32.
+
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.31.4.md b/changelogs/CHANGELOG-v1.31.4.md
new file mode 100644
index 00000000000..84504843c19
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.31.4.md
@@ -0,0 +1,26 @@
+We are delighted to present version v1.31.4 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Updates Go to v1.24.13. See the [Go release notes](https://go.dev/doc/devel/release#go1.24.minor) for more information about the content of the release.
+- Fixes load balancer status update failures caused by `HTTPProxy` CRD schema incorrectly marking `status.loadBalancer.ingress[].ports[].error` as a required field. (#7408)
+
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+
+# Compatible Kubernetes Versions
+
+Contour v1.31.4 is tested against Kubernetes 1.30 through 1.32.
+
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.31.5.md b/changelogs/CHANGELOG-v1.31.5.md
new file mode 100644
index 00000000000..874ede762b9
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.31.5.md
@@ -0,0 +1,24 @@
+We are delighted to present version v1.31.5 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Bumps to Envoy [v1.34.13](https://github.com/envoyproxy/envoy/releases/tag/v1.34.13) to address security vulnerabilities and improve stability.
+- Updates `google.golang.org/grpc` to [v1.79.3](https://github.com/grpc/grpc-go/releases/tag/v1.79.3), which addresses [CVE-2026-33186](https://github.com/grpc/grpc-go/security/advisories/GHSA-p77j-4mvh-x3m3) (Contour is not affected).
+- Removes Envoy metrics `hostPort: 8002` from example manifests. (#7476)
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.31.5 is tested against Kubernetes 1.30 through 1.32.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.31.6.md b/changelogs/CHANGELOG-v1.31.6.md
new file mode 100644
index 00000000000..0e717428e44
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.31.6.md
@@ -0,0 +1,32 @@
+We are delighted to present version v1.31.6 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+## Security fix for CVE-2026-41246
+
+This release fixes [CVE-2026-41246](https://github.com/projectcontour/contour/security/advisories/GHSA-x4mj-7f9g-29h4), a Lua code injection vulnerability in Contour's [Cookie Rewriting](https://projectcontour.io/docs/1.31/config/cookie-rewriting/) feature.
+
+An attacker with RBAC permissions to create or modify HTTPProxy resources could craft a malicious `cookieRewritePolicies[].pathRewrite.value` that results in arbitrary code execution in the Envoy proxy. Since Envoy runs as shared infrastructure, the injected code could read Envoy's xDS client credentials from the filesystem or cause denial of service for other tenants sharing the Envoy instance.
+
+The fix escapes user-provided values before interpolation into Lua code.
+
+## Other Changes
+
+- Bumps to Envoy [v1.34.14](https://github.com/envoyproxy/envoy/releases/tag/v1.34.14).
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.31.6 is tested against Kubernetes 1.30 through 1.32.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.32.2.md b/changelogs/CHANGELOG-v1.32.2.md
new file mode 100644
index 00000000000..7d5ead0fe0e
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.32.2.md
@@ -0,0 +1,26 @@
+We are delighted to present version v1.32.2 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Updates Envoy to v1.34.12. See the [Envoy release notes](https://www.envoyproxy.io/docs/envoy/v1.34.12/version_history/v1.34/v1.34) for more information about the content of the release.
+- Updates Go to v1.24.11. See the [Go release notes](https://go.dev/doc/devel/release#go1.24.minor) for more information about the content of the release.
+
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+
+# Compatible Kubernetes Versions
+
+Contour v1.32.2 is tested against Kubernetes 1.31 through 1.33.
+
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.32.3.md b/changelogs/CHANGELOG-v1.32.3.md
new file mode 100644
index 00000000000..7ab213174bf
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.32.3.md
@@ -0,0 +1,26 @@
+We are delighted to present version v1.32.3 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Updates Go to v1.24.13. See the [Go release notes](https://go.dev/doc/devel/release#go1.24.minor) for more information about the content of the release.
+- Fixes load balancer status update failures caused by `HTTPProxy` CRD schema incorrectly marking `status.loadBalancer.ingress[].ports[].error` as a required field. (#7408)
+
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+
+# Compatible Kubernetes Versions
+
+Contour v1.32.3 is tested against Kubernetes 1.31 through 1.33.
+
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.32.4.md b/changelogs/CHANGELOG-v1.32.4.md
new file mode 100644
index 00000000000..badf7bece08
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.32.4.md
@@ -0,0 +1,24 @@
+We are delighted to present version v1.32.4 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Bumps to Envoy [v1.34.13](https://github.com/envoyproxy/envoy/releases/tag/v1.34.13) to address security vulnerabilities and improve stability.
+- Updates `google.golang.org/grpc` to [v1.79.3](https://github.com/grpc/grpc-go/releases/tag/v1.79.3), which addresses [CVE-2026-33186](https://github.com/grpc/grpc-go/security/advisories/GHSA-p77j-4mvh-x3m3) (Contour is not affected).
+- Removes Envoy metrics `hostPort: 8002` from example manifests. (#7476)
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.32.4 is tested against Kubernetes 1.31 through 1.33.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.32.5.md b/changelogs/CHANGELOG-v1.32.5.md
new file mode 100644
index 00000000000..84c6440d1d6
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.32.5.md
@@ -0,0 +1,32 @@
+We are delighted to present version v1.32.5 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+## Security fix for CVE-2026-41246
+
+This release fixes [CVE-2026-41246](https://github.com/projectcontour/contour/security/advisories/GHSA-x4mj-7f9g-29h4), a Lua code injection vulnerability in Contour's [Cookie Rewriting](https://projectcontour.io/docs/1.32/config/cookie-rewriting/) feature.
+
+An attacker with RBAC permissions to create or modify HTTPProxy resources could craft a malicious `cookieRewritePolicies[].pathRewrite.value` that results in arbitrary code execution in the Envoy proxy. Since Envoy runs as shared infrastructure, the injected code could read Envoy's xDS client credentials from the filesystem or cause denial of service for other tenants sharing the Envoy instance.
+
+The fix escapes user-provided values before interpolation into Lua code.
+
+## Other Changes
+
+- Bumps to Envoy [v1.34.14](https://github.com/envoyproxy/envoy/releases/tag/v1.34.14).
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.32.5 is tested against Kubernetes 1.31 through 1.33.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.33.1.md b/changelogs/CHANGELOG-v1.33.1.md
new file mode 100644
index 00000000000..a847d06fae2
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.33.1.md
@@ -0,0 +1,26 @@
+We are delighted to present version v1.33.1 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Updates Envoy to v1.35.8. See the [Envoy release notes](https://www.envoyproxy.io/docs/envoy/v1.35.8/version_history/v1.35/v1.35) for more information about the content of the release.
+- Updates Go to v1.25.5. See the [Go release notes](https://go.dev/doc/devel/release#go1.25.minor) for more information about the content of the release.
+
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+
+# Compatible Kubernetes Versions
+
+Contour v1.33.1 is tested against Kubernetes 1.32 through 1.34.
+
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.33.2.md b/changelogs/CHANGELOG-v1.33.2.md
new file mode 100644
index 00000000000..7b5c5e84886
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.33.2.md
@@ -0,0 +1,27 @@
+We are delighted to present version v1.33.2 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Updates Go to v1.25.7. See the [Go release notes](https://go.dev/doc/devel/release#go1.25.minor) for more information about the content of the release.
+- Fixes load balancer status update failures caused by `HTTPProxy` CRD schema incorrectly marking `status.loadBalancer.ingress[].ports[].error` as a required field. (#7408)
+- Increases CPU limit for the `shutdown-manager` container from `50m` to `200m` when using the Contour Gateway Provisioner, to prevent CPU throttling. (#7382)
+
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+
+# Compatible Kubernetes Versions
+
+Contour v1.33.2 is tested against Kubernetes 1.32 through 1.34.
+
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.33.3.md b/changelogs/CHANGELOG-v1.33.3.md
new file mode 100644
index 00000000000..e42b8cab71d
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.33.3.md
@@ -0,0 +1,24 @@
+We are delighted to present version v1.33.3 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+- Bumps to Envoy [v1.35.9](https://github.com/envoyproxy/envoy/releases/tag/v1.35.9) to address security vulnerabilities.
+- Updates `google.golang.org/grpc` to [v1.79.3](https://github.com/grpc/grpc-go/releases/tag/v1.79.3), which addresses [CVE-2026-33186](https://github.com/grpc/grpc-go/security/advisories/GHSA-p77j-4mvh-x3m3) (Contour is not affected).
+- Removes Envoy metrics `hostPort: 8002` from example manifests. (#7476)
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.33.3 is tested against Kubernetes 1.32 through 1.34.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.33.4.md b/changelogs/CHANGELOG-v1.33.4.md
new file mode 100644
index 00000000000..9a453eebe3c
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.33.4.md
@@ -0,0 +1,34 @@
+We are delighted to present version v1.33.4 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+## Security fix for CVE-2026-41246
+
+This release fixes [CVE-2026-41246](https://github.com/projectcontour/contour/security/advisories/GHSA-x4mj-7f9g-29h4), a Lua code injection vulnerability in Contour's [Cookie Rewriting](https://projectcontour.io/docs/1.33/config/cookie-rewriting/) feature.
+
+An attacker with RBAC permissions to create or modify HTTPProxy resources could craft a malicious `cookieRewritePolicies[].pathRewrite.value` that results in arbitrary code execution in the Envoy proxy. Since Envoy runs as shared infrastructure, the injected code could read Envoy's xDS client credentials from the filesystem or cause denial of service for other tenants sharing the Envoy instance.
+
+The fix removes the use of `text/template` for generating Lua code entirely. User-provided values are now passed as structured data via Envoy's `filterContext` and read by a static Lua script at runtime.
+
+*Note: This release requires Envoy 1.35.0 or later.*
+
+## Other Changes
+
+- Bumps to Envoy [v1.35.10](https://github.com/envoyproxy/envoy/releases/tag/v1.35.10).
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.33.4 is tested against Kubernetes 1.32 through 1.34.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/CHANGELOG-v1.33.5.md b/changelogs/CHANGELOG-v1.33.5.md
new file mode 100644
index 00000000000..3a2262b4207
--- /dev/null
+++ b/changelogs/CHANGELOG-v1.33.5.md
@@ -0,0 +1,29 @@
+We are delighted to present version v1.33.5 of Contour, our layer 7 HTTP reverse proxy for Kubernetes clusters.
+
+- [All Changes](#all-changes)
+- [Installing/Upgrading](#installing-and-upgrading)
+- [Compatible Kubernetes Versions](#compatible-kubernetes-versions)
+
+# All Changes
+
+## Security fix for [GHSA-g3xr-5w5j-w4q4](https://github.com/projectcontour/contour/security/advisories/GHSA-g3xr-5w5j-w4q4)
+
+Fixes a bug where configuring fallback certificate with JWT verification in `HTTPProxy` allowed requests without TLS SNI or with unrecognized SNI to bypass JWT verification. Contour now rejects this invalid configuration.
+
+## Other Changes
+
+- Bumps Go to 1.25.10.
+- Bumps golang.org/x/net to v0.55.0.
+
+# Installing and Upgrading
+
+For a fresh install of Contour, consult the [getting started documentation](https://projectcontour.io/getting-started/).
+
+To upgrade an existing Contour installation, please consult the [upgrade documentation](https://projectcontour.io/resources/upgrading/).
+
+# Compatible Kubernetes Versions
+
+Contour v1.33.5 is tested against Kubernetes 1.32 through 1.34.
+
+# Are you a Contour user? We would love to know!
+If you're using Contour and want to add your organization to our adopters list, please visit this [page](https://projectcontour.io/resources/adopters/). If you prefer to keep your organization name anonymous but still give us feedback into your usage and scenarios for Contour, please post on this [GitHub thread](https://github.com/projectcontour/contour/issues/1269).
diff --git a/changelogs/unreleased/7279-tsaarni-small.md b/changelogs/unreleased/7279-tsaarni-small.md
new file mode 100644
index 00000000000..d140b61b702
--- /dev/null
+++ b/changelogs/unreleased/7279-tsaarni-small.md
@@ -0,0 +1 @@
+Updates Envoy to v1.35.6. See the [Envoy release notes](https://www.envoyproxy.io/docs/envoy/v1.35.6/version_history/v1.35/v1.35.6) for more information about the content of the release.
diff --git a/changelogs/unreleased/7283-ShivamJha2436-small.md b/changelogs/unreleased/7283-ShivamJha2436-small.md
new file mode 100644
index 00000000000..3eea1ee720b
--- /dev/null
+++ b/changelogs/unreleased/7283-ShivamJha2436-small.md
@@ -0,0 +1 @@
+Removed deprecated preserveUnknownFields field from CRDs.
diff --git a/changelogs/unreleased/7372-WUMUXIAN-minor.md b/changelogs/unreleased/7372-WUMUXIAN-minor.md
new file mode 100644
index 00000000000..c44ac26d8e9
--- /dev/null
+++ b/changelogs/unreleased/7372-WUMUXIAN-minor.md
@@ -0,0 +1,5 @@
+Make it possible to enable TLS fingerprinting in Envoy's TLS Inspector Listener filter, useful for security monitoring, analytics, and bot detection. Provides independent control over JA3 and JA4 fingerprinting methods.
+
+Fingerprints can be consumed by:
+- Logging in access logs using `%TLS_JA3_FINGERPRINT%` / `%TLS_JA4_FINGERPRINT%` format operators or the `tls_ja3_fingerprint` / `tls_ja4_fingerprint` JSON log fields.
+- Setting dynamic request headers to forward fingerprints to backend services (e.g. `%TLS_JA3_FINGERPRINT%` / `%TLS_JA4_FINGERPRINT%` in header policy values).
diff --git a/changelogs/unreleased/7373-WUMUXIAN-minor.md b/changelogs/unreleased/7373-WUMUXIAN-minor.md
new file mode 100644
index 00000000000..16f8c821232
--- /dev/null
+++ b/changelogs/unreleased/7373-WUMUXIAN-minor.md
@@ -0,0 +1,3 @@
+## Allow configurable client_sampling and random_sampling for tracing
+
+Added support for configuring client_sampling and random_sampling in Contour's tracing configuration, allowing more granular control over trace sampling rates as per Envoy's tracing documentation.
diff --git a/changelogs/unreleased/7382-tsaarni-small.md b/changelogs/unreleased/7382-tsaarni-small.md
new file mode 100644
index 00000000000..ea151c817d2
--- /dev/null
+++ b/changelogs/unreleased/7382-tsaarni-small.md
@@ -0,0 +1 @@
+Gateway Provisioner: Increase the `shutdown-manager` CPU limit to 200m to reduce throttling during Envoy shutdown.
diff --git a/changelogs/unreleased/7408-tsaarni-small.md b/changelogs/unreleased/7408-tsaarni-small.md
new file mode 100644
index 00000000000..d2e6ee3b53f
--- /dev/null
+++ b/changelogs/unreleased/7408-tsaarni-small.md
@@ -0,0 +1 @@
+Fix `HTTPProxy` CRD schema incorrectly marking `status.loadBalancer.ingress[].ports[].error` as required, causing load balancer status update failures.
diff --git a/changelogs/unreleased/7418-therealak12-minor.md b/changelogs/unreleased/7418-therealak12-minor.md
new file mode 100644
index 00000000000..8b33df50489
--- /dev/null
+++ b/changelogs/unreleased/7418-therealak12-minor.md
@@ -0,0 +1,5 @@
+## Contour now supports HTTP external authorization services
+
+With this change, Contour supports HTTP external authorization services in addition to gRPC.
+This expands compatibility with a broader range of authorization providers and
+allows operators to choose the protocol that best fits their environment.
diff --git a/changelogs/unreleased/7459-tsaarni-small.md b/changelogs/unreleased/7459-tsaarni-small.md
new file mode 100644
index 00000000000..f23d91f25dc
--- /dev/null
+++ b/changelogs/unreleased/7459-tsaarni-small.md
@@ -0,0 +1 @@
+Updates Envoy to v1.37.1 (from the 1.35 track). See the [Envoy 1.36 release notes](https://www.envoyproxy.io/docs/envoy/v1.36.5/version_history/v1.36/v1.36) and [Envoy 1.37 release notes](https://www.envoyproxy.io/docs/envoy/v1.37.1/version_history/v1.37/v1.37.1) for more information about the content of the releases.
diff --git a/changelogs/unreleased/7476-tsaarni-small.md b/changelogs/unreleased/7476-tsaarni-small.md
new file mode 100644
index 00000000000..437037b0c1e
--- /dev/null
+++ b/changelogs/unreleased/7476-tsaarni-small.md
@@ -0,0 +1 @@
+Remove the Envoy stats `hostPort` from the example manifests. This port is typically needed only for in-cluster access and should not be exposed on the host network.
diff --git a/changelogs/unreleased/7502-nissy-dev-minor.md b/changelogs/unreleased/7502-nissy-dev-minor.md
new file mode 100644
index 00000000000..0bac5e6cc38
--- /dev/null
+++ b/changelogs/unreleased/7502-nissy-dev-minor.md
@@ -0,0 +1,5 @@
+## HTTPProxy JWT providers can load JWKS from a Kubernetes Secret
+
+HTTPProxy JWT providers now support loading JWKS from a Kubernetes Secret via `localJWKS`, in addition to fetching keys from a remote endpoint with `remoteJWKS`.
+Each provider must specify exactly one of these sources.
+See the [JWT verification documentation](https://projectcontour.io/docs/main/config/jwt-verification) for configuration details.
diff --git a/changelogs/unreleased/7522-tsaarni-small.md b/changelogs/unreleased/7522-tsaarni-small.md
new file mode 100644
index 00000000000..2d58b38bc78
--- /dev/null
+++ b/changelogs/unreleased/7522-tsaarni-small.md
@@ -0,0 +1 @@
+Updates Envoy to v1.37.2. See the [Envoy release notes](https://www.envoyproxy.io/docs/envoy/v1.37.2/version_history/v1.37/v1.37.2) for more information about the content of the release.
diff --git a/changelogs/unreleased/7525-SAY-5-small.md b/changelogs/unreleased/7525-SAY-5-small.md
new file mode 100644
index 00000000000..3aa3299a5ad
--- /dev/null
+++ b/changelogs/unreleased/7525-SAY-5-small.md
@@ -0,0 +1 @@
+Fix RetryPolicy numRetries=0 being silently coerced to 1 by populating num_retries explicitly when set, so HTTPProxy retry policies that explicitly request zero retries are honored.
diff --git a/changelogs/unreleased/7538-alliasgher-docs.md b/changelogs/unreleased/7538-alliasgher-docs.md
new file mode 100644
index 00000000000..1d7b23dc20b
--- /dev/null
+++ b/changelogs/unreleased/7538-alliasgher-docs.md
@@ -0,0 +1 @@
+Clarify HTTPProxy match condition precedence and query parameter name case sensitivity in the request routing docs.
diff --git a/changelogs/unreleased/7575-tsaarni-small.md b/changelogs/unreleased/7575-tsaarni-small.md
new file mode 100644
index 00000000000..940658d6663
--- /dev/null
+++ b/changelogs/unreleased/7575-tsaarni-small.md
@@ -0,0 +1 @@
+Updates kind node image for e2e tests to Kubernetes 1.36. Supported/tested Kubernetes versions are now 1.36, 1.35 and 1.34.
diff --git a/changelogs/unreleased/7576-tsaarni-small.md b/changelogs/unreleased/7576-tsaarni-small.md
new file mode 100644
index 00000000000..c9225b9b969
--- /dev/null
+++ b/changelogs/unreleased/7576-tsaarni-small.md
@@ -0,0 +1 @@
+Updates Go to go1.26.4. See the [Go release notes](https://go.dev/doc/devel/release#go1.26.0) for more information about the content of the release.
diff --git a/changelogs/unreleased/7583-tsaarni-small.md b/changelogs/unreleased/7583-tsaarni-small.md
new file mode 100644
index 00000000000..f3f201b45c7
--- /dev/null
+++ b/changelogs/unreleased/7583-tsaarni-small.md
@@ -0,0 +1 @@
+Updates Envoy to v1.38.1. See the [Envoy release notes](https://www.envoyproxy.io/docs/envoy/v1.38.1/version_history/v1.38/v1.38.1) for more information about the content of the release.
diff --git a/cmd/contour/gatewayprovisioner.go b/cmd/contour/gatewayprovisioner.go
index 34eccbc505c..7dfd729f816 100644
--- a/cmd/contour/gatewayprovisioner.go
+++ b/cmd/contour/gatewayprovisioner.go
@@ -36,7 +36,7 @@ func registerGatewayProvisioner(app *kingpin.Application) (*kingpin.CmdClause, *
provisionerConfig := &gatewayProvisionerConfig{
contourImage: "ghcr.io/projectcontour/contour:main",
- envoyImage: "docker.io/envoyproxy/envoy:distroless-v1.35.2",
+ envoyImage: "docker.io/envoyproxy/envoy:distroless-v1.38.2",
metricsBindAddress: ":8080",
leaderElection: false,
leaderElectionID: "0d879e31.projectcontour.io",
diff --git a/cmd/contour/ingressstatus.go b/cmd/contour/ingressstatus.go
index 3571b5087bc..0fd002a934b 100644
--- a/cmd/contour/ingressstatus.go
+++ b/cmd/contour/ingressstatus.go
@@ -189,7 +189,7 @@ func parseStatusFlag(status string) core_v1.LoadBalancerStatus {
// Support ','-separated lists.
var ingresses []core_v1.LoadBalancerIngress
- for _, item := range strings.Split(status, ",") {
+ for item := range strings.SplitSeq(status, ",") {
item = strings.TrimSpace(item)
if len(item) == 0 {
continue
diff --git a/cmd/contour/serve.go b/cmd/contour/serve.go
index b06828df5cc..a2ce0432789 100644
--- a/cmd/contour/serve.go
+++ b/cmd/contour/serve.go
@@ -16,6 +16,7 @@ package main
import (
"context"
"fmt"
+ "maps"
"net"
"net/http"
"os"
@@ -454,6 +455,8 @@ func (s *Server) doServe() error {
MinimumTLSVersion: annotation.TLSVersion(contourConfiguration.Envoy.Listener.TLS.MinimumProtocolVersion, "1.2"),
MaximumTLSVersion: annotation.TLSVersion(contourConfiguration.Envoy.Listener.TLS.MaximumProtocolVersion, "1.3"),
CipherSuites: contourConfiguration.Envoy.Listener.TLS.SanitizedCipherSuites(),
+ EnableJA3Fingerprinting: contourConfiguration.Envoy.Listener.TLS.GetJA3(),
+ EnableJA4Fingerprinting: contourConfiguration.Envoy.Listener.TLS.GetJA4(),
Timeouts: timeouts,
DefaultHTTPVersions: parseDefaultHTTPVersions(contourConfiguration.Envoy.DefaultHTTPVersions),
AllowChunkedLength: !*contourConfiguration.Envoy.Listener.DisableAllowChunkedLength,
@@ -755,6 +758,19 @@ func (s *Server) getExtensionSvcConfig(name, namespace string) (xdscache_v3.Exte
return extensionSvcConfig, nil
}
+// parseSamplingRate parses a sampling rate string and returns the float value,
+// defaulting to 100.0 for invalid values or zero values.
+func parseSamplingRate(rateStr *string) float64 {
+ if rateStr == nil {
+ return 100.0
+ }
+ rate, err := strconv.ParseFloat(*rateStr, 64)
+ if err != nil || rate == 0 {
+ return 100.0
+ }
+ return rate
+}
+
func (s *Server) setupTracingService(tracingConfig *contour_v1alpha1.TracingConfig) (*xdscache_v3.TracingConfig, error) {
if tracingConfig == nil {
return nil, nil
@@ -786,15 +802,16 @@ func (s *Server) setupTracingService(tracingConfig *contour_v1alpha1.TracingConf
})
}
- overallSampling, err := strconv.ParseFloat(ptr.Deref(tracingConfig.OverallSampling, "100"), 64)
- if err != nil || overallSampling == 0 {
- overallSampling = 100.0
- }
+ overallSampling := parseSamplingRate(tracingConfig.OverallSampling)
+ clientSampling := parseSamplingRate(tracingConfig.ClientSampling)
+ randomSampling := parseSamplingRate(tracingConfig.RandomSampling)
return &xdscache_v3.TracingConfig{
ServiceName: ptr.Deref(tracingConfig.ServiceName, "contour"),
ExtensionServiceConfig: extensionSvcConfig,
OverallSampling: overallSampling,
+ ClientSampling: clientSampling,
+ RandomSampling: randomSampling,
MaxPathTagLength: ptr.Deref(tracingConfig.MaxPathTagLength, 256),
CustomTags: customTags,
}, nil
@@ -837,20 +854,23 @@ func (s *Server) setupGlobalExternalAuthentication(contourConfiguration contour_
context = contourConfiguration.GlobalExternalAuthorization.AuthPolicy.Context
}
- globalExternalAuthConfig := &xdscache_v3.GlobalExternalAuthConfig{
- ExtensionServiceConfig: extensionSvcConfig,
- FailOpen: contourConfiguration.GlobalExternalAuthorization.FailOpen,
- Context: context,
+ var validCond contour_v1.DetailedCondition
+ extAuth := dag.NewExternalAuthorization(contourConfiguration.GlobalExternalAuthorization, &validCond)
+ if len(validCond.Errors) > 0 {
+ return nil, fmt.Errorf("%s", validCond.Errors[0].Message)
}
- if contourConfiguration.GlobalExternalAuthorization.WithRequestBody != nil {
- globalExternalAuthConfig.WithRequestBody = &dag.AuthorizationServerBufferSettings{
- PackAsBytes: contourConfiguration.GlobalExternalAuthorization.WithRequestBody.PackAsBytes,
- AllowPartialMessage: contourConfiguration.GlobalExternalAuthorization.WithRequestBody.AllowPartialMessage,
- MaxRequestBytes: contourConfiguration.GlobalExternalAuthorization.WithRequestBody.MaxRequestBytes,
- }
+ // If ContourConfiguration.spec.globalExtAuth.responseTimeout is not set,
+ // fall back to ExtensionService.spec.timeoutPolicy.response.
+ if extAuth.AuthorizationResponseTimeout.UseDefault() {
+ extAuth.AuthorizationResponseTimeout = extensionSvcConfig.Timeout
}
- return globalExternalAuthConfig, nil
+
+ return &xdscache_v3.GlobalExternalAuthConfig{
+ ExtensionServiceConfig: extensionSvcConfig,
+ ExternalAuthorization: *extAuth,
+ Context: context,
+ }, nil
}
func (s *Server) setupGlobalExtProc(contourCfg contour_v1alpha1.ContourConfigurationSpec) (*xdscache_v3.GlobalExtProcConfig, error) {
@@ -1061,9 +1081,7 @@ func (s *Server) getDAGBuilder(dbc dagBuilderConfig) *dag.Builder {
if dbc.headersPolicy.RequestHeadersPolicy != nil {
if dbc.headersPolicy.RequestHeadersPolicy.Set != nil {
requestHeadersPolicy.Set = make(map[string]string)
- for k, v := range dbc.headersPolicy.RequestHeadersPolicy.Set {
- requestHeadersPolicy.Set[k] = v
- }
+ maps.Copy(requestHeadersPolicy.Set, dbc.headersPolicy.RequestHeadersPolicy.Set)
}
if dbc.headersPolicy.RequestHeadersPolicy.Remove != nil {
requestHeadersPolicy.Remove = make([]string, 0, len(dbc.headersPolicy.RequestHeadersPolicy.Remove))
@@ -1074,9 +1092,7 @@ func (s *Server) getDAGBuilder(dbc dagBuilderConfig) *dag.Builder {
if dbc.headersPolicy.ResponseHeadersPolicy != nil {
if dbc.headersPolicy.ResponseHeadersPolicy.Set != nil {
responseHeadersPolicy.Set = make(map[string]string)
- for k, v := range dbc.headersPolicy.ResponseHeadersPolicy.Set {
- responseHeadersPolicy.Set[k] = v
- }
+ maps.Copy(responseHeadersPolicy.Set, dbc.headersPolicy.ResponseHeadersPolicy.Set)
}
if dbc.headersPolicy.ResponseHeadersPolicy.Remove != nil {
responseHeadersPolicy.Remove = make([]string, 0, len(dbc.headersPolicy.ResponseHeadersPolicy.Remove))
diff --git a/cmd/contour/serve_test.go b/cmd/contour/serve_test.go
index 1cf5439a337..4a60f15dd1d 100644
--- a/cmd/contour/serve_test.go
+++ b/cmd/contour/serve_test.go
@@ -218,6 +218,57 @@ func TestGetDAGBuilder(t *testing.T) {
// TODO(3453): test additional properties of the DAG builder (processor fields, cache fields, Gateway tests (requires a client fake))
}
+func TestParseSamplingRate(t *testing.T) {
+ tests := map[string]struct {
+ input *string
+ want float64
+ }{
+ "nil input": {
+ input: nil,
+ want: 100.0,
+ },
+ "empty string": {
+ input: ptr.To(""),
+ want: 100.0,
+ },
+ "valid number": {
+ input: ptr.To("50.5"),
+ want: 50.5,
+ },
+ "zero value": {
+ input: ptr.To("0"),
+ want: 100.0,
+ },
+ "negative number": {
+ input: ptr.To("-10"),
+ want: -10.0,
+ },
+ "invalid string": {
+ input: ptr.To("invalid"),
+ want: 100.0,
+ },
+ "non-numeric string": {
+ input: ptr.To("not-a-number"),
+ want: 100.0,
+ },
+ "decimal zero": {
+ input: ptr.To("0.0"),
+ want: 100.0,
+ },
+ "large number": {
+ input: ptr.To("999.99"),
+ want: 999.99,
+ },
+ }
+
+ for name, tc := range tests {
+ t.Run(name, func(t *testing.T) {
+ got := parseSamplingRate(tc.input)
+ assert.InDelta(t, tc.want, got, 0.001)
+ })
+ }
+}
+
func mustGetGatewayAPIProcessor(t *testing.T, builder *dag.Builder) *dag.GatewayAPIProcessor {
t.Helper()
for i := range builder.Processors {
diff --git a/cmd/contour/servecontext.go b/cmd/contour/servecontext.go
index 870bf7eeab6..4c8b2e73e40 100644
--- a/cmd/contour/servecontext.go
+++ b/cmd/contour/servecontext.go
@@ -249,7 +249,7 @@ func (ctx *serveContext) proxyRootNamespaces() []string {
return nil
}
var ns []string
- for _, s := range strings.Split(ctx.rootNamespaces, ",") {
+ for s := range strings.SplitSeq(ctx.rootNamespaces, ",") {
ns = append(ns, strings.TrimSpace(s))
}
return ns
@@ -260,7 +260,7 @@ func (ctx *serveContext) watchedNamespaces() []string {
return nil
}
var ns []string
- for _, s := range strings.Split(ctx.watchNamespaces, ",") {
+ for s := range strings.SplitSeq(ctx.watchNamespaces, ",") {
ns = append(ns, strings.TrimSpace(s))
}
return ns
@@ -413,6 +413,8 @@ func (ctx *serveContext) convertToContourConfigurationSpec() contour_v1alpha1.Co
IncludePodDetail: ctx.Config.Tracing.IncludePodDetail,
ServiceName: ctx.Config.Tracing.ServiceName,
OverallSampling: ctx.Config.Tracing.OverallSampling,
+ ClientSampling: ctx.Config.Tracing.ClientSampling,
+ RandomSampling: ctx.Config.Tracing.RandomSampling,
MaxPathTagLength: ctx.Config.Tracing.MaxPathTagLength,
CustomTags: customTags,
ExtensionService: &contour_v1alpha1.NamespacedName{
@@ -457,10 +459,15 @@ func (ctx *serveContext) convertToContourConfigurationSpec() contour_v1alpha1.Co
Name: nsedName.Name,
Namespace: nsedName.Namespace,
},
+ ServiceType: ctx.Config.GlobalExternalAuthorization.ServiceType,
ResponseTimeout: ctx.Config.GlobalExternalAuthorization.ResponseTimeout,
FailOpen: ctx.Config.GlobalExternalAuthorization.FailOpen,
}
+ if ctx.Config.GlobalExternalAuthorization.HTTPServerSettings != nil {
+ globalExtAuth.HTTPServerSettings = ctx.Config.GlobalExternalAuthorization.HTTPServerSettings
+ }
+
if ctx.Config.GlobalExternalAuthorization.AuthPolicy != nil {
globalExtAuth.AuthPolicy = &contour_v1.AuthorizationPolicy{
Disabled: ctx.Config.GlobalExternalAuthorization.AuthPolicy.Disabled,
@@ -528,6 +535,14 @@ func (ctx *serveContext) convertToContourConfigurationSpec() contour_v1alpha1.Co
}
}
+ var fingerprint *contour_v1alpha1.TLSFingerprint
+ if ctx.Config.TLS.Fingerprint != nil {
+ fingerprint = &contour_v1alpha1.TLSFingerprint{
+ JA3: ctx.Config.TLS.Fingerprint.JA3,
+ JA4: ctx.Config.TLS.Fingerprint.JA4,
+ }
+ }
+
contourMetrics := contour_v1alpha1.MetricsConfig{
Address: ctx.metricsAddr,
Port: ctx.metricsPort,
@@ -580,10 +595,13 @@ func (ctx *serveContext) convertToContourConfigurationSpec() contour_v1alpha1.Co
MaxRequestsPerIOCycle: ctx.Config.Listener.MaxRequestsPerIOCycle,
HTTP2MaxConcurrentStreams: ctx.Config.Listener.HTTP2MaxConcurrentStreams,
MaxConnectionsPerListener: ctx.Config.Listener.MaxConnectionsPerListener,
- TLS: &contour_v1alpha1.EnvoyTLS{
- MinimumProtocolVersion: ctx.Config.TLS.MinimumProtocolVersion,
- MaximumProtocolVersion: ctx.Config.TLS.MaximumProtocolVersion,
- CipherSuites: cipherSuites,
+ TLS: &contour_v1alpha1.EnvoyListenerTLS{
+ EnvoyTLS: contour_v1alpha1.EnvoyTLS{
+ MinimumProtocolVersion: ctx.Config.TLS.MinimumProtocolVersion,
+ MaximumProtocolVersion: ctx.Config.TLS.MaximumProtocolVersion,
+ CipherSuites: cipherSuites,
+ },
+ Fingerprint: fingerprint,
},
SocketOptions: &contour_v1alpha1.SocketOptions{
TOS: ctx.Config.Listener.SocketOptions.TOS,
diff --git a/cmd/contour/servecontext_test.go b/cmd/contour/servecontext_test.go
index b3dfee1f816..d9565d8b735 100644
--- a/cmd/contour/servecontext_test.go
+++ b/cmd/contour/servecontext_test.go
@@ -21,7 +21,7 @@ import (
"os"
"path/filepath"
"reflect"
- "sort"
+ "slices"
"testing"
"time"
@@ -349,15 +349,12 @@ func TestParseHTTPVersions(t *testing.T) {
}
for name, testcase := range cases {
- testcase := testcase
t.Run(name, func(t *testing.T) {
vers := parseDefaultHTTPVersions(testcase.versions)
// parseDefaultHTTPVersions doesn't guarantee a stable result, but the order doesn't matter.
- sort.Slice(vers,
- func(i, j int) bool { return vers[i] < vers[j] })
- sort.Slice(testcase.parseVersions,
- func(i, j int) bool { return testcase.parseVersions[i] < testcase.parseVersions[j] })
+ slices.Sort(vers)
+ slices.Sort(testcase.parseVersions)
assert.Equal(t, testcase.parseVersions, vers)
})
@@ -410,9 +407,11 @@ func defaultContourConfiguration() contour_v1alpha1.ContourConfigurationSpec {
DisableAllowChunkedLength: ptr.To(false),
DisableMergeSlashes: ptr.To(false),
ServerHeaderTransformation: contour_v1alpha1.OverwriteServerHeader,
- TLS: &contour_v1alpha1.EnvoyTLS{
- MinimumProtocolVersion: "",
- MaximumProtocolVersion: "",
+ TLS: &contour_v1alpha1.EnvoyListenerTLS{
+ EnvoyTLS: contour_v1alpha1.EnvoyTLS{
+ MinimumProtocolVersion: "",
+ MaximumProtocolVersion: "",
+ },
},
SocketOptions: &contour_v1alpha1.SocketOptions{
TOS: 0,
@@ -833,6 +832,8 @@ func TestConvertServeContext(t *testing.T) {
IncludePodDetail: ptr.To(false),
ServiceName: ptr.To("contour"),
OverallSampling: ptr.To("100"),
+ ClientSampling: ptr.To("100"),
+ RandomSampling: ptr.To("100"),
MaxPathTagLength: ptr.To(uint32(256)),
CustomTags: []config.CustomTag{
{
@@ -853,6 +854,8 @@ func TestConvertServeContext(t *testing.T) {
IncludePodDetail: ptr.To(false),
ServiceName: ptr.To("contour"),
OverallSampling: ptr.To("100"),
+ ClientSampling: ptr.To("100"),
+ RandomSampling: ptr.To("100"),
MaxPathTagLength: ptr.To(uint32(256)),
CustomTags: []*contour_v1alpha1.CustomTag{
{
@@ -919,6 +922,22 @@ func TestConvertServeContext(t *testing.T) {
return cfg
},
},
+ "tls fingerprinting": {
+ getServeContext: func(ctx *serveContext) *serveContext {
+ ctx.Config.TLS.Fingerprint = &config.TLSFingerprint{
+ JA3: ptr.To(true),
+ JA4: ptr.To(true),
+ }
+ return ctx
+ },
+ getContourConfiguration: func(cfg contour_v1alpha1.ContourConfigurationSpec) contour_v1alpha1.ContourConfigurationSpec {
+ cfg.Envoy.Listener.TLS.Fingerprint = &contour_v1alpha1.TLSFingerprint{
+ JA3: ptr.To(true),
+ JA4: ptr.To(true),
+ }
+ return cfg
+ },
+ },
}
for name, tc := range cases {
diff --git a/examples/contour/01-crds.yaml b/examples/contour/01-crds.yaml
index eda5b9e5146..0a00d6cfdac 100644
--- a/examples/contour/01-crds.yaml
+++ b/examples/contour/01-crds.yaml
@@ -3,10 +3,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourconfigurations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourConfiguration
@@ -442,6 +441,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -731,6 +746,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of authorization
+ request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -739,6 +839,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -760,6 +869,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -1344,6 +1456,11 @@ spec:
description: Tracing defines properties for exporting trace data to
OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with unique
tag name.
@@ -1401,6 +1518,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -1652,10 +1774,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourdeployments.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourDeployment
@@ -1832,9 +1953,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -2740,7 +2862,7 @@ spec:
resources:
description: |-
resources represents the minimum resources the volume should have.
- If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements
+ Users are allowed to specify resource requirements
that are lower than previous value but must still be higher than capacity recorded in the
status field of the claim.
More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
@@ -3070,7 +3192,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -3242,8 +3364,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -3601,6 +3722,21 @@ spec:
description: Kubelet's generated CSRs will
be addressed to this signer.
type: string
+ userAnnotations:
+ additionalProperties:
+ type: string
+ description: |-
+ userAnnotations allow pod authors to pass additional information to
+ the signer implementation. Kubernetes does not restrict or validate this
+ metadata in any way.
+ These values are copied verbatim into the `spec.unverifiedUserAnnotations` field of
+ the PodCertificateRequest objects that Kubelet creates.
+ Entries are subject to the same validation as object metadata annotations,
+ with the addition that all keys must be domain-prefixed. No restrictions
+ are placed on values, except an overall size limitation on the entire field.
+ Signers should document the keys and values they support. Signers should
+ deny requests that contain keys they do not recognize.
+ type: object
required:
- keyType
- signerName
@@ -4120,9 +4256,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -4661,6 +4798,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -4951,6 +5104,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -4959,6 +5197,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -4980,6 +5227,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -5565,6 +5815,11 @@ spec:
description: Tracing defines properties for exporting trace data
to OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with
unique tag name.
@@ -5623,6 +5878,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -5742,10 +6002,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: extensionservices.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ExtensionService
@@ -5822,9 +6081,9 @@ spec:
type: object
loadBalancerPolicy:
description: |-
- The policy for load balancing GRPC service requests. Note that the
+ The policy for load balancing service requests. Note that the
`Cookie` and `RequestHash` load balancing strategies cannot be used
- here.
+ here for GRPC service requests.
properties:
requestHashPolicies:
description: |-
@@ -5898,8 +6157,9 @@ spec:
protocol:
description: |-
Protocol may be used to specify (or override) the protocol used to reach this Service.
- Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+ Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.
enum:
+ - http/1.1
- h2
- h2c
type: string
@@ -5915,7 +6175,7 @@ spec:
services:
description: |-
Services specifies the set of Kubernetes Service resources that
- receive GRPC extension API requests.
+ receive extension API requests.
If no weights are specified for any of the entries in
this array, traffic will be spread evenly across all the
services.
@@ -6222,10 +6482,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: httpproxies.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: HTTPProxy
@@ -8496,6 +8755,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -8504,6 +8848,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -8525,6 +8878,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
corsPolicy:
description: Specifies the cross-origin policy to apply to the
VirtualHost.
@@ -8864,12 +9220,31 @@ spec:
Issuer that JWTs are required to have in the "iss" field.
If not provided, JWT issuers are not checked.
type: string
+ localJWKS:
+ description: Local JWKS loads signing keys from a Kubernetes
+ Secret.
+ properties:
+ key:
+ description: The key of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ secretName:
+ description: The name of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ required:
+ - key
+ - secretName
+ type: object
name:
description: Unique name for the provider.
minLength: 1
type: string
remoteJWKS:
- description: Remote JWKS to use for verifying JWT signatures.
+ description: Remote JWKS fetches signing keys from an HTTP(S)
+ endpoint.
properties:
cacheDuration:
description: |-
@@ -8950,8 +9325,11 @@ spec:
type: object
required:
- name
- - remoteJWKS
type: object
+ x-kubernetes-validations:
+ - message: exactly one of remoteJWKS or localJWKS must be set
+ rule: (has(self.remoteJWKS) && !has(self.localJWKS)) || (!has(self.remoteJWKS)
+ && has(self.localJWKS))
type: array
rateLimitPolicy:
description: The policy for rate limiting on the virtual host.
@@ -9594,7 +9972,6 @@ spec:
The supported values are: "TCP", "UDP", "SCTP"
type: string
required:
- - error
- port
- protocol
type: object
@@ -9618,10 +9995,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: tlscertificatedelegations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: TLSCertificateDelegation
diff --git a/examples/contour/03-envoy.yaml b/examples/contour/03-envoy.yaml
index d1432d0e986..01c8c6caf5b 100644
--- a/examples/contour/03-envoy.yaml
+++ b/examples/contour/03-envoy.yaml
@@ -46,7 +46,7 @@ spec:
- --log-level info
command:
- envoy
- image: docker.io/envoyproxy/envoy:distroless-v1.35.2
+ image: docker.io/envoyproxy/envoy:distroless-v1.38.2
imagePullPolicy: IfNotPresent
name: envoy
env:
@@ -70,7 +70,6 @@ spec:
name: https
protocol: TCP
- containerPort: 8002
- hostPort: 8002
name: metrics
protocol: TCP
readinessProbe:
diff --git a/examples/deployment/03-envoy-deployment.yaml b/examples/deployment/03-envoy-deployment.yaml
index da6f6838301..ad7ff84d478 100644
--- a/examples/deployment/03-envoy-deployment.yaml
+++ b/examples/deployment/03-envoy-deployment.yaml
@@ -58,7 +58,7 @@ spec:
- --log-level info
command:
- envoy
- image: docker.io/envoyproxy/envoy:distroless-v1.35.2
+ image: docker.io/envoyproxy/envoy:distroless-v1.38.2
imagePullPolicy: IfNotPresent
name: envoy
env:
@@ -82,7 +82,6 @@ spec:
name: https
protocol: TCP
- containerPort: 8002
- hostPort: 8002
name: metrics
protocol: TCP
readinessProbe:
diff --git a/examples/render/contour-deployment.yaml b/examples/render/contour-deployment.yaml
index 3c8cb8522d0..b54865da519 100644
--- a/examples/render/contour-deployment.yaml
+++ b/examples/render/contour-deployment.yaml
@@ -222,10 +222,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourconfigurations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourConfiguration
@@ -661,6 +660,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -950,6 +965,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of authorization
+ request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -958,6 +1058,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -979,6 +1088,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -1563,6 +1675,11 @@ spec:
description: Tracing defines properties for exporting trace data to
OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with unique
tag name.
@@ -1620,6 +1737,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -1871,10 +1993,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourdeployments.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourDeployment
@@ -2051,9 +2172,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -2959,7 +3081,7 @@ spec:
resources:
description: |-
resources represents the minimum resources the volume should have.
- If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements
+ Users are allowed to specify resource requirements
that are lower than previous value but must still be higher than capacity recorded in the
status field of the claim.
More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
@@ -3289,7 +3411,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -3461,8 +3583,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -3820,6 +3941,21 @@ spec:
description: Kubelet's generated CSRs will
be addressed to this signer.
type: string
+ userAnnotations:
+ additionalProperties:
+ type: string
+ description: |-
+ userAnnotations allow pod authors to pass additional information to
+ the signer implementation. Kubernetes does not restrict or validate this
+ metadata in any way.
+ These values are copied verbatim into the `spec.unverifiedUserAnnotations` field of
+ the PodCertificateRequest objects that Kubelet creates.
+ Entries are subject to the same validation as object metadata annotations,
+ with the addition that all keys must be domain-prefixed. No restrictions
+ are placed on values, except an overall size limitation on the entire field.
+ Signers should document the keys and values they support. Signers should
+ deny requests that contain keys they do not recognize.
+ type: object
required:
- keyType
- signerName
@@ -4339,9 +4475,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -4880,6 +5017,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -5170,6 +5323,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -5178,6 +5416,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -5199,6 +5446,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -5784,6 +6034,11 @@ spec:
description: Tracing defines properties for exporting trace data
to OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with
unique tag name.
@@ -5842,6 +6097,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -5961,10 +6221,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: extensionservices.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ExtensionService
@@ -6041,9 +6300,9 @@ spec:
type: object
loadBalancerPolicy:
description: |-
- The policy for load balancing GRPC service requests. Note that the
+ The policy for load balancing service requests. Note that the
`Cookie` and `RequestHash` load balancing strategies cannot be used
- here.
+ here for GRPC service requests.
properties:
requestHashPolicies:
description: |-
@@ -6117,8 +6376,9 @@ spec:
protocol:
description: |-
Protocol may be used to specify (or override) the protocol used to reach this Service.
- Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+ Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.
enum:
+ - http/1.1
- h2
- h2c
type: string
@@ -6134,7 +6394,7 @@ spec:
services:
description: |-
Services specifies the set of Kubernetes Service resources that
- receive GRPC extension API requests.
+ receive extension API requests.
If no weights are specified for any of the entries in
this array, traffic will be spread evenly across all the
services.
@@ -6441,10 +6701,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: httpproxies.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: HTTPProxy
@@ -8715,6 +8974,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -8723,6 +9067,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -8744,6 +9097,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
corsPolicy:
description: Specifies the cross-origin policy to apply to the
VirtualHost.
@@ -9083,12 +9439,31 @@ spec:
Issuer that JWTs are required to have in the "iss" field.
If not provided, JWT issuers are not checked.
type: string
+ localJWKS:
+ description: Local JWKS loads signing keys from a Kubernetes
+ Secret.
+ properties:
+ key:
+ description: The key of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ secretName:
+ description: The name of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ required:
+ - key
+ - secretName
+ type: object
name:
description: Unique name for the provider.
minLength: 1
type: string
remoteJWKS:
- description: Remote JWKS to use for verifying JWT signatures.
+ description: Remote JWKS fetches signing keys from an HTTP(S)
+ endpoint.
properties:
cacheDuration:
description: |-
@@ -9169,8 +9544,11 @@ spec:
type: object
required:
- name
- - remoteJWKS
type: object
+ x-kubernetes-validations:
+ - message: exactly one of remoteJWKS or localJWKS must be set
+ rule: (has(self.remoteJWKS) && !has(self.localJWKS)) || (!has(self.remoteJWKS)
+ && has(self.localJWKS))
type: array
rateLimitPolicy:
description: The policy for rate limiting on the virtual host.
@@ -9813,7 +10191,6 @@ spec:
The supported values are: "TCP", "UDP", "SCTP"
type: string
required:
- - error
- port
- protocol
type: object
@@ -9837,10 +10214,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: tlscertificatedelegations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: TLSCertificateDelegation
@@ -10541,7 +10917,7 @@ spec:
- --log-level info
command:
- envoy
- image: docker.io/envoyproxy/envoy:distroless-v1.35.2
+ image: docker.io/envoyproxy/envoy:distroless-v1.38.2
imagePullPolicy: IfNotPresent
name: envoy
env:
@@ -10565,7 +10941,6 @@ spec:
name: https
protocol: TCP
- containerPort: 8002
- hostPort: 8002
name: metrics
protocol: TCP
readinessProbe:
diff --git a/examples/render/contour-gateway-provisioner.yaml b/examples/render/contour-gateway-provisioner.yaml
index 27243aa61dc..5bc996cba81 100644
--- a/examples/render/contour-gateway-provisioner.yaml
+++ b/examples/render/contour-gateway-provisioner.yaml
@@ -14,10 +14,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourconfigurations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourConfiguration
@@ -453,6 +452,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -742,6 +757,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of authorization
+ request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -750,6 +850,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -771,6 +880,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -1355,6 +1467,11 @@ spec:
description: Tracing defines properties for exporting trace data to
OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with unique
tag name.
@@ -1412,6 +1529,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -1663,10 +1785,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourdeployments.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourDeployment
@@ -1843,9 +1964,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -2751,7 +2873,7 @@ spec:
resources:
description: |-
resources represents the minimum resources the volume should have.
- If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements
+ Users are allowed to specify resource requirements
that are lower than previous value but must still be higher than capacity recorded in the
status field of the claim.
More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
@@ -3081,7 +3203,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -3253,8 +3375,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -3612,6 +3733,21 @@ spec:
description: Kubelet's generated CSRs will
be addressed to this signer.
type: string
+ userAnnotations:
+ additionalProperties:
+ type: string
+ description: |-
+ userAnnotations allow pod authors to pass additional information to
+ the signer implementation. Kubernetes does not restrict or validate this
+ metadata in any way.
+ These values are copied verbatim into the `spec.unverifiedUserAnnotations` field of
+ the PodCertificateRequest objects that Kubelet creates.
+ Entries are subject to the same validation as object metadata annotations,
+ with the addition that all keys must be domain-prefixed. No restrictions
+ are placed on values, except an overall size limitation on the entire field.
+ Signers should document the keys and values they support. Signers should
+ deny requests that contain keys they do not recognize.
+ type: object
required:
- keyType
- signerName
@@ -4131,9 +4267,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -4672,6 +4809,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -4962,6 +5115,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -4970,6 +5208,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -4991,6 +5238,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -5576,6 +5826,11 @@ spec:
description: Tracing defines properties for exporting trace data
to OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with
unique tag name.
@@ -5634,6 +5889,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -5753,10 +6013,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: extensionservices.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ExtensionService
@@ -5833,9 +6092,9 @@ spec:
type: object
loadBalancerPolicy:
description: |-
- The policy for load balancing GRPC service requests. Note that the
+ The policy for load balancing service requests. Note that the
`Cookie` and `RequestHash` load balancing strategies cannot be used
- here.
+ here for GRPC service requests.
properties:
requestHashPolicies:
description: |-
@@ -5909,8 +6168,9 @@ spec:
protocol:
description: |-
Protocol may be used to specify (or override) the protocol used to reach this Service.
- Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+ Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.
enum:
+ - http/1.1
- h2
- h2c
type: string
@@ -5926,7 +6186,7 @@ spec:
services:
description: |-
Services specifies the set of Kubernetes Service resources that
- receive GRPC extension API requests.
+ receive extension API requests.
If no weights are specified for any of the entries in
this array, traffic will be spread evenly across all the
services.
@@ -6233,10 +6493,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: httpproxies.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: HTTPProxy
@@ -8507,6 +8766,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -8515,6 +8859,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -8536,6 +8889,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
corsPolicy:
description: Specifies the cross-origin policy to apply to the
VirtualHost.
@@ -8875,12 +9231,31 @@ spec:
Issuer that JWTs are required to have in the "iss" field.
If not provided, JWT issuers are not checked.
type: string
+ localJWKS:
+ description: Local JWKS loads signing keys from a Kubernetes
+ Secret.
+ properties:
+ key:
+ description: The key of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ secretName:
+ description: The name of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ required:
+ - key
+ - secretName
+ type: object
name:
description: Unique name for the provider.
minLength: 1
type: string
remoteJWKS:
- description: Remote JWKS to use for verifying JWT signatures.
+ description: Remote JWKS fetches signing keys from an HTTP(S)
+ endpoint.
properties:
cacheDuration:
description: |-
@@ -8961,8 +9336,11 @@ spec:
type: object
required:
- name
- - remoteJWKS
type: object
+ x-kubernetes-validations:
+ - message: exactly one of remoteJWKS or localJWKS must be set
+ rule: (has(self.remoteJWKS) && !has(self.localJWKS)) || (!has(self.remoteJWKS)
+ && has(self.localJWKS))
type: array
rateLimitPolicy:
description: The policy for rate limiting on the virtual host.
@@ -9605,7 +9983,6 @@ spec:
The supported values are: "TCP", "UDP", "SCTP"
type: string
required:
- - error
- port
- protocol
type: object
@@ -9629,10 +10006,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: tlscertificatedelegations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: TLSCertificateDelegation
diff --git a/examples/render/contour-gateway.yaml b/examples/render/contour-gateway.yaml
index 9df8552dd31..e14dcae18d9 100644
--- a/examples/render/contour-gateway.yaml
+++ b/examples/render/contour-gateway.yaml
@@ -39,10 +39,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourconfigurations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourConfiguration
@@ -478,6 +477,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -767,6 +782,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of authorization
+ request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -775,6 +875,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -796,6 +905,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -1380,6 +1492,11 @@ spec:
description: Tracing defines properties for exporting trace data to
OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with unique
tag name.
@@ -1437,6 +1554,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -1688,10 +1810,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourdeployments.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourDeployment
@@ -1868,9 +1989,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -2776,7 +2898,7 @@ spec:
resources:
description: |-
resources represents the minimum resources the volume should have.
- If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements
+ Users are allowed to specify resource requirements
that are lower than previous value but must still be higher than capacity recorded in the
status field of the claim.
More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
@@ -3106,7 +3228,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -3278,8 +3400,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -3637,6 +3758,21 @@ spec:
description: Kubelet's generated CSRs will
be addressed to this signer.
type: string
+ userAnnotations:
+ additionalProperties:
+ type: string
+ description: |-
+ userAnnotations allow pod authors to pass additional information to
+ the signer implementation. Kubernetes does not restrict or validate this
+ metadata in any way.
+ These values are copied verbatim into the `spec.unverifiedUserAnnotations` field of
+ the PodCertificateRequest objects that Kubelet creates.
+ Entries are subject to the same validation as object metadata annotations,
+ with the addition that all keys must be domain-prefixed. No restrictions
+ are placed on values, except an overall size limitation on the entire field.
+ Signers should document the keys and values they support. Signers should
+ deny requests that contain keys they do not recognize.
+ type: object
required:
- keyType
- signerName
@@ -4156,9 +4292,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -4697,6 +4834,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -4987,6 +5140,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -4995,6 +5233,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -5016,6 +5263,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -5601,6 +5851,11 @@ spec:
description: Tracing defines properties for exporting trace data
to OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with
unique tag name.
@@ -5659,6 +5914,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -5778,10 +6038,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: extensionservices.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ExtensionService
@@ -5858,9 +6117,9 @@ spec:
type: object
loadBalancerPolicy:
description: |-
- The policy for load balancing GRPC service requests. Note that the
+ The policy for load balancing service requests. Note that the
`Cookie` and `RequestHash` load balancing strategies cannot be used
- here.
+ here for GRPC service requests.
properties:
requestHashPolicies:
description: |-
@@ -5934,8 +6193,9 @@ spec:
protocol:
description: |-
Protocol may be used to specify (or override) the protocol used to reach this Service.
- Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+ Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.
enum:
+ - http/1.1
- h2
- h2c
type: string
@@ -5951,7 +6211,7 @@ spec:
services:
description: |-
Services specifies the set of Kubernetes Service resources that
- receive GRPC extension API requests.
+ receive extension API requests.
If no weights are specified for any of the entries in
this array, traffic will be spread evenly across all the
services.
@@ -6258,10 +6518,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: httpproxies.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: HTTPProxy
@@ -8532,6 +8791,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -8540,6 +8884,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -8561,6 +8914,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
corsPolicy:
description: Specifies the cross-origin policy to apply to the
VirtualHost.
@@ -8900,12 +9256,31 @@ spec:
Issuer that JWTs are required to have in the "iss" field.
If not provided, JWT issuers are not checked.
type: string
+ localJWKS:
+ description: Local JWKS loads signing keys from a Kubernetes
+ Secret.
+ properties:
+ key:
+ description: The key of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ secretName:
+ description: The name of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ required:
+ - key
+ - secretName
+ type: object
name:
description: Unique name for the provider.
minLength: 1
type: string
remoteJWKS:
- description: Remote JWKS to use for verifying JWT signatures.
+ description: Remote JWKS fetches signing keys from an HTTP(S)
+ endpoint.
properties:
cacheDuration:
description: |-
@@ -8986,8 +9361,11 @@ spec:
type: object
required:
- name
- - remoteJWKS
type: object
+ x-kubernetes-validations:
+ - message: exactly one of remoteJWKS or localJWKS must be set
+ rule: (has(self.remoteJWKS) && !has(self.localJWKS)) || (!has(self.remoteJWKS)
+ && has(self.localJWKS))
type: array
rateLimitPolicy:
description: The policy for rate limiting on the virtual host.
@@ -9630,7 +10008,6 @@ spec:
The supported values are: "TCP", "UDP", "SCTP"
type: string
required:
- - error
- port
- protocol
type: object
@@ -9654,10 +10031,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: tlscertificatedelegations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: TLSCertificateDelegation
@@ -10346,7 +10722,7 @@ spec:
- --log-level info
command:
- envoy
- image: docker.io/envoyproxy/envoy:distroless-v1.35.2
+ image: docker.io/envoyproxy/envoy:distroless-v1.38.2
imagePullPolicy: IfNotPresent
name: envoy
env:
@@ -10370,7 +10746,6 @@ spec:
name: https
protocol: TCP
- containerPort: 8002
- hostPort: 8002
name: metrics
protocol: TCP
readinessProbe:
diff --git a/examples/render/contour.yaml b/examples/render/contour.yaml
index 7f4734d0a65..2bd85db28ff 100644
--- a/examples/render/contour.yaml
+++ b/examples/render/contour.yaml
@@ -222,10 +222,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourconfigurations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourConfiguration
@@ -661,6 +660,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -950,6 +965,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that must
+ be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string matching
+ should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the header
+ name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a header
+ name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix) ?
+ 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of authorization
+ request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -958,6 +1058,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -979,6 +1088,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -1563,6 +1675,11 @@ spec:
description: Tracing defines properties for exporting trace data to
OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with unique
tag name.
@@ -1620,6 +1737,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -1871,10 +1993,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: contourdeployments.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ContourDeployment
@@ -2051,9 +2172,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -2959,7 +3081,7 @@ spec:
resources:
description: |-
resources represents the minimum resources the volume should have.
- If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements
+ Users are allowed to specify resource requirements
that are lower than previous value but must still be higher than capacity recorded in the
status field of the claim.
More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
@@ -3289,7 +3411,7 @@ spec:
A failure to resolve or pull the image during pod startup will block containers from starting and may add significant latency. Failures will be retried using normal volume backoff and will be reported on the pod reason and message.
The types of objects that may be mounted by this volume are defined by the container runtime implementation on a host machine and at minimum must include all valid types supported by the container image field.
The OCI object gets mounted in a single directory (spec.containers[*].volumeMounts.mountPath) by merging the manifest layers in the same way as for container images.
- The volume will be mounted read-only (ro) and non-executable files (noexec).
+ The volume will be mounted read-only (ro).
Sub path mounts for containers are not supported (spec.containers[*].volumeMounts.subpath) before 1.33.
The field spec.securityContext.fsGroupChangePolicy has no effect on this volume type.
properties:
@@ -3461,8 +3583,7 @@ spec:
description: |-
portworxVolume represents a portworx volume attached and mounted on kubelets host machine.
Deprecated: PortworxVolume is deprecated. All operations for the in-tree portworxVolume type
- are redirected to the pxd.portworx.com CSI driver when the CSIMigrationPortworx feature-gate
- is on.
+ are redirected to the pxd.portworx.com CSI driver.
properties:
fsType:
description: |-
@@ -3820,6 +3941,21 @@ spec:
description: Kubelet's generated CSRs will
be addressed to this signer.
type: string
+ userAnnotations:
+ additionalProperties:
+ type: string
+ description: |-
+ userAnnotations allow pod authors to pass additional information to
+ the signer implementation. Kubernetes does not restrict or validate this
+ metadata in any way.
+ These values are copied verbatim into the `spec.unverifiedUserAnnotations` field of
+ the PodCertificateRequest objects that Kubelet creates.
+ Entries are subject to the same validation as object metadata annotations,
+ with the addition that all keys must be domain-prefixed. No restrictions
+ are placed on values, except an overall size limitation on the entire field.
+ Signers should document the keys and values they support. Signers should
+ deny requests that contain keys they do not recognize.
+ type: object
required:
- keyType
- signerName
@@ -4339,9 +4475,10 @@ spec:
operator:
description: |-
Operator represents a key's relationship to the value.
- Valid operators are Exists and Equal. Defaults to Equal.
+ Valid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.
Exists is equivalent to wildcard for value, so that a pod can
tolerate all taints of a particular category.
+ Lt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).
type: string
tolerationSeconds:
description: |-
@@ -4880,6 +5017,22 @@ spec:
items:
type: string
type: array
+ fingerprint:
+ description: |-
+ Fingerprint defines TLS fingerprinting configuration
+ for the TLS Inspector listener filter.
+ properties:
+ ja3:
+ description: |-
+ JA3 enables JA3 fingerprinting in the TLS Inspector.
+ When true, populates JA3 hash in dynamic metadata.
+ type: boolean
+ ja4:
+ description: |-
+ JA4 enables JA4 fingerprinting in the TLS Inspector.
+ When true, populates JA4 hash in dynamic metadata.
+ type: boolean
+ type: object
maximumProtocolVersion:
description: |-
MaximumProtocolVersion is the maximum TLS version this vhost should
@@ -5170,6 +5323,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -5178,6 +5416,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -5199,6 +5446,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
globalExternalProcessing:
description: |-
GlobalExternalProcessing allows envoys external processing filter
@@ -5784,6 +6034,11 @@ spec:
description: Tracing defines properties for exporting trace data
to OpenTelemetry.
properties:
+ clientSampling:
+ description: |-
+ ClientSampling defines the sampling rate when x-client-trace-id header is set.
+ contour's default is 100.
+ type: string
customTags:
description: CustomTags defines a list of custom tags with
unique tag name.
@@ -5842,6 +6097,11 @@ spec:
OverallSampling defines the sampling rate of trace data.
contour's default is 100.
type: string
+ randomSampling:
+ description: |-
+ RandomSampling defines the random sampling rate for all requests.
+ contour's default is 100.
+ type: string
serviceName:
description: |-
ServiceName defines the name for the service.
@@ -5961,10 +6221,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: extensionservices.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: ExtensionService
@@ -6041,9 +6300,9 @@ spec:
type: object
loadBalancerPolicy:
description: |-
- The policy for load balancing GRPC service requests. Note that the
+ The policy for load balancing service requests. Note that the
`Cookie` and `RequestHash` load balancing strategies cannot be used
- here.
+ here for GRPC service requests.
properties:
requestHashPolicies:
description: |-
@@ -6117,8 +6376,9 @@ spec:
protocol:
description: |-
Protocol may be used to specify (or override) the protocol used to reach this Service.
- Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+ Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.
enum:
+ - http/1.1
- h2
- h2c
type: string
@@ -6134,7 +6394,7 @@ spec:
services:
description: |-
Services specifies the set of Kubernetes Service resources that
- receive GRPC extension API requests.
+ receive extension API requests.
If no weights are specified for any of the entries in
this array, traffic will be spread evenly across all the
services.
@@ -6441,10 +6701,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: httpproxies.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: HTTPProxy
@@ -8715,6 +8974,91 @@ spec:
set in most cases. It is intended for use only while migrating applications
from internal authorization to Contour external authorization.
type: boolean
+ httpSettings:
+ description: HTTPAuthorizationServerSettings defines configurations
+ for interacting with an external HTTP authorization server.
+ properties:
+ allowedAuthorizationHeaders:
+ description: |-
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server.
+ Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ allowedUpstreamHeaders:
+ description: |-
+ AllowedUpstreamHeaders specifies response headers from the authorization server
+ that may be added to the original client request before sending it to the upstream.
+ items:
+ description: |-
+ HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers
+ in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user
+ experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ properties:
+ contains:
+ description: Contains specifies a substring that
+ must be present in the header name.
+ type: string
+ exact:
+ description: Exact specifies a string that the header
+ name must be equal to.
+ type: string
+ ignoreCase:
+ description: IgnoreCase specifies whether string
+ matching should be case-insensitive.
+ type: boolean
+ prefix:
+ description: Prefix defines a prefix match for the
+ header name.
+ type: string
+ suffix:
+ description: Suffix defines a suffix match for a
+ header name.
+ type: string
+ type: object
+ x-kubernetes-validations:
+ - message: only one of prefix, suffix, exact, and contains
+ should be set in the allowedHeader
+ rule: '(has(self.exact) ? 1 : 0) + (has(self.prefix)
+ ? 1 : 0) + (has(self.suffix) ? 1 : 0) + (has(self.contains)
+ ? 1 : 0) == 1'
+ type: array
+ pathPrefix:
+ description: PathPrefix Sets a prefix to the value of
+ authorization request header Path.
+ type: string
+ type: object
responseTimeout:
description: |-
ResponseTimeout configures maximum time to wait for a check response from the authorization server.
@@ -8723,6 +9067,15 @@ spec:
The string "infinity" is also a valid input and specifies no timeout.
pattern: ^(((\d*(\.\d*)?h)|(\d*(\.\d*)?m)|(\d*(\.\d*)?s)|(\d*(\.\d*)?ms)|(\d*(\.\d*)?us)|(\d*(\.\d*)?µs)|(\d*(\.\d*)?ns))+|infinity|infinite)$
type: string
+ serviceType:
+ default: grpc
+ description: |-
+ ServiceType sets the protocol used to communicate with
+ the external authorization server.
+ enum:
+ - http
+ - grpc
+ type: string
withRequestBody:
description: WithRequestBody specifies configuration for sending
the client request's body to authorization server.
@@ -8744,6 +9097,9 @@ spec:
type: boolean
type: object
type: object
+ x-kubernetes-validations:
+ - message: httpSettings can only be set when serviceType is 'http'
+ rule: '!has(self.httpSettings) || self.serviceType == ''http'''
corsPolicy:
description: Specifies the cross-origin policy to apply to the
VirtualHost.
@@ -9083,12 +9439,31 @@ spec:
Issuer that JWTs are required to have in the "iss" field.
If not provided, JWT issuers are not checked.
type: string
+ localJWKS:
+ description: Local JWKS loads signing keys from a Kubernetes
+ Secret.
+ properties:
+ key:
+ description: The key of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ secretName:
+ description: The name of the secret that contains the
+ JWKS.
+ minLength: 1
+ type: string
+ required:
+ - key
+ - secretName
+ type: object
name:
description: Unique name for the provider.
minLength: 1
type: string
remoteJWKS:
- description: Remote JWKS to use for verifying JWT signatures.
+ description: Remote JWKS fetches signing keys from an HTTP(S)
+ endpoint.
properties:
cacheDuration:
description: |-
@@ -9169,8 +9544,11 @@ spec:
type: object
required:
- name
- - remoteJWKS
type: object
+ x-kubernetes-validations:
+ - message: exactly one of remoteJWKS or localJWKS must be set
+ rule: (has(self.remoteJWKS) && !has(self.localJWKS)) || (!has(self.remoteJWKS)
+ && has(self.localJWKS))
type: array
rateLimitPolicy:
description: The policy for rate limiting on the virtual host.
@@ -9813,7 +10191,6 @@ spec:
The supported values are: "TCP", "UDP", "SCTP"
type: string
required:
- - error
- port
- protocol
type: object
@@ -9837,10 +10214,9 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.19.0
+ controller-gen.kubebuilder.io/version: v0.21.0
name: tlscertificatedelegations.projectcontour.io
spec:
- preserveUnknownFields: false
group: projectcontour.io
names:
kind: TLSCertificateDelegation
@@ -10529,7 +10905,7 @@ spec:
- --log-level info
command:
- envoy
- image: docker.io/envoyproxy/envoy:distroless-v1.35.2
+ image: docker.io/envoyproxy/envoy:distroless-v1.38.2
imagePullPolicy: IfNotPresent
name: envoy
env:
@@ -10553,7 +10929,6 @@ spec:
name: https
protocol: TCP
- containerPort: 8002
- hostPort: 8002
name: metrics
protocol: TCP
readinessProbe:
diff --git a/go.mod b/go.mod
index f5d8d308798..985d4d57101 100644
--- a/go.mod
+++ b/go.mod
@@ -1,148 +1,124 @@
module github.com/projectcontour/contour
-go 1.24.0
+go 1.26.0
require (
dario.cat/mergo v1.0.2
- github.com/Masterminds/semver/v3 v3.4.0
- github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20241111191808-71fefeed8910
+ github.com/Masterminds/semver/v3 v3.5.0
github.com/alecthomas/kingpin/v2 v2.4.0
github.com/bombsimon/logrusr/v4 v4.1.0
- github.com/cert-manager/cert-manager v1.18.2
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/distribution/reference v0.6.0
- github.com/envoyproxy/go-control-plane v0.13.4
- github.com/envoyproxy/go-control-plane/envoy v1.32.5-0.20250722125442-5321204dac14
+ github.com/envoyproxy/go-control-plane v0.14.0
+ github.com/envoyproxy/go-control-plane/envoy v1.37.0
github.com/go-logr/logr v1.4.3
github.com/google/go-cmp v0.7.0
github.com/google/go-github/v48 v48.2.0
github.com/google/uuid v1.6.0
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
- github.com/onsi/ginkgo/v2 v2.25.3
- github.com/onsi/gomega v1.38.2
+ github.com/onsi/ginkgo/v2 v2.30.0
+ github.com/onsi/gomega v1.41.0
github.com/pkg/errors v0.9.1
github.com/projectcontour/yages v0.1.0
github.com/prometheus/client_golang v1.23.2
github.com/prometheus/client_model v0.6.2
- github.com/prometheus/common v0.66.1
- github.com/sirupsen/logrus v1.9.3
+ github.com/prometheus/common v0.68.1
+ github.com/sirupsen/logrus v1.9.4
github.com/stretchr/testify v1.11.1
- github.com/tsaarni/certyaml v0.10.0
- github.com/vektra/mockery/v2 v2.53.5
+ github.com/tsaarni/certyaml v0.11.0
go.uber.org/automaxprocs v1.6.0
- golang.org/x/net v0.44.0
- golang.org/x/oauth2 v0.31.0
- gonum.org/v1/plot v0.16.0
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7
- google.golang.org/grpc v1.75.1
- google.golang.org/protobuf v1.36.9
+ golang.org/x/net v0.56.0
+ golang.org/x/oauth2 v0.36.0
+ gonum.org/v1/plot v0.17.0
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171
+ google.golang.org/grpc v1.81.1
+ google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
gopkg.in/yaml.v3 v3.0.1
- k8s.io/api v0.34.1
- k8s.io/apiextensions-apiserver v0.34.1
- k8s.io/apimachinery v0.34.1
- k8s.io/client-go v0.34.1
- k8s.io/klog/v2 v2.130.1
- k8s.io/utils v0.0.0-20250604170112-4c0f3b243397
- sigs.k8s.io/controller-runtime v0.22.1
- sigs.k8s.io/controller-tools v0.19.0
+ k8s.io/api v0.36.1
+ k8s.io/apiextensions-apiserver v0.36.1
+ k8s.io/apimachinery v0.36.1
+ k8s.io/client-go v0.36.1
+ k8s.io/klog/v2 v2.140.0
+ k8s.io/utils v0.0.0-20260319190234-28399d86e0b5
+ sigs.k8s.io/controller-runtime v0.24.0
sigs.k8s.io/gateway-api v1.3.0
- sigs.k8s.io/kustomize/kyaml v0.20.1
+ sigs.k8s.io/kustomize/kyaml v0.21.1
)
require (
- cel.dev/expr v0.24.0 // indirect
+ cel.dev/expr v0.25.1 // indirect
codeberg.org/go-fonts/liberation v0.5.0 // indirect
- codeberg.org/go-latex/latex v0.1.0 // indirect
- codeberg.org/go-pdf/fpdf v0.10.0 // indirect
- git.sr.ht/~sbinet/gg v0.6.0 // indirect
+ codeberg.org/go-latex/latex v0.2.0 // indirect
+ codeberg.org/go-pdf/fpdf v0.11.1 // indirect
+ git.sr.ht/~sbinet/gg v0.7.0 // indirect
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect
- github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
+ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/campoy/embedmd v1.0.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/chigopher/pathlib v0.19.1 // indirect
- github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect
- github.com/emicklei/go-restful/v3 v3.12.2 // indirect
+ github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect
+ github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 // indirect
- github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect
+ github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
- github.com/fatih/color v1.18.0 // indirect
- github.com/fsnotify/fsnotify v1.9.0 // indirect
- github.com/fxamacker/cbor/v2 v2.9.0 // indirect
- github.com/go-asn1-ber/asn1-ber v1.5.6 // indirect
+ github.com/fsnotify/fsnotify v1.10.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.1 // indirect
+ github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect
github.com/go-errors/errors 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-openapi/jsonpointer v0.23.1 // indirect
+ github.com/go-openapi/jsonreference v0.21.5 // indirect
+ github.com/go-openapi/swag v0.26.0 // indirect
+ github.com/go-openapi/swag/cmdutils v0.26.0 // indirect
+ github.com/go-openapi/swag/conv v0.26.0 // indirect
+ github.com/go-openapi/swag/fileutils v0.26.0 // indirect
+ github.com/go-openapi/swag/jsonname v0.26.0 // indirect
+ github.com/go-openapi/swag/jsonutils v0.26.0 // indirect
+ github.com/go-openapi/swag/loading v0.26.0 // indirect
+ github.com/go-openapi/swag/mangling v0.26.0 // indirect
+ github.com/go-openapi/swag/netutils v0.26.0 // indirect
+ github.com/go-openapi/swag/stringutils v0.26.0 // indirect
+ github.com/go-openapi/swag/typeutils v0.26.0 // indirect
+ github.com/go-openapi/swag/yamlutils v0.26.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
- github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
- github.com/gobuffalo/flect v1.0.3 // indirect
- github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
- github.com/google/btree v1.1.3 // indirect
- github.com/google/gnostic-models v0.7.0 // indirect
+ github.com/google/gnostic-models v0.7.1 // indirect
github.com/google/go-querystring v1.1.0 // indirect
- github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
+ github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 // indirect
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
- github.com/huandu/xstrings v1.4.0 // indirect
- github.com/iancoleman/strcase v0.3.0 // indirect
- github.com/inconshreveable/mousetrap v1.1.0 // indirect
- github.com/jinzhu/copier v0.4.0 // indirect
- github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/mailru/easyjson v0.9.0 // indirect
- github.com/mattn/go-colorable v0.1.14 // indirect
- github.com/mattn/go-isatty v0.0.20 // indirect
github.com/miekg/dns v1.1.65 // indirect
- github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mitchellh/mapstructure v1.5.0 // indirect
- github.com/moby/spdystream v0.5.0 // indirect
+ github.com/moby/spdystream v0.5.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
- github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
- github.com/prometheus/procfs v0.16.1 // indirect
- github.com/rs/zerolog v1.33.0 // indirect
- github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/sagikazarmark/locafero v0.7.0 // indirect
- github.com/sourcegraph/conc v0.3.0 // indirect
- github.com/spf13/afero v1.12.0 // indirect
- github.com/spf13/cast v1.7.1 // indirect
- github.com/spf13/cobra v1.9.1 // indirect
- github.com/spf13/pflag v1.0.7 // indirect
- github.com/spf13/viper v1.20.0 // indirect
- github.com/stretchr/objx v0.5.2 // indirect
- github.com/subosito/gotenv v1.6.0 // indirect
- github.com/tsaarni/x500dn v1.0.0 // indirect
+ github.com/prometheus/procfs v0.20.1 // indirect
+ github.com/spf13/pflag v1.0.10 // indirect
+ github.com/stretchr/objx v0.5.3 // indirect
+ github.com/tsaarni/x500dn v1.1.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
- go.uber.org/multierr v1.11.0 // indirect
- go.yaml.in/yaml/v2 v2.4.2 // indirect
+ go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/crypto v0.42.0 // indirect
- golang.org/x/image v0.25.0 // indirect
- golang.org/x/mod v0.27.0 // indirect
- golang.org/x/sync v0.17.0 // indirect
- golang.org/x/sys v0.36.0 // indirect
- golang.org/x/term v0.35.0 // indirect
- golang.org/x/text v0.29.0 // indirect
- golang.org/x/time v0.9.0 // indirect
- golang.org/x/tools v0.36.0 // indirect
+ golang.org/x/crypto v0.53.0 // indirect
+ golang.org/x/image v0.38.0 // indirect
+ golang.org/x/mod v0.36.0 // indirect
+ golang.org/x/sync v0.21.0 // indirect
+ golang.org/x/sys v0.46.0 // indirect
+ golang.org/x/term v0.44.0 // indirect
+ golang.org/x/text v0.38.0 // indirect
+ golang.org/x/time v0.15.0 // indirect
+ golang.org/x/tools v0.45.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
- gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect
+ gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
- gopkg.in/yaml.v2 v2.4.0 // indirect
- k8s.io/code-generator v0.34.1 // indirect
- k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect
- k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
- sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
+ k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 // indirect
+ k8s.io/streaming v0.36.1 // indirect
+ sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
- sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
)
diff --git a/go.sum b/go.sum
index 1ef7e70b1d1..2eb2e6614a7 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,5 @@
-cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
-cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
+cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
+cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
codeberg.org/go-fonts/dejavu v0.4.0 h1:2yn58Vkh4CFK3ipacWUAIE3XVBGNa0y1bc95Bmfx91I=
codeberg.org/go-fonts/dejavu v0.4.0/go.mod h1:abni088lmhQJvso2Lsb7azCKzwkfcnttl6tL1UTWKzg=
@@ -7,93 +7,77 @@ codeberg.org/go-fonts/latin-modern v0.4.0 h1:vkRCc1y3whKA7iL9Ep0fSGVuJfqjix0ica9
codeberg.org/go-fonts/latin-modern v0.4.0/go.mod h1:BF68mZznJ9QHn+hic9ks2DaFl4sR5YhfM6xTYaP9vNw=
codeberg.org/go-fonts/liberation v0.5.0 h1:SsKoMO1v1OZmzkG2DY+7ZkCL9U+rrWI09niOLfQ5Bo0=
codeberg.org/go-fonts/liberation v0.5.0/go.mod h1:zS/2e1354/mJ4pGzIIaEtm/59VFCFnYC7YV6YdGl5GU=
-codeberg.org/go-latex/latex v0.1.0 h1:hoGO86rIbWVyjtlDLzCqZPjNykpWQ9YuTZqAzPcfL3c=
-codeberg.org/go-latex/latex v0.1.0/go.mod h1:LA0q/AyWIYrqVd+A9Upkgsb+IqPcmSTKc9Dny04MHMw=
-codeberg.org/go-pdf/fpdf v0.10.0 h1:u+w669foDDx5Ds43mpiiayp40Ov6sZalgcPMDBcZRd4=
-codeberg.org/go-pdf/fpdf v0.10.0/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoPOc4LjU=
+codeberg.org/go-latex/latex v0.2.0 h1:Ol/a6VHY06N+5gPfewswymoRb5ZcKDXWVaVegcx4hbI=
+codeberg.org/go-latex/latex v0.2.0/go.mod h1:VJAwQir7/T8LZxj7xAPivISKiVOwkMpQ8bTuPQ31X0Y=
+codeberg.org/go-pdf/fpdf v0.11.1 h1:U8+coOTDVLxHIXZgGvkfQEi/q0hYHYvEHFuGNX2GzGs=
+codeberg.org/go-pdf/fpdf v0.11.1/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoPOc4LjU=
dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo=
git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE=
-git.sr.ht/~sbinet/gg v0.6.0 h1:RIzgkizAk+9r7uPzf/VfbJHBMKUr0F5hRFxTUGMnt38=
-git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94=
+git.sr.ht/~sbinet/gg v0.7.0 h1:YmNf7YKd7diDMTPm86hZa1EM3pbkOyD/zzjl0LZUdNM=
+git.sr.ht/~sbinet/gg v0.7.0/go.mod h1:VYeli15tpMM4EvqlivlVbbyvWZlOU+EZn4XZmfBGUdM=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
-github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
-github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20241111191808-71fefeed8910 h1:750te9HMlt//faGVj6qi/bbPsZZiif96Zxu9laAFsRc=
-github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20241111191808-71fefeed8910/go.mod h1:XH7UFcXiBwpjFOhyHgTTmkTTA6rvn9oUlbnlIp9fRKI=
+github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE=
+github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
-github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
-github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
-github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
-github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
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/bombsimon/logrusr/v4 v4.1.0 h1:uZNPbwusB0eUXlO8hIUwStE6Lr5bLN6IgYgG+75kuh4=
github.com/bombsimon/logrusr/v4 v4.1.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8=
-github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY=
-github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8=
-github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
-github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cert-manager/cert-manager v1.18.2 h1:H2P75ycGcTMauV3gvpkDqLdS3RSXonWF2S49QGA1PZE=
-github.com/cert-manager/cert-manager v1.18.2/go.mod h1:icDJx4kG9BCNpGjBvrmsFd99d+lXUvWdkkcrSSQdIiw=
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/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A=
-github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY=
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/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=
-github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
-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/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik=
+github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.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/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
-github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
-github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
+github.com/emicklei/go-restful/v3 v3.13.0/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/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
-github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=
-github.com/envoyproxy/go-control-plane/envoy v1.32.5-0.20250722125442-5321204dac14 h1:aRBlYpmBz1eSze05xYoEo4C2GuiHl5JTohlQhIfaJJw=
-github.com/envoyproxy/go-control-plane/envoy v1.32.5-0.20250722125442-5321204dac14/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs=
+github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=
+github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU=
+github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ=
+github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
-github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
-github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
-github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
+github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
+github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k=
+github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
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/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
-github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
-github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
-github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
-github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
-github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
-github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
-github.com/go-asn1-ber/asn1-ber v1.5.6 h1:CYsqysemXfEaQbyrLJmdsCRuufHoLa3P/gGWGl5TDrM=
-github.com/go-asn1-ber/asn1-ber v1.5.6/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
+github.com/fsnotify/fsnotify v1.10.0 h1:Xx/5Ydg9CeBDX/wi4VJqStNtohYjitZhhlHt4h3St1M=
+github.com/fsnotify/fsnotify v1.10.0/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
+github.com/fxamacker/cbor/v2 v2.9.1 h1:2rWm8B193Ll4VdjsJY28jxs70IdDsHRWgQYAI80+rMQ=
+github.com/fxamacker/cbor/v2 v2.9.1/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs=
+github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=
+github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=
+github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk=
+github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE=
+github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc=
+github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk=
+github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
@@ -104,21 +88,45 @@ 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-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4=
+github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY=
+github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
+github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
+github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI=
+github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0=
+github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU=
+github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM=
+github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I=
+github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE=
+github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU=
+github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc=
+github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w=
+github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M=
+github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA=
+github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM=
+github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y=
+github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko=
+github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg=
+github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ=
+github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0=
+github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c=
+github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo=
+github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg=
+github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE=
+github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4=
+github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE=
+github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ=
+github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU=
+github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0=
+github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE=
+github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4=
+github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
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/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
-github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
-github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4=
-github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
@@ -129,12 +137,8 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-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/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI=
-github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
-github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
-github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
+github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c=
+github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -146,8 +150,8 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
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-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
-github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
+github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 h1:EwtI+Al+DeppwYX2oXJCETMO23COyaKGP6fHVpkpWpg=
+github.com/google/pprof v0.0.0-20260402051712-545e8a4df936/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI=
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/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
@@ -156,18 +160,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDa
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
-github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
-github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
-github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
-github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
-github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
-github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
-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/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE=
+github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung=
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=
@@ -184,23 +178,14 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
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/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
-github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
-github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
-github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
+github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=
+github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE=
+github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A=
github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
-github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU=
-github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
+github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y=
+github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
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=
@@ -209,21 +194,13 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-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.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.25.3 h1:Ty8+Yi/ayDAGtk4XxmmfUy4GabvM+MegeB4cDLRi6nw=
-github.com/onsi/ginkgo/v2 v2.25.3/go.mod h1:43uiyQC4Ed2tkOzLsEYm7hnrb7UJTWHYNsuy3bG/snE=
-github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
-github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
+github.com/onsi/ginkgo/v2 v2.30.0 h1:zxM/9XneXFIy64j6/wAmBIX4zRC7Hu6U8XFNZvDnCQc=
+github.com/onsi/ginkgo/v2 v2.30.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44=
+github.com/onsi/gomega v1.41.0 h1:OwKp4pXNgVxf6sCplzYo794OFNuoL2q2SBMU5NSWOjA=
+github.com/onsi/gomega v1.41.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
-github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
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=
@@ -241,86 +218,64 @@ github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UH
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
-github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
-github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
-github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
-github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
-github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
-github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
-github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
-github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
-github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
+github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY=
+github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y=
+github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
+github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
+github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
-github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
-github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
-github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
-github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
-github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
-github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
-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/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
-github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY=
-github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
-github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
-github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
+github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
+github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
+github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
+github.com/spf13/pflag v1.0.10/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/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/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
+github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
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.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/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
-github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
-github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
-github.com/tsaarni/certyaml v0.10.0 h1:8ZWHO4Zg4VHUf7YblZNju44PcG5M+YtlJawiArYUHRs=
-github.com/tsaarni/certyaml v0.10.0/go.mod h1:rI1wDTE/VQIglHOyGbjfvqb+5mWTVT5uLFVDDcT1sq8=
-github.com/tsaarni/x500dn v1.0.0 h1:LvaWTkqRpse4VHBhB5uwf3wytokK4vF9IOyNAEyiA+U=
-github.com/tsaarni/x500dn v1.0.0/go.mod h1:QaHa3EcUKC4dfCAZmj8+ZRGLKukWgpGv9H3oOCsAbcE=
-github.com/vektra/mockery/v2 v2.53.5 h1:iktAY68pNiMvLoHxKqlSNSv/1py0QF/17UGrrAMYDI8=
-github.com/vektra/mockery/v2 v2.53.5/go.mod h1:hIFFb3CvzPdDJJiU7J4zLRblUMv7OuezWsHPmswriwo=
+github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
+github.com/tidwall/gjson v1.18.0/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.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
+github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
+github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
+github.com/tsaarni/certyaml v0.11.0 h1:qpiXKPCGZvQaYf3ParnvLcxMZmWqBIeU4XDAywfQUHw=
+github.com/tsaarni/certyaml v0.11.0/go.mod h1:AiWJjkISlmC8shtMWPxsY9vMFpu+VYB8arwWr8079f4=
+github.com/tsaarni/x500dn v1.1.0 h1:+rgqGj7LQEkdIIRLsYJm5S6M2dDBscb6/xiEcGW678s=
+github.com/tsaarni/x500dn v1.1.0/go.mod h1:vzfi5pu5wr1eeFf9/0rIr5Bc1kxeyes4jFMCcp0wfCk=
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/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
-go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
-go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
-go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
-go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
-go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
-go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
-go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
-go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
-go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
-go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
-go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
-go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
-go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
+go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
+go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
+go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
+go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
+go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
+go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
+go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
+go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
+go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
+go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
+go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
+go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
@@ -331,30 +286,28 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i
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.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
-go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
-go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
-go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
+go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
+go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
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/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
-golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
+golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
+golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
-golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
-golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
-golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
+golang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE=
+golang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY=
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/lint v0.0.0-20190930215403-16217165b5de/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.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
-golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
+golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
+golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -363,18 +316,18 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
-golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
+golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
+golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo=
-golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
+golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
+golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
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.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
-golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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=
@@ -382,20 +335,16 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
-golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
-golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
-golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
-golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
-golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
+golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
+golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
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=
@@ -406,54 +355,46 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
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.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
-golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
-golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY=
-golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
-golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
-golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8=
+golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
+golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
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.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
-gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
-gonum.org/v1/plot v0.16.0 h1:dK28Qx/Ky4VmPUN/2zeW0ELyM6ucDnBAj5yun7M9n1g=
-gonum.org/v1/plot v0.16.0/go.mod h1:Xz6U1yDMi6Ni6aaXILqmVIb6Vro8E+K7Q/GeeH+Pn0c=
+gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
+gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
+gonum.org/v1/plot v0.17.0 h1:d0DwPVBe9jnEGqQBoZGl/P2M9WciJbG2CnV59C9QBT4=
+gonum.org/v1/plot v0.17.0/go.mod h1:ipt2GUN1oqzr2O7wCjLDtw1ShfIYYNBp4o0O1Ez5B3Y=
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-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU=
-google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4=
+google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
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.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
-google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
-google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
-google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
+google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
+google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
+google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
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-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/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo=
+gopkg.in/evanphx/json-patch.v4 v4.13.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/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.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/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-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
@@ -461,45 +402,35 @@ 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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
-k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM=
-k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk=
-k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI=
-k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc=
-k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4=
-k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
-k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA=
-k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0=
-k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY=
-k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8=
-k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc=
-k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg=
-k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A=
-k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0=
-k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q=
-k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/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-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
-k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
-k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
-k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY=
+k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo=
+k8s.io/apiextensions-apiserver v0.36.1 h1:6JfYmPUsuUIHuN+3QxutXYWj492RqF5fBSx67GYK5Ks=
+k8s.io/apiextensions-apiserver v0.36.1/go.mod h1:pLzZin90riwisdzKwv/GoTwENooytoIx5zWJb4Hkby8=
+k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA=
+k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8=
+k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0=
+k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU=
+k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
+k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199 h1:sWu4Td5mgJlwunsUydnhKEAfNUHM7hm1wfKEQmD7G5c=
+k8s.io/kube-openapi v0.0.0-20260427204847-8949caaa1199/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0=
+k8s.io/streaming v0.36.1 h1:L+K68n4Gg940BGNNYtUBvL1WTLL0YnKT3s+P1MNAmR4=
+k8s.io/streaming v0.36.1/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s=
+k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM=
+k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg=
-sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY=
-sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk=
-sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0=
+sigs.k8s.io/controller-runtime v0.24.0 h1:Ck6N2LdS8Lovy1o25BB4r1xjvLEKUl1s2o9kU+KWDE4=
+sigs.k8s.io/controller-runtime v0.24.0/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw=
sigs.k8s.io/gateway-api v1.3.0 h1:q6okN+/UKDATola4JY7zXzx40WO4VISk7i9DIfOvr9M=
sigs.k8s.io/gateway-api v1.3.0/go.mod h1:d8NV8nJbaRbEKem+5IuxkL8gJGOZ+FJ+NvOIltV8gDk=
-sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
-sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
-sigs.k8s.io/kustomize/kyaml v0.20.1 h1:PCMnA2mrVbRP3NIB6v9kYCAc38uvFLVs8j/CD567A78=
-sigs.k8s.io/kustomize/kyaml v0.20.1/go.mod h1:0EmkQHRUsJxY8Ug9Niig1pUMSCGHxQ5RklbpV/Ri6po=
+sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
+sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
+sigs.k8s.io/kustomize/kyaml v0.21.1 h1:IVlbmhC076nf6foyL6Taw4BkrLuEsXUXNpsE+ScX7fI=
+sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
-sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
+sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo=
+sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
diff --git a/hack/actions/bump-envoy-version/main.go b/hack/actions/bump-envoy-version/main.go
new file mode 100644
index 00000000000..188cb4e1b89
--- /dev/null
+++ b/hack/actions/bump-envoy-version/main.go
@@ -0,0 +1,171 @@
+// Copyright Project Contour 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.
+
+//go:build none
+
+// Updates all references to the Envoy version in the repository and generates a template for changelog entry.
+//
+// Usage:
+//
+// go run ./hack/actions/bump-envoy-version/main.go
+//
+// By default, the script updates to the latest patch release for the current minor version.
+// To target a specific major or minor version:
+//
+// go run ./hack/actions/bump-envoy-version/main.go distroless-v1.35
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "os"
+ "os/exec"
+ "os/user"
+ "regexp"
+ "strings"
+
+ "github.com/sirupsen/logrus"
+)
+
+var (
+ log = logrus.StandardLogger()
+
+ filesToPatch = []string{
+ "Makefile", // Envoy version was in Makefile in older code.
+ "cmd/contour/gatewayprovisioner.go",
+ "examples/contour/03-envoy.yaml",
+ "examples/deployment/03-envoy-deployment.yaml",
+ }
+)
+
+func main() {
+ log.SetFormatter(&logrus.TextFormatter{ForceColors: true})
+
+ currentVersion := getCurrentEnvoyVersion()
+
+ // releaseTrack is the Envoy major or minor version to track, e.g. "v1.36".
+ var releaseTrack string
+ if len(os.Args) < 2 {
+ // If no argument is given, derive the release track from the current minor version.
+ releaseTrack = currentVersion[:strings.LastIndex(currentVersion, ".")]
+ } else {
+ releaseTrack = os.Args[1]
+ }
+
+ log.Infof("Current Envoy version: %s", currentVersion)
+
+ // Strip "distroless" prefix for GitHub API lookup but use it for file updates.
+ var imagePrefix string
+ if isDistroless := strings.HasPrefix(currentVersion, "distroless-"); isDistroless {
+ releaseTrack = strings.TrimPrefix(releaseTrack, "distroless-")
+ imagePrefix = "distroless-"
+ }
+
+ latestVersion := getLatestEnvoyVersion(releaseTrack)
+ log.Infof("Latest version: %s", latestVersion)
+
+ updateFiles(imagePrefix + latestVersion)
+ changelogFile := createChangelogTemplate(latestVersion)
+
+ log.Info("Envoy version update completed")
+ log.Info("Update following files manually (in main branch):")
+ log.Info("- site/content/resources/compatibility-matrix.md")
+ log.Info("- versions.yaml")
+ log.Infof("- %s (only needed if doing bump in main branch)", changelogFile)
+}
+
+func getCurrentEnvoyVersion() string {
+ content, err := os.ReadFile("examples/contour/03-envoy.yaml")
+ if err != nil {
+ log.WithError(err).Fatal("Failed to determine current version")
+ }
+
+ envoyImageRe := regexp.MustCompile(`docker\.io/envoyproxy/envoy:(distroless-)?v([0-9]+\.[0-9]+\.[0-9]+)`)
+ matches := envoyImageRe.FindStringSubmatch(string(content))
+ if len(matches) < 3 {
+ log.Fatal("Failed to match current version in examples/contour/03-envoy.yaml")
+ }
+
+ return matches[1] + "v" + matches[2]
+}
+
+func getLatestEnvoyVersion(track string) string {
+ resp, err := http.Get("https://api.github.com/repos/envoyproxy/envoy/releases")
+ if err != nil {
+ log.WithError(err).Fatal("Failed to fetch releases from GitHub API")
+ }
+ defer resp.Body.Close()
+
+ var releases []struct {
+ TagName string `json:"tag_name"`
+ }
+ if err := json.NewDecoder(resp.Body).Decode(&releases); err != nil {
+ log.WithError(err).Fatal("Failed to parse releases in GitHub API response")
+ }
+
+ prefix := track + "."
+ for _, r := range releases {
+ if strings.HasPrefix(r.TagName, prefix) {
+ return r.TagName
+ }
+ }
+ log.WithField("track", track).Fatal("No release found for track")
+ return ""
+}
+
+func updateFiles(version string) {
+ envoyImageRe := regexp.MustCompile(`docker\.io/envoyproxy/envoy:(distroless-)?v[0-9]+\.[0-9]+\.[0-9]+`)
+
+ for _, file := range filesToPatch {
+ content, err := os.ReadFile(file)
+ if err != nil {
+ log.WithError(err).WithField("file", file).Fatal("Failed to read file")
+ }
+
+ updated := envoyImageRe.ReplaceAllString(string(content), "docker.io/envoyproxy/envoy:"+version)
+
+ if updated != string(content) {
+ if err := os.WriteFile(file, []byte(updated), 0o600); err != nil {
+ log.WithError(err).WithField("file", file).Fatal("Failed to write file")
+ }
+ log.Infof("Updated file: %s", file)
+ }
+ }
+
+ log.Info("Running 'make generate' to update generated files")
+ cmd := exec.Command("make", "generate")
+ cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
+ if err := cmd.Run(); err != nil {
+ log.WithError(err).Fatal("Failed to run 'make generate'")
+ }
+}
+
+func createChangelogTemplate(version string) string {
+ u, err := user.Current()
+ if err != nil {
+ log.WithError(err).Fatal("Failed to get current user")
+ }
+
+ file := fmt.Sprintf("changelogs/unreleased/dddd-%s-small.md", u.Username)
+ majorMinor := version[:strings.LastIndex(version, ".")]
+ url := fmt.Sprintf("https://www.envoyproxy.io/docs/envoy/%s/version_history/%s/%s", version, majorMinor, version)
+ content := fmt.Sprintf("Updates Envoy to %s. See the [Envoy release notes](%s) for more information about the content of the release.\n", version, url)
+
+ if err := os.WriteFile(file, []byte(content), 0o600); err != nil {
+ log.WithError(err).Fatal("Failed to write changelog")
+ }
+ log.Infof("Created changelog template: %s", file)
+
+ return file
+}
diff --git a/hack/actions/bump-go-version/main.go b/hack/actions/bump-go-version/main.go
new file mode 100644
index 00000000000..52592a52aa1
--- /dev/null
+++ b/hack/actions/bump-go-version/main.go
@@ -0,0 +1,184 @@
+// Copyright Project Contour 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.
+
+//go:build none
+
+// Updates all references to the Go version in the repository and creates a template for changelog entry.
+//
+// Usage:
+//
+// go run ./hack/actions/bump-go-version/main.go
+//
+// By default, the script updates to the latest patch release for the current minor version.
+// To target a specific major or minor version:
+//
+// go run ./hack/actions/bump-go-version/main.go 1.25
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "os"
+ "os/exec"
+ "os/user"
+ "regexp"
+ "strings"
+
+ "github.com/sirupsen/logrus"
+)
+
+var (
+ log = logrus.StandardLogger()
+
+ filesToPatch = []string{
+ "Makefile",
+ ".github/workflows/build_daily.yaml",
+ ".github/workflows/build_tag.yaml",
+ ".github/workflows/codeql-analysis.yml",
+ ".github/workflows/prbuild.yaml",
+ }
+)
+
+func main() {
+ log.SetFormatter(&logrus.TextFormatter{ForceColors: true})
+
+ currentVersion := getCurrentGoVersion()
+
+ // releaseTrack is the Go major or minor version to track, e.g. "1.25".
+ var releaseTrack string
+ if len(os.Args) < 2 {
+ // If no argument is given, derive the release track from the current minor version.
+ releaseTrack = currentVersion[:strings.LastIndex(currentVersion, ".")]
+ } else {
+ releaseTrack = os.Args[1]
+ }
+
+ log.Infof("Current Go version: %s", currentVersion)
+
+ latestVersion := getLatestGoVersionByReleaseTrack(releaseTrack)
+ log.Infof("Latest version: %s", latestVersion)
+
+ latestImageHash := getGolangImageHash(latestVersion)
+ log.Infof("Image hash: %s", latestImageHash)
+
+ updateFiles(latestVersion, latestImageHash)
+ createChangelogTemplate(latestVersion)
+
+ log.Info("Go version update completed")
+}
+
+func getCurrentGoVersion() string {
+ content, err := os.ReadFile("Makefile")
+ if err != nil {
+ log.WithError(err).Fatal("Failed to determine current version")
+ }
+
+ buildImageRe := regexp.MustCompile(`BUILD_BASE_IMAGE\s*\?=\s*golang:([0-9.]+)`)
+ matches := buildImageRe.FindStringSubmatch(string(content))
+ if len(matches) < 2 {
+ log.Fatal("Failed to match current version in Makefile")
+ }
+
+ return matches[1]
+}
+
+func getLatestGoVersionByReleaseTrack(track string) string {
+ resp, err := http.Get("https://go.dev/dl/?mode=json&include=all")
+ if err != nil {
+ log.WithError(err).Fatal("Failed to fetch releases from go.dev API")
+ }
+ defer resp.Body.Close()
+
+ var releases []struct{ Version string }
+ if err := json.NewDecoder(resp.Body).Decode(&releases); err != nil {
+ log.WithError(err).Fatal("Failed to parse releases in go.dev API response")
+ }
+
+ prefix := "go" + track
+ for _, r := range releases {
+ if strings.HasPrefix(r.Version, prefix) {
+ return r.Version
+ }
+ }
+ log.WithField("track", track).Fatal("No release found for track")
+ return ""
+}
+
+func getGolangImageHash(version string) string {
+ tag := strings.TrimPrefix(version, "go")
+ url := fmt.Sprintf("https://registry.hub.docker.com/v2/repositories/library/golang/tags/%s", tag)
+
+ resp, err := http.Get(url) // #nosec G107: Potential HTTP request made with variable url
+ if err != nil {
+ log.WithError(err).Fatal("Failed to fetch image hash from Docker Hub")
+ }
+ defer resp.Body.Close()
+
+ var info struct{ Digest string }
+ if err := json.NewDecoder(resp.Body).Decode(&info); err != nil {
+ log.WithError(err).Fatal("Failed to parse tag info from Docker Hub API response")
+ }
+
+ if info.Digest == "" {
+ log.WithField("version", version).Fatal("No image found for version")
+ }
+ return info.Digest
+}
+
+func updateFiles(version, hash string) {
+ ver := strings.TrimPrefix(version, "go")
+ buildImageRegexp := regexp.MustCompile(`(BUILD_BASE_IMAGE\s*\?=\s*golang:)[0-9.]+(@sha256:[a-f0-9]{64})?`)
+ goVersionRegexp := regexp.MustCompile(`(GO_VERSION:\s*)[0-9.]+`)
+
+ for _, file := range filesToPatch {
+ content, err := os.ReadFile(file)
+ if err != nil {
+ log.WithError(err).WithField("file", file).Fatal("Failed to read file")
+ }
+
+ updated := buildImageRegexp.ReplaceAllString(string(content), fmt.Sprintf("${1}%s@%s", ver, hash))
+ updated = goVersionRegexp.ReplaceAllString(updated, "${1}"+ver)
+
+ if updated != string(content) {
+ if err := os.WriteFile(file, []byte(updated), 0o600); err != nil {
+ log.WithError(err).WithField("file", file).Fatal("Failed to write file")
+ }
+ log.Infof("Updated file: %s", file)
+ }
+ }
+
+ log.Info("Running 'go mod tidy' to update module files")
+ cmd := exec.Command("go", "mod", "tidy")
+ cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
+ if err := cmd.Run(); err != nil {
+ log.WithError(err).Fatal("Failed to run 'go mod tidy'")
+ }
+}
+
+func createChangelogTemplate(version string) {
+ u, err := user.Current()
+ if err != nil {
+ log.WithError(err).Fatal("Failed to get current user")
+ }
+
+ file := fmt.Sprintf("changelogs/unreleased/nnnn-%s-small.md", u.Username)
+ parts := strings.SplitN(strings.TrimPrefix(version, "go"), ".", 3)
+ url := fmt.Sprintf("https://go.dev/doc/devel/release#go%s.%s.0", parts[0], parts[1])
+ content := fmt.Sprintf("Updates Go to %s. See the [Go release notes](%s) for more information about the content of the release.\n", version, url)
+
+ if err := os.WriteFile(file, []byte(content), 0o600); err != nil {
+ log.WithError(err).Fatal("Failed to write changelog")
+ }
+ log.Infof("Created changelog template: %s", file)
+}
diff --git a/hack/actions/install-kubernetes-toolchain.sh b/hack/actions/install-kubernetes-toolchain.sh
index e949c9ebac2..c02474b4859 100755
--- a/hack/actions/install-kubernetes-toolchain.sh
+++ b/hack/actions/install-kubernetes-toolchain.sh
@@ -4,8 +4,8 @@ set -o errexit
set -o nounset
set -o pipefail
-readonly KUBECTL_VERS="v1.34.0"
-readonly KIND_VERS="v0.30.0"
+readonly KUBECTL_VERS="v1.36.1"
+readonly KIND_VERS="v0.32.0"
readonly PROGNAME=$(basename $0)
readonly CURL=${CURL:-curl}
diff --git a/hack/generate-api-docs.sh b/hack/generate-api-docs.sh
index 404bf0d2fbf..a385b98d02e 100755
--- a/hack/generate-api-docs.sh
+++ b/hack/generate-api-docs.sh
@@ -17,7 +17,7 @@ readonly PKGROOT="${1:-github.com/projectcontour/contour/apis/projectcontour}"
gendoc::exec() {
local -r confdir="${REPO}/hack/api-docs-config/refdocs"
- go run github.com/ahmetb/gen-crd-api-reference-docs \
+ go tool -modfile="${REPO}/tools/go.mod" github.com/ahmetb/gen-crd-api-reference-docs \
-template-dir "${confdir}" \
-config "${confdir}/config.json" \
"$@"
diff --git a/hack/generate-crd-deepcopy.sh b/hack/generate-crd-deepcopy.sh
index 1d18e5ed6f1..31a2a4c61f3 100755
--- a/hack/generate-crd-deepcopy.sh
+++ b/hack/generate-crd-deepcopy.sh
@@ -39,8 +39,8 @@ readonly HEADER=$(mktemp)
boilerplate > "${HEADER}"
echo "controller-gen version: "
-go run sigs.k8s.io/controller-tools/cmd/controller-gen --version
+go tool -modfile="${REPO}/tools/go.mod" sigs.k8s.io/controller-tools/cmd/controller-gen --version
-exec go run sigs.k8s.io/controller-tools/cmd/controller-gen \
+exec go tool -modfile="${REPO}/tools/go.mod" sigs.k8s.io/controller-tools/cmd/controller-gen \
"object:headerFile=${HEADER}" \
"paths=${PATHS}"
diff --git a/hack/generate-crd-yaml.sh b/hack/generate-crd-yaml.sh
index c7737363c05..56ea2c30982 100755
--- a/hack/generate-crd-yaml.sh
+++ b/hack/generate-crd-yaml.sh
@@ -16,19 +16,31 @@ trap 'rm -rf "$TEMPDIR"; exit' 0 1 2 15
cd "${REPO}"
echo "controller-gen version: "
-go run sigs.k8s.io/controller-tools/cmd/controller-gen --version
+go tool -modfile="${REPO}/tools/go.mod" sigs.k8s.io/controller-tools/cmd/controller-gen --version
# Controller-gen seems to use an unstable sort for the order of output of the CRDs
# so, output them to separate files, then concatenate those files.
# That should give a stable sort.
-go run sigs.k8s.io/controller-tools/cmd/controller-gen \
+go tool -modfile="${REPO}/tools/go.mod" sigs.k8s.io/controller-tools/cmd/controller-gen \
crd:crdVersions=v1 "paths=${PATHS}" "output:dir=${TEMPDIR}"
-# Explicitly add "preserveUnknownFields: false" to CRD specs since any CRDs created
-# as v1beta1 will have this field set to true, which we don't want going forward, and
-# it needs to be explicitly specified in order to be updated/removed. After enough time
-# has passed and we're not concerned about folks upgrading from v1beta1 CRDs, we can
-# remove the awk call that adds this field to the spec, and rely on the v1 default.
-ls "${TEMPDIR}"/*.yaml | xargs cat | sed '/^$/d' \
- | awk '/group: projectcontour.io/{print " preserveUnknownFields: false"}1' \
- > "${REPO}/examples/contour/01-crds.yaml"
+# Remove "error" from required fields in load balancer status.
+# For details, see:
+# - https://github.com/projectcontour/contour/issues/7391
+# - https://github.com/kubernetes-sigs/controller-tools/pull/944#issuecomment-3314629362
+# This workaround can be removed if the upstream Kubernetes type resolves the conflicting markers.
+readonly HTTPPROXY_CRD="${TEMPDIR}/projectcontour.io_httpproxies.yaml"
+readonly PATCH_PATH="/spec/versions/0/schema/openAPIV3Schema/properties/status/properties/loadBalancer/properties/ingress/items/properties/ports/items/required/0"
+
+kubectl::patch() {
+ kubectl patch -f "$HTTPPROXY_CRD" --local --type=json -p "$1" "${@:2}"
+}
+
+kubectl::patch "[{\"op\": \"test\", \"path\": \"$PATCH_PATH\", \"value\": \"error\"}]" --dry-run=client > /dev/null || {
+ echo "Error: CRD structure has changed. The workaround for issue #7391 may no longer be needed or needs updating."
+ exit 1
+}
+
+kubectl::patch "[{\"op\": \"remove\", \"path\": \"$PATCH_PATH\"}]" -o yaml > "$HTTPPROXY_CRD.tmp" && { echo "---"; cat "$HTTPPROXY_CRD.tmp"; } > "$HTTPPROXY_CRD"
+
+ls "${TEMPDIR}"/*.yaml | xargs cat | sed '/^$/d' > "${REPO}/examples/contour/01-crds.yaml"
diff --git a/hack/generate-rbac.sh b/hack/generate-rbac.sh
index 3160afa6775..7a65fbcd974 100755
--- a/hack/generate-rbac.sh
+++ b/hack/generate-rbac.sh
@@ -18,9 +18,9 @@ cat > "${REPO}/examples/contour/02-role-contour.yaml" <
AuthorizationServer configures an external server to authenticate
client requests. The external server must implement the v3 Envoy
-external authorization GRPC protocol (https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto).AuthorizationServer
+serviceType
++ + +AuthorizationServiceType + + + |
+
+(Optional)
+ ServiceType sets the protocol used to communicate with +the external authorization server. + |
+
+httpSettings
++ + +HTTPAuthorizationServerSettings + + + |
+
+(Optional)
+ HTTPAuthorizationServerSettings defines configurations for interacting with an external HTTP authorization server. + |
+
authPolicy
@@ -482,6 +514,29 @@ AuthorizationSer |
string alias)+(Appears on: +AuthorizationServer) +
++
AuthorizationServiceType indicates the protocol +implemented by the external authorization server.
+ +| Value | +Description | +
|---|---|
"grpc" |
++ |
"http" |
++ |
string alias)@@ -1482,6 +1537,156 @@
+(Appears on: +HTTPAuthorizationServerSettings) +
++
HTTPAuthorizationServerAllowedHeaders specifies how to conditionally match against allowed headers +in the context of HTTP authorization. Regex support is intentionally excluded to simplify the user +experience and prevent potential issues. Only one of Prefix, Exact, Suffix or Contains must be provided.
+ +| Field | +Description | +
|---|---|
+exact
++ +string + + |
+
+(Optional)
+ Exact specifies a string that the header name must be equal to. + |
+
+prefix
++ +string + + |
+
+(Optional)
+ Prefix defines a prefix match for the header name. + |
+
+suffix
++ +string + + |
+
+(Optional)
+ Suffix defines a suffix match for a header name. + |
+
+contains
++ +string + + |
+
+(Optional)
+ Contains specifies a substring that must be present in the header name. + |
+
+ignoreCase
++ +bool + + |
+
+(Optional)
+ IgnoreCase specifies whether string matching should be case-insensitive. + |
+
+(Appears on: +AuthorizationServer) +
++
HTTPAuthorizationServerSettings defines configurations for interacting with an external HTTP authorization server.
+ +| Field | +Description | +
|---|---|
+pathPrefix
++ +string + + |
+
+(Optional)
+ PathPrefix Sets a prefix to the value of authorization request header Path. + |
+
+allowedAuthorizationHeaders
++ + +[]HTTPAuthorizationServerAllowedHeaders + + + |
+
+(Optional)
+ AllowedAuthorizationHeaders specifies client request headers that will be sent to the authorization server. +Host, Method, Path, Content-Length, and Authorization headers are additionally included in the list. + |
+
+allowedUpstreamHeaders
++ + +[]HTTPAuthorizationServerAllowedHeaders + + + |
+
+(Optional)
+ AllowedUpstreamHeaders specifies response headers from the authorization server +that may be added to the original client request before sending it to the upstream. + |
+
@@ -2698,7 +2903,7 @@
remoteJWKS
+remoteJWKS,omitzero
Remote JWKS to use for verifying JWT signatures.
+(Optional) +Remote JWKS fetches signing keys from an HTTP(S) endpoint.
+localJWKS,omitzero
+Local JWKS loads signing keys from a Kubernetes Secret.
+(Appears on: +JWTProvider) +
++
LocalJWKS defines how to fetch a JWKS from a Kubernetes secret.
+ +| Field | +Description | +
|---|---|
+secretName
++ +string + + |
+
+ The name of the secret that contains the JWKS. + |
+
+key
++ +string + + |
+
+ The key of the secret that contains the JWKS. + |
+
@@ -5380,8 +5644,8 @@
Key which is expected to be present in the ‘subjectAltName’ of the presented certificate. -Deprecated: migrate to using the plural field subjectNames.
+Key which is expected to be present in the ‘subjectAltName’ of the presented certificate.
+Deprecated: migrate to using the plural field subjectNames.
Services specifies the set of Kubernetes Service resources that -receive GRPC extension API requests. +receive extension API requests. If no weights are specified for any of the entries in this array, traffic will be spread evenly across all the services. @@ -6157,7 +6421,7 @@
Protocol may be used to specify (or override) the protocol used to reach this Service. -Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations.
+Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.The policy for load balancing GRPC service requests. Note that the +
The policy for load balancing service requests. Note that the
Cookie and RequestHash load balancing strategies cannot be used
-here.
tls
+(Appears on: +EnvoyListenerConfig) +
++
EnvoyListenerTLS describes TLS parameters for Envoy listeners. +It extends EnvoyTLS with listener-specific settings like TLS fingerprinting.
+ +| Field | +Description | +
|---|---|
+EnvoyTLS
++ + +EnvoyTLS + + + |
+
+
+(Members of |
+
+fingerprint
++ + +TLSFingerprint + + + |
+
+(Optional)
+ Fingerprint defines TLS fingerprinting configuration +for the TLS Inspector listener filter. + |
+
@@ -8291,10 +8607,11 @@
(Appears on: ClusterParameters, -EnvoyListenerConfig) +EnvoyListenerTLS)
-
EnvoyTLS describes tls parameters for Envoy listneners.
+EnvoyTLS describes TLS protocol parameters shared between +listener and upstream TLS contexts.
|
Services specifies the set of Kubernetes Service resources that -receive GRPC extension API requests. +receive extension API requests. If no weights are specified for any of the entries in this array, traffic will be spread evenly across all the services. @@ -8471,7 +8788,7 @@ ExtensionServiceSpec
Protocol may be used to specify (or override) the protocol used to reach this Service. -Values may be h2 or h2c. If omitted, protocol-selection falls back on Service annotations. +Values may be h2, h2c or http/1.1. If omitted, protocol-selection falls back on Service annotations.ExtensionServiceSpec
The policy for load balancing GRPC service requests. Note that the + The policy for load balancing service requests. Note that the
|
+(Appears on: +EnvoyListenerTLS) +
++
TLSFingerprint defines TLS fingerprinting configuration for the TLS Inspector.
+ +| Field | +Description | +
|---|---|
+ja3
++ +bool + + |
+
+(Optional)
+ JA3 enables JA3 fingerprinting in the TLS Inspector. +When true, populates JA3 hash in dynamic metadata. + |
+
+ja4
++ +bool + + |
+
+(Optional)
+ JA4 enables JA4 fingerprinting in the TLS Inspector. +When true, populates JA4 hash in dynamic metadata. + |
+
@@ -9907,6 +10271,34 @@
clientSampling
+ClientSampling defines the sampling rate when x-client-trace-id header is set. +contour’s default is 100.
+randomSampling
+RandomSampling defines the random sampling rate for all requests. +contour’s default is 100.
+maxPathTagLength