From 65273a90a1661f17f9f6d77f6fa4c60f2855dc01 Mon Sep 17 00:00:00 2001 From: KUANPEIEN Date: Mon, 13 Jul 2026 20:44:38 +0700 Subject: [PATCH 1/3] Add Envoy Gateway compatibility matrix --- static/compatibilities/envoy-gateway.yaml | 104 ++++++++++++++++++ static/compatibilities/manifest.yaml | 1 + utils/compatibility/scrapers/envoy-gateway.py | 104 ++++++++++++++++++ 3 files changed, 209 insertions(+) create mode 100644 static/compatibilities/envoy-gateway.yaml create mode 100644 utils/compatibility/scrapers/envoy-gateway.py diff --git a/static/compatibilities/envoy-gateway.yaml b/static/compatibilities/envoy-gateway.yaml new file mode 100644 index 0000000000..6a0d7d569c --- /dev/null +++ b/static/compatibilities/envoy-gateway.yaml @@ -0,0 +1,104 @@ +icon: https://raw.githubusercontent.com/envoyproxy/gateway/main/site/static/icons/logo.svg +git_url: https://github.com/envoyproxy/gateway +release_url: https://github.com/envoyproxy/gateway/releases/tag/v{vsn} +readme_url: https://gateway.envoyproxy.io/news/releases/matrix/ +helm_repository_url: oci://docker.io/envoyproxy/gateway-helm +chart_name: gateway-helm +versions: +- version: 1.8 + kube: ['1.35', '1.34', '1.33', '1.32'] + requirements: + - Envoy Proxy distroless-v1.38.0 + - Rate Limit fe26676d + - Gateway API v1.5.1 + incompatibilities: [] +- version: 1.7 + kube: ['1.35', '1.34', '1.33', '1.32'] + requirements: + - Envoy Proxy distroless-v1.37.0 + - Rate Limit 3fb70258 + - Gateway API v1.4.1 + incompatibilities: [] +- version: 1.6 + kube: ['1.33', '1.32', '1.31', '1.30'] + requirements: + - Envoy Proxy distroless-v1.36.4 + - Rate Limit 3fb70258 + - Gateway API v1.4.0 + incompatibilities: [] +- version: 1.5 + kube: ['1.33', '1.32', '1.31', '1.30'] + requirements: + - Envoy Proxy distroless-v1.35.0 + - Rate Limit a90e0e5d + - Gateway API v1.3.0 + incompatibilities: [] +- version: 1.4 + kube: ['1.33', '1.32', '1.31', '1.30'] + requirements: + - Envoy Proxy distroless-v1.34.1 + - Rate Limit 3e085e5b + - Gateway API v1.3.0 + incompatibilities: [] +- version: 1.3 + kube: ['1.32', '1.31', '1.30', '1.29'] + requirements: + - Envoy Proxy distroless-v1.33.0 + - Rate Limit 60d8e81b + - Gateway API v1.2.1 + incompatibilities: [] +- version: 1.2 + kube: ['1.31', '1.30', '1.29', '1.28'] + requirements: + - Envoy Proxy distroless-v1.32.1 + - Rate Limit 28b1629a + - Gateway API v1.2.0 + incompatibilities: [] +- version: 1.1 + kube: ['1.30', '1.29', '1.28', '1.27'] + requirements: + - Envoy Proxy distroless-v1.31.0 + - Rate Limit 91484c59 + - Gateway API v1.1.0 + incompatibilities: [] +- version: 1.0 + kube: ['1.29', '1.28', '1.27', '1.26'] + requirements: + - Envoy Proxy distroless-v1.29.2 + - Rate Limit 19f2079f + - Gateway API v1.0.0 + incompatibilities: [] +- version: 0.6 + kube: ['1.28', '1.27', '1.26'] + requirements: + - Envoy Proxy distroless-v1.28-latest + - Rate Limit b9796237 + - Gateway API v1.0.0 + incompatibilities: [] +- version: 0.5 + kube: ['1.27', '1.26', '1.25'] + requirements: + - Envoy Proxy v1.27-latest + - Rate Limit e059638d + - Gateway API v0.7.1 + incompatibilities: [] +- version: 0.4 + kube: ['1.27', '1.26', '1.25'] + requirements: + - Envoy Proxy v1.26-latest + - Rate Limit 542a6047 + - Gateway API v0.6.2 + incompatibilities: [] +- version: 0.3 + kube: ['1.26', '1.25', '1.24'] + requirements: + - Envoy Proxy v1.25-latest + - Rate Limit f28024e3 + - Gateway API v0.6.1 + incompatibilities: [] +- version: 0.2 + kube: ['1.24'] + requirements: + - Envoy Proxy v1.23-latest + - Gateway API v0.5.1 + incompatibilities: [] diff --git a/static/compatibilities/manifest.yaml b/static/compatibilities/manifest.yaml index 2be754b662..24543a7337 100644 --- a/static/compatibilities/manifest.yaml +++ b/static/compatibilities/manifest.yaml @@ -1,4 +1,5 @@ names: +- envoy-gateway - argo-rollouts - aws-ebs-csi-driver - aws-efs-csi-driver diff --git a/utils/compatibility/scrapers/envoy-gateway.py b/utils/compatibility/scrapers/envoy-gateway.py new file mode 100644 index 0000000000..d371437824 --- /dev/null +++ b/utils/compatibility/scrapers/envoy-gateway.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +from collections import OrderedDict + +from bs4 import BeautifulSoup + +from utils import fetch_page, print_error, update_compatibility_info + + +APP_NAME = "envoy-gateway" +COMPATIBILITY_URL = "https://gateway.envoyproxy.io/news/releases/matrix/" +TARGET_FILE = f"../../static/compatibilities/{APP_NAME}.yaml" + + +def _decode(content): + return content.decode("utf-8", errors="replace") if isinstance(content, bytes) else content + + +def _clean_version(value: str) -> str: + return value.strip().lstrip("v") + + +def _parse_kube_versions(value: str) -> list[str]: + versions = [] + for raw_version in value.split(","): + version = _clean_version(raw_version) + if version: + versions.append(version) + return versions + + +def _find_compatibility_table(soup: BeautifulSoup): + for table in soup.find_all("table"): + headers = [th.get_text(" ", strip=True) for th in table.find_all("th")] + if "Envoy Gateway version" in headers and "Kubernetes version" in headers: + return table, headers + return None, [] + + +def _requirement(label: str, value: str) -> str | None: + cleaned = value.strip() + if not cleaned: + return None + return f"{label} {cleaned}" + + +def scrape(): + content = fetch_page(COMPATIBILITY_URL) + if not content: + print_error("Failed to fetch Envoy Gateway compatibility matrix.") + return + + soup = BeautifulSoup(_decode(content), "html.parser") + table, headers = _find_compatibility_table(soup) + if not table: + print_error("Envoy Gateway compatibility table not found.") + return + + gateway_idx = headers.index("Envoy Gateway version") + proxy_idx = headers.index("Envoy Proxy version") + rate_limit_idx = headers.index("Rate Limit version") + gateway_api_idx = headers.index("Gateway API version") + kube_idx = headers.index("Kubernetes version") + + versions = [] + for row in table.find_all("tr")[1:]: + cells = [td.get_text(" ", strip=True) for td in row.find_all("td")] + if len(cells) <= max(gateway_idx, proxy_idx, rate_limit_idx, gateway_api_idx, kube_idx): + continue + + version = _clean_version(cells[gateway_idx]) + if not version or version == "latest": + continue + + kube_versions = _parse_kube_versions(cells[kube_idx]) + if not kube_versions: + continue + + requirements = [ + requirement + for requirement in [ + _requirement("Envoy Proxy", cells[proxy_idx]), + _requirement("Rate Limit", cells[rate_limit_idx]), + _requirement("Gateway API", cells[gateway_api_idx]), + ] + if requirement + ] + + versions.append( + OrderedDict( + [ + ("version", version), + ("kube", kube_versions), + ("requirements", requirements), + ("incompatibilities", []), + ] + ) + ) + + if not versions: + print_error("No Envoy Gateway compatibility rows parsed.") + return + + update_compatibility_info(TARGET_FILE, versions) From 4e572387e57cd42ca61d9436a94d516f255fbfbb Mon Sep 17 00:00:00 2001 From: KUANPEIEN Date: Mon, 13 Jul 2026 21:17:37 +0700 Subject: [PATCH 2/3] Address Envoy Gateway review feedback --- static/compatibilities/envoy-gateway.yaml | 28 +++++++++---------- utils/compatibility/scrapers/envoy-gateway.py | 21 ++++++++++++-- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/static/compatibilities/envoy-gateway.yaml b/static/compatibilities/envoy-gateway.yaml index 6a0d7d569c..f6ac7dafdc 100644 --- a/static/compatibilities/envoy-gateway.yaml +++ b/static/compatibilities/envoy-gateway.yaml @@ -5,98 +5,98 @@ readme_url: https://gateway.envoyproxy.io/news/releases/matrix/ helm_repository_url: oci://docker.io/envoyproxy/gateway-helm chart_name: gateway-helm versions: -- version: 1.8 +- version: 1.8.0 kube: ['1.35', '1.34', '1.33', '1.32'] requirements: - Envoy Proxy distroless-v1.38.0 - Rate Limit fe26676d - Gateway API v1.5.1 incompatibilities: [] -- version: 1.7 +- version: 1.7.0 kube: ['1.35', '1.34', '1.33', '1.32'] requirements: - Envoy Proxy distroless-v1.37.0 - Rate Limit 3fb70258 - Gateway API v1.4.1 incompatibilities: [] -- version: 1.6 +- version: 1.6.0 kube: ['1.33', '1.32', '1.31', '1.30'] requirements: - Envoy Proxy distroless-v1.36.4 - Rate Limit 3fb70258 - Gateway API v1.4.0 incompatibilities: [] -- version: 1.5 +- version: 1.5.0 kube: ['1.33', '1.32', '1.31', '1.30'] requirements: - Envoy Proxy distroless-v1.35.0 - Rate Limit a90e0e5d - Gateway API v1.3.0 incompatibilities: [] -- version: 1.4 +- version: 1.4.0 kube: ['1.33', '1.32', '1.31', '1.30'] requirements: - Envoy Proxy distroless-v1.34.1 - Rate Limit 3e085e5b - Gateway API v1.3.0 incompatibilities: [] -- version: 1.3 +- version: 1.3.0 kube: ['1.32', '1.31', '1.30', '1.29'] requirements: - Envoy Proxy distroless-v1.33.0 - Rate Limit 60d8e81b - Gateway API v1.2.1 incompatibilities: [] -- version: 1.2 +- version: 1.2.0 kube: ['1.31', '1.30', '1.29', '1.28'] requirements: - Envoy Proxy distroless-v1.32.1 - Rate Limit 28b1629a - Gateway API v1.2.0 incompatibilities: [] -- version: 1.1 +- version: 1.1.0 kube: ['1.30', '1.29', '1.28', '1.27'] requirements: - Envoy Proxy distroless-v1.31.0 - Rate Limit 91484c59 - Gateway API v1.1.0 incompatibilities: [] -- version: 1.0 +- version: 1.0.0 kube: ['1.29', '1.28', '1.27', '1.26'] requirements: - Envoy Proxy distroless-v1.29.2 - Rate Limit 19f2079f - Gateway API v1.0.0 incompatibilities: [] -- version: 0.6 +- version: 0.6.0 kube: ['1.28', '1.27', '1.26'] requirements: - Envoy Proxy distroless-v1.28-latest - Rate Limit b9796237 - Gateway API v1.0.0 incompatibilities: [] -- version: 0.5 +- version: 0.5.0 kube: ['1.27', '1.26', '1.25'] requirements: - Envoy Proxy v1.27-latest - Rate Limit e059638d - Gateway API v0.7.1 incompatibilities: [] -- version: 0.4 +- version: 0.4.0 kube: ['1.27', '1.26', '1.25'] requirements: - Envoy Proxy v1.26-latest - Rate Limit 542a6047 - Gateway API v0.6.2 incompatibilities: [] -- version: 0.3 +- version: 0.3.0 kube: ['1.26', '1.25', '1.24'] requirements: - Envoy Proxy v1.25-latest - Rate Limit f28024e3 - Gateway API v0.6.1 incompatibilities: [] -- version: 0.2 +- version: 0.2.0 kube: ['1.24'] requirements: - Envoy Proxy v1.23-latest diff --git a/utils/compatibility/scrapers/envoy-gateway.py b/utils/compatibility/scrapers/envoy-gateway.py index d371437824..3061f0eb0c 100644 --- a/utils/compatibility/scrapers/envoy-gateway.py +++ b/utils/compatibility/scrapers/envoy-gateway.py @@ -17,22 +17,39 @@ def _decode(content): def _clean_version(value: str) -> str: + version = value.strip().lstrip("v") + if version == "latest": + return version + if version and version.count(".") == 1: + return f"{version}.0" + return version + + +def _clean_kube_version(value: str) -> str: return value.strip().lstrip("v") def _parse_kube_versions(value: str) -> list[str]: versions = [] for raw_version in value.split(","): - version = _clean_version(raw_version) + version = _clean_kube_version(raw_version) if version: versions.append(version) return versions def _find_compatibility_table(soup: BeautifulSoup): + required_headers = [ + "Envoy Gateway version", + "Envoy Proxy version", + "Rate Limit version", + "Gateway API version", + "Kubernetes version", + ] + for table in soup.find_all("table"): headers = [th.get_text(" ", strip=True) for th in table.find_all("th")] - if "Envoy Gateway version" in headers and "Kubernetes version" in headers: + if all(header in headers for header in required_headers): return table, headers return None, [] From 1a69551cd419b9fed220ca434a996665d817633b Mon Sep 17 00:00:00 2001 From: KUANPEIEN Date: Tue, 14 Jul 2026 05:55:07 +0700 Subject: [PATCH 3/3] Address Envoy Gateway review feedback --- static/compatibilities/envoy-gateway.yaml | 97 ++++++++----------- utils/compatibility/scrapers/envoy-gateway.py | 33 ++----- 2 files changed, 51 insertions(+), 79 deletions(-) diff --git a/static/compatibilities/envoy-gateway.yaml b/static/compatibilities/envoy-gateway.yaml index f6ac7dafdc..7767176a40 100644 --- a/static/compatibilities/envoy-gateway.yaml +++ b/static/compatibilities/envoy-gateway.yaml @@ -7,98 +7,85 @@ chart_name: gateway-helm versions: - version: 1.8.0 kube: ['1.35', '1.34', '1.33', '1.32'] - requirements: - - Envoy Proxy distroless-v1.38.0 - - Rate Limit fe26676d - - Gateway API v1.5.1 + requirements: [] + chart_version: 1.8.0 + images: ['docker.io/envoyproxy/gateway:v1.8.0'] incompatibilities: [] - version: 1.7.0 kube: ['1.35', '1.34', '1.33', '1.32'] - requirements: - - Envoy Proxy distroless-v1.37.0 - - Rate Limit 3fb70258 - - Gateway API v1.4.1 + requirements: [] + chart_version: 1.7.0 + images: ['docker.io/envoyproxy/gateway:v1.7.0'] incompatibilities: [] - version: 1.6.0 kube: ['1.33', '1.32', '1.31', '1.30'] - requirements: - - Envoy Proxy distroless-v1.36.4 - - Rate Limit 3fb70258 - - Gateway API v1.4.0 + requirements: [] + chart_version: 1.6.0 + images: ['docker.io/envoyproxy/gateway:v1.6.0'] incompatibilities: [] - version: 1.5.0 kube: ['1.33', '1.32', '1.31', '1.30'] - requirements: - - Envoy Proxy distroless-v1.35.0 - - Rate Limit a90e0e5d - - Gateway API v1.3.0 + requirements: [] + chart_version: 1.5.0 + images: ['docker.io/envoyproxy/gateway:v1.5.0'] incompatibilities: [] - version: 1.4.0 kube: ['1.33', '1.32', '1.31', '1.30'] - requirements: - - Envoy Proxy distroless-v1.34.1 - - Rate Limit 3e085e5b - - Gateway API v1.3.0 + requirements: [] + chart_version: 1.4.0 + images: ['docker.io/envoyproxy/gateway:v1.4.0'] incompatibilities: [] - version: 1.3.0 kube: ['1.32', '1.31', '1.30', '1.29'] - requirements: - - Envoy Proxy distroless-v1.33.0 - - Rate Limit 60d8e81b - - Gateway API v1.2.1 + requirements: [] + chart_version: 1.3.0 + images: ['docker.io/envoyproxy/gateway:v1.3.0'] incompatibilities: [] - version: 1.2.0 kube: ['1.31', '1.30', '1.29', '1.28'] - requirements: - - Envoy Proxy distroless-v1.32.1 - - Rate Limit 28b1629a - - Gateway API v1.2.0 + requirements: [] + chart_version: 1.2.0 + images: ['docker.io/envoyproxy/gateway:v1.2.0'] incompatibilities: [] - version: 1.1.0 kube: ['1.30', '1.29', '1.28', '1.27'] - requirements: - - Envoy Proxy distroless-v1.31.0 - - Rate Limit 91484c59 - - Gateway API v1.1.0 + requirements: [] + chart_version: 1.1.0 + images: ['docker.io/envoyproxy/gateway:v1.1.0'] incompatibilities: [] - version: 1.0.0 kube: ['1.29', '1.28', '1.27', '1.26'] - requirements: - - Envoy Proxy distroless-v1.29.2 - - Rate Limit 19f2079f - - Gateway API v1.0.0 + requirements: [] + chart_version: 1.0.0 + images: ['docker.io/envoyproxy/gateway:v1.0.0'] incompatibilities: [] - version: 0.6.0 kube: ['1.28', '1.27', '1.26'] - requirements: - - Envoy Proxy distroless-v1.28-latest - - Rate Limit b9796237 - - Gateway API v1.0.0 + requirements: [] + chart_version: 0.6.0 + images: ['docker.io/envoyproxy/gateway:v0.6.0'] incompatibilities: [] - version: 0.5.0 kube: ['1.27', '1.26', '1.25'] - requirements: - - Envoy Proxy v1.27-latest - - Rate Limit e059638d - - Gateway API v0.7.1 + requirements: [] + chart_version: 0.5.0 + images: ['docker.io/envoyproxy/gateway:v0.5.0'] incompatibilities: [] - version: 0.4.0 kube: ['1.27', '1.26', '1.25'] - requirements: - - Envoy Proxy v1.26-latest - - Rate Limit 542a6047 - - Gateway API v0.6.2 + requirements: [] + chart_version: 0.4.0 + images: ['docker.io/envoyproxy/gateway:v0.4.0'] incompatibilities: [] - version: 0.3.0 kube: ['1.26', '1.25', '1.24'] - requirements: - - Envoy Proxy v1.25-latest - - Rate Limit f28024e3 - - Gateway API v0.6.1 + requirements: [] + chart_version: 0.3.0 + images: ['docker.io/envoyproxy/gateway:v0.3.0'] incompatibilities: [] - version: 0.2.0 kube: ['1.24'] - requirements: - - Envoy Proxy v1.23-latest - - Gateway API v0.5.1 + requirements: [] + chart_version: 0.2.0 + images: ['docker.io/envoyproxy/gateway:v0.2.0'] incompatibilities: [] diff --git a/utils/compatibility/scrapers/envoy-gateway.py b/utils/compatibility/scrapers/envoy-gateway.py index 3061f0eb0c..f0ae79f90c 100644 --- a/utils/compatibility/scrapers/envoy-gateway.py +++ b/utils/compatibility/scrapers/envoy-gateway.py @@ -4,12 +4,14 @@ from bs4 import BeautifulSoup -from utils import fetch_page, print_error, update_compatibility_info +from utils import fetch_page, get_chart_images, print_error, update_compatibility_info APP_NAME = "envoy-gateway" COMPATIBILITY_URL = "https://gateway.envoyproxy.io/news/releases/matrix/" TARGET_FILE = f"../../static/compatibilities/{APP_NAME}.yaml" +CHART_URL = "oci://docker.io/envoyproxy/gateway-helm" +CHART_NAME = "gateway-helm" def _decode(content): @@ -41,9 +43,6 @@ def _parse_kube_versions(value: str) -> list[str]: def _find_compatibility_table(soup: BeautifulSoup): required_headers = [ "Envoy Gateway version", - "Envoy Proxy version", - "Rate Limit version", - "Gateway API version", "Kubernetes version", ] @@ -54,11 +53,8 @@ def _find_compatibility_table(soup: BeautifulSoup): return None, [] -def _requirement(label: str, value: str) -> str | None: - cleaned = value.strip() - if not cleaned: - return None - return f"{label} {cleaned}" +def _chart_images(chart_version: str) -> list[str]: + return get_chart_images(CHART_URL, CHART_NAME, chart_version) or [] def scrape(): @@ -74,15 +70,12 @@ def scrape(): return gateway_idx = headers.index("Envoy Gateway version") - proxy_idx = headers.index("Envoy Proxy version") - rate_limit_idx = headers.index("Rate Limit version") - gateway_api_idx = headers.index("Gateway API version") kube_idx = headers.index("Kubernetes version") versions = [] for row in table.find_all("tr")[1:]: cells = [td.get_text(" ", strip=True) for td in row.find_all("td")] - if len(cells) <= max(gateway_idx, proxy_idx, rate_limit_idx, gateway_api_idx, kube_idx): + if len(cells) <= max(gateway_idx, kube_idx): continue version = _clean_version(cells[gateway_idx]) @@ -93,22 +86,14 @@ def scrape(): if not kube_versions: continue - requirements = [ - requirement - for requirement in [ - _requirement("Envoy Proxy", cells[proxy_idx]), - _requirement("Rate Limit", cells[rate_limit_idx]), - _requirement("Gateway API", cells[gateway_api_idx]), - ] - if requirement - ] - versions.append( OrderedDict( [ ("version", version), ("kube", kube_versions), - ("requirements", requirements), + ("requirements", []), + ("chart_version", version), + ("images", _chart_images(version)), ("incompatibilities", []), ] )