From 4b2589db1f957fb05a9da25c70fb8b17e966e42f Mon Sep 17 00:00:00 2001 From: hunterx-code <288423727+hunterx-code@users.noreply.github.com> Date: Fri, 12 Jun 2026 10:05:47 -0700 Subject: [PATCH 1/5] Add NGINX Gateway Fabric compatibility --- static/compatibilities.yaml | 101 ++++++++++++++++ static/compatibilities/manifest.yaml | 1 + .../compatibilities/nginx-gateway-fabric.yaml | 100 ++++++++++++++++ .../scrapers/nginx-gateway-fabric.py | 109 ++++++++++++++++++ 4 files changed, 311 insertions(+) create mode 100644 static/compatibilities/nginx-gateway-fabric.yaml create mode 100644 utils/compatibility/scrapers/nginx-gateway-fabric.py diff --git a/static/compatibilities.yaml b/static/compatibilities.yaml index 3791bfd46e..f103111b48 100644 --- a/static/compatibilities.yaml +++ b/static/compatibilities.yaml @@ -20856,6 +20856,107 @@ addons: chart_version: 3.5.0 images: ['k8s.gcr.io/metrics-server/metrics-server:v0.5.0'] name: metrics-server +- icon: https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/main/charts/nginx-gateway-fabric/chart-icon.png + git_url: https://github.com/nginx/nginx-gateway-fabric + release_url: https://github.com/nginx/nginx-gateway-fabric/releases/tag/v{vsn} + helm_repository_url: oci://ghcr.io/nginx/charts/nginx-gateway-fabric + chart_name: nginx-gateway-fabric + versions: + - version: 2.6.3 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.6.3 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.3', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.3'] + - version: 2.5.1 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.5.1 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.5.1', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.5.1'] + - version: 2.4.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.4.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.4.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.4.2'] + - version: 2.3.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.3.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.3.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.3.0'] + - version: 2.2.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.2.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.2.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.2.2'] + - version: 2.1.4 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.1.4 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.1.4', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.1.4'] + - version: 2.0.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.0.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.0.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.0.2'] + - version: 1.6.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.6.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.6.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.6.2'] + - version: 1.5.1 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.5.1 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.5.1', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.5.1'] + - version: 1.4.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.4.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.4.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.4.0'] + - version: 1.3.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.3.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.3.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.3.0'] + - version: 1.2.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', + '1.26', '1.25', '1.24', '1.23'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.2.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.2.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.2.0'] + name: nginx-gateway-fabric - icon: https://avatars.githubusercontent.com/u/49998002?s=48&v=4 git_url: https://github.com/open-telemetry/opentelemetry-operator release_url: https://github.com/open-telemetry/opentelemetry-operator/releases/tag/v{vsn} diff --git a/static/compatibilities/manifest.yaml b/static/compatibilities/manifest.yaml index 2be754b662..686ded9c78 100644 --- a/static/compatibilities/manifest.yaml +++ b/static/compatibilities/manifest.yaml @@ -26,6 +26,7 @@ names: - linkerd - longhorn - metrics-server +- nginx-gateway-fabric - opentelemetry-operator - rook - strimzi-kafka diff --git a/static/compatibilities/nginx-gateway-fabric.yaml b/static/compatibilities/nginx-gateway-fabric.yaml new file mode 100644 index 0000000000..d2e5f4323d --- /dev/null +++ b/static/compatibilities/nginx-gateway-fabric.yaml @@ -0,0 +1,100 @@ +icon: https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/main/charts/nginx-gateway-fabric/chart-icon.png +git_url: https://github.com/nginx/nginx-gateway-fabric +release_url: https://github.com/nginx/nginx-gateway-fabric/releases/tag/v{vsn} +helm_repository_url: oci://ghcr.io/nginx/charts/nginx-gateway-fabric +chart_name: nginx-gateway-fabric +versions: +- version: 2.6.3 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.6.3 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.3', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.3'] +- version: 2.5.1 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.5.1 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.5.1', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.5.1'] +- version: 2.4.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.4.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.4.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.4.2'] +- version: 2.3.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.3.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.3.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.3.0'] +- version: 2.2.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.2.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.2.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.2.2'] +- version: 2.1.4 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.1.4 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.1.4', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.1.4'] +- version: 2.0.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.0.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.0.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.0.2'] +- version: 1.6.2 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.6.2 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.6.2', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.6.2'] +- version: 1.5.1 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.5.1 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.5.1', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.5.1'] +- version: 1.4.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.4.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.4.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.4.0'] +- version: 1.3.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.3.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.3.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.3.0'] +- version: 1.2.0 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', + '1.25', '1.24', '1.23'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 1.2.0 + images: ['ghcr.io/nginx/nginx-gateway-fabric:1.2.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.2.0'] diff --git a/utils/compatibility/scrapers/nginx-gateway-fabric.py b/utils/compatibility/scrapers/nginx-gateway-fabric.py new file mode 100644 index 0000000000..6328e7fd73 --- /dev/null +++ b/utils/compatibility/scrapers/nginx-gateway-fabric.py @@ -0,0 +1,109 @@ +from collections import OrderedDict +import re + +from utils import ( + current_kube_version, + ensure_keys, + expand_kube_versions, + print_error, + print_success, + read_yaml, + reduce_versions, + update_versions_data, + fetch_page, + validate_semver, + write_yaml, +) + + +APP_NAME = "nginx-gateway-fabric" +COMPATIBILITY_URL = "https://raw.githubusercontent.com/nginx/documentation/main/content/ngf/overview/technical-specifications.md" +TARGET_FILE = f"../../static/compatibilities/{APP_NAME}.yaml" + + +def _decode(content): + return content.decode("utf-8") if isinstance(content, bytes) else content + + +def _clean_cell(cell): + return re.sub(r"\s+", " ", cell.strip().strip("`").replace("*", "")) + + +def _parse_kube_versions(value): + cleaned = _clean_cell(value).lstrip("v") + if cleaned.endswith("+"): + return expand_kube_versions(cleaned[:-1], current_kube_version()) + if "-" in cleaned: + start, end = [part.strip().lstrip("v") for part in cleaned.split("-", 1)] + return expand_kube_versions(start, end) + return [cleaned] + + +def _write_compatibility_info(filepath, new_versions): + data = read_yaml(filepath) or {} + update_versions_data(data, [ensure_keys(version) for version in new_versions]) + data["versions"] = reduce_versions(data["versions"]) + if write_yaml(filepath, data): + print_success(f"Updated compatibility info table: {filepath}") + else: + print_error(f"Failed to update compatibility info for {filepath}") + + +def extract_table_data(content): + rows = [] + in_table = False + + for line in _decode(content).splitlines(): + stripped = line.strip() + if stripped.startswith("| NGINX Gateway Fabric | Gateway API | Kubernetes |"): + in_table = True + continue + if in_table and not stripped.startswith("|"): + break + if not in_table or set(stripped.replace("|", "").strip()) <= {"-"}: + continue + + columns = [_clean_cell(column) for column in stripped.strip("|").split("|")] + if len(columns) < 3: + continue + app_version = columns[0].lstrip("v") + if app_version.lower() == "edge": + continue + version = validate_semver(app_version) + if not version: + continue + + ver = str(version) + rows.append( + OrderedDict( + [ + ("version", ver), + ("kube", _parse_kube_versions(columns[2])), + ("chart_version", ver), + ( + "images", + [ + f"ghcr.io/nginx/nginx-gateway-fabric:{ver}", + f"ghcr.io/nginx/nginx-gateway-fabric/nginx:{ver}", + ], + ), + ("requirements", []), + ("incompatibilities", []), + ] + ) + ) + + return rows + + +def scrape(): + page_content = fetch_page(COMPATIBILITY_URL) + if not page_content: + return + + rows = extract_table_data(page_content) + if not rows: + print_error("No NGINX Gateway Fabric compatibility rows found.") + return + + _write_compatibility_info(TARGET_FILE, rows) From 0fcf473c6767b2ed1cea482f5b6586e1e44465b2 Mon Sep 17 00:00:00 2001 From: hunterx-code <288423727+hunterx-code@users.noreply.github.com> Date: Fri, 12 Jun 2026 10:36:31 -0700 Subject: [PATCH 2/5] Improve NGINX Gateway Fabric scraper --- static/compatibilities.yaml | 6 +- .../compatibilities/nginx-gateway-fabric.yaml | 6 +- .../scrapers/nginx-gateway-fabric.py | 66 +++++++++++++++---- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/static/compatibilities.yaml b/static/compatibilities.yaml index f103111b48..dae272dec4 100644 --- a/static/compatibilities.yaml +++ b/static/compatibilities.yaml @@ -20931,7 +20931,7 @@ addons: incompatibilities: [] summary: null chart_version: 1.5.1 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.5.1', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.5.1'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.5.1', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.5.1'] - version: 1.4.0 kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', '1.25'] @@ -20939,7 +20939,7 @@ addons: incompatibilities: [] summary: null chart_version: 1.4.0 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.4.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.4.0'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.4.0', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.4.0'] - version: 1.3.0 kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', '1.25'] @@ -20947,7 +20947,7 @@ addons: incompatibilities: [] summary: null chart_version: 1.3.0 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.3.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.3.0'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.3.0', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.3.0'] - version: 1.2.0 kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', '1.25', '1.24', '1.23'] diff --git a/static/compatibilities/nginx-gateway-fabric.yaml b/static/compatibilities/nginx-gateway-fabric.yaml index d2e5f4323d..883c016854 100644 --- a/static/compatibilities/nginx-gateway-fabric.yaml +++ b/static/compatibilities/nginx-gateway-fabric.yaml @@ -73,7 +73,7 @@ versions: incompatibilities: [] summary: null chart_version: 1.5.1 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.5.1', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.5.1'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.5.1', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.5.1'] - version: 1.4.0 kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', '1.25'] @@ -81,7 +81,7 @@ versions: incompatibilities: [] summary: null chart_version: 1.4.0 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.4.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.4.0'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.4.0', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.4.0'] - version: 1.3.0 kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', '1.25'] @@ -89,7 +89,7 @@ versions: incompatibilities: [] summary: null chart_version: 1.3.0 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.3.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.3.0'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.3.0', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.3.0'] - version: 1.2.0 kube: ['1.35', '1.34', '1.33', '1.32', '1.31', '1.30', '1.29', '1.28', '1.27', '1.26', '1.25', '1.24', '1.23'] diff --git a/utils/compatibility/scrapers/nginx-gateway-fabric.py b/utils/compatibility/scrapers/nginx-gateway-fabric.py index 6328e7fd73..cebeac318d 100644 --- a/utils/compatibility/scrapers/nginx-gateway-fabric.py +++ b/utils/compatibility/scrapers/nginx-gateway-fabric.py @@ -1,6 +1,9 @@ from collections import OrderedDict import re +import requests +import yaml + from utils import ( current_kube_version, ensure_keys, @@ -18,6 +21,7 @@ APP_NAME = "nginx-gateway-fabric" COMPATIBILITY_URL = "https://raw.githubusercontent.com/nginx/documentation/main/content/ngf/overview/technical-specifications.md" +CHART_VALUES_URL = "https://raw.githubusercontent.com/nginx/nginx-gateway-fabric/v{version}/charts/nginx-gateway-fabric/values.yaml" TARGET_FILE = f"../../static/compatibilities/{APP_NAME}.yaml" @@ -31,12 +35,54 @@ def _clean_cell(cell): def _parse_kube_versions(value): cleaned = _clean_cell(value).lstrip("v") - if cleaned.endswith("+"): - return expand_kube_versions(cleaned[:-1], current_kube_version()) - if "-" in cleaned: - start, end = [part.strip().lstrip("v") for part in cleaned.split("-", 1)] - return expand_kube_versions(start, end) - return [cleaned] + plus_match = re.fullmatch(r"(\d+\.\d+)\+", cleaned) + if plus_match: + return expand_kube_versions(plus_match.group(1), current_kube_version()) + + range_match = re.fullmatch(r"(\d+\.\d+)\s*(?:-|–|—)\s*(\d+\.\d+)", cleaned) + if range_match: + return expand_kube_versions(range_match.group(1), range_match.group(2)) + + version_match = re.fullmatch(r"\d+\.\d+", cleaned) + return [cleaned] if version_match else [] + + +def _image_from_config(config, fallback_repository, fallback_tag): + image = config.get("image", {}) if isinstance(config, dict) else {} + repository = image.get("repository") or fallback_repository + tag = image.get("tag") or fallback_tag + return f"{repository}:{tag}" + + +def _default_images(version): + fallbacks = [ + f"ghcr.io/nginx/nginx-gateway-fabric:{version}", + f"ghcr.io/nginx/nginx-gateway-fabric/nginx:{version}", + ] + try: + response = requests.get(CHART_VALUES_URL.format(version=version), timeout=10) + except requests.RequestException: + return fallbacks + if response.status_code != 200: + return fallbacks + + try: + values = yaml.safe_load(response.text) or {} + except yaml.YAMLError as exc: + print_error(f"Failed to parse NGINX Gateway Fabric chart values: {exc}") + return fallbacks + + control_plane = _image_from_config( + values.get("nginxGateway", {}), + "ghcr.io/nginx/nginx-gateway-fabric", + version, + ) + data_plane = _image_from_config( + values.get("nginx", {}), + "ghcr.io/nginx/nginx-gateway-fabric/nginx", + version, + ) + return [control_plane, data_plane] def _write_compatibility_info(filepath, new_versions): @@ -80,13 +126,7 @@ def extract_table_data(content): ("version", ver), ("kube", _parse_kube_versions(columns[2])), ("chart_version", ver), - ( - "images", - [ - f"ghcr.io/nginx/nginx-gateway-fabric:{ver}", - f"ghcr.io/nginx/nginx-gateway-fabric/nginx:{ver}", - ], - ), + ("images", _default_images(ver)), ("requirements", []), ("incompatibilities", []), ] From 27543f387c04eb88881577947414fd239cfe61c8 Mon Sep 17 00:00:00 2001 From: hunterx-code <288423727+hunterx-code@users.noreply.github.com> Date: Fri, 12 Jun 2026 11:11:05 -0700 Subject: [PATCH 3/5] Fix NGINX Gateway Fabric legacy registry --- static/compatibilities.yaml | 2 +- static/compatibilities/nginx-gateway-fabric.yaml | 2 +- .../scrapers/nginx-gateway-fabric.py | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/static/compatibilities.yaml b/static/compatibilities.yaml index dae272dec4..2d67ecf3fc 100644 --- a/static/compatibilities.yaml +++ b/static/compatibilities.yaml @@ -20955,7 +20955,7 @@ addons: incompatibilities: [] summary: null chart_version: 1.2.0 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.2.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.2.0'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.2.0', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.2.0'] name: nginx-gateway-fabric - icon: https://avatars.githubusercontent.com/u/49998002?s=48&v=4 git_url: https://github.com/open-telemetry/opentelemetry-operator diff --git a/static/compatibilities/nginx-gateway-fabric.yaml b/static/compatibilities/nginx-gateway-fabric.yaml index 883c016854..5033d2305a 100644 --- a/static/compatibilities/nginx-gateway-fabric.yaml +++ b/static/compatibilities/nginx-gateway-fabric.yaml @@ -97,4 +97,4 @@ versions: incompatibilities: [] summary: null chart_version: 1.2.0 - images: ['ghcr.io/nginx/nginx-gateway-fabric:1.2.0', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:1.2.0'] + images: ['ghcr.io/nginxinc/nginx-gateway-fabric:1.2.0', 'ghcr.io/nginxinc/nginx-gateway-fabric/nginx:1.2.0'] diff --git a/utils/compatibility/scrapers/nginx-gateway-fabric.py b/utils/compatibility/scrapers/nginx-gateway-fabric.py index cebeac318d..4744c707e5 100644 --- a/utils/compatibility/scrapers/nginx-gateway-fabric.py +++ b/utils/compatibility/scrapers/nginx-gateway-fabric.py @@ -54,10 +54,18 @@ def _image_from_config(config, fallback_repository, fallback_tag): return f"{repository}:{tag}" +def _fallback_image_repositories(version): + parsed = validate_semver(version) + org = "nginxinc" if parsed and parsed.major == 1 and parsed.minor < 6 else "nginx" + repository = f"ghcr.io/{org}/nginx-gateway-fabric" + return repository, f"{repository}/nginx" + + def _default_images(version): + control_plane_repository, data_plane_repository = _fallback_image_repositories(version) fallbacks = [ - f"ghcr.io/nginx/nginx-gateway-fabric:{version}", - f"ghcr.io/nginx/nginx-gateway-fabric/nginx:{version}", + f"{control_plane_repository}:{version}", + f"{data_plane_repository}:{version}", ] try: response = requests.get(CHART_VALUES_URL.format(version=version), timeout=10) @@ -74,12 +82,12 @@ def _default_images(version): control_plane = _image_from_config( values.get("nginxGateway", {}), - "ghcr.io/nginx/nginx-gateway-fabric", + control_plane_repository, version, ) data_plane = _image_from_config( values.get("nginx", {}), - "ghcr.io/nginx/nginx-gateway-fabric/nginx", + data_plane_repository, version, ) return [control_plane, data_plane] From 25d9df3400df9e5e24cfeba66541ac45b2ab6263 Mon Sep 17 00:00:00 2001 From: hunterx-code <288423727+hunterx-code@users.noreply.github.com> Date: Wed, 17 Jun 2026 22:56:31 -0700 Subject: [PATCH 4/5] Refresh NGINX Gateway Fabric compatibility --- static/compatibilities.yaml | 7 +++++++ static/compatibilities/nginx-gateway-fabric.yaml | 7 +++++++ utils/compatibility/scrapers/nginx-gateway-fabric.py | 9 ++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/static/compatibilities.yaml b/static/compatibilities.yaml index 2d67ecf3fc..66a6b01543 100644 --- a/static/compatibilities.yaml +++ b/static/compatibilities.yaml @@ -20862,6 +20862,13 @@ addons: helm_repository_url: oci://ghcr.io/nginx/charts/nginx-gateway-fabric chart_name: nginx-gateway-fabric versions: + - version: 2.6.5 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.6.5 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.5', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.5'] - version: 2.6.3 kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] requirements: [] diff --git a/static/compatibilities/nginx-gateway-fabric.yaml b/static/compatibilities/nginx-gateway-fabric.yaml index 5033d2305a..9d843ecfe5 100644 --- a/static/compatibilities/nginx-gateway-fabric.yaml +++ b/static/compatibilities/nginx-gateway-fabric.yaml @@ -4,6 +4,13 @@ release_url: https://github.com/nginx/nginx-gateway-fabric/releases/tag/v{vsn} helm_repository_url: oci://ghcr.io/nginx/charts/nginx-gateway-fabric chart_name: nginx-gateway-fabric versions: +- version: 2.6.5 + kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] + requirements: [] + incompatibilities: [] + summary: null + chart_version: 2.6.5 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.5', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.5'] - version: 2.6.3 kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] requirements: [] diff --git a/utils/compatibility/scrapers/nginx-gateway-fabric.py b/utils/compatibility/scrapers/nginx-gateway-fabric.py index 4744c707e5..f3b35f16f6 100644 --- a/utils/compatibility/scrapers/nginx-gateway-fabric.py +++ b/utils/compatibility/scrapers/nginx-gateway-fabric.py @@ -128,11 +128,18 @@ def extract_table_data(content): continue ver = str(version) + kube_versions = _parse_kube_versions(columns[2]) + if not kube_versions: + print_error( + f"Could not parse Kubernetes versions for NGINX Gateway Fabric {ver}: {columns[2]}" + ) + continue + rows.append( OrderedDict( [ ("version", ver), - ("kube", _parse_kube_versions(columns[2])), + ("kube", kube_versions), ("chart_version", ver), ("images", _default_images(ver)), ("requirements", []), From a85b66e869c03c89daac956c5d7eff2bda8e1fce Mon Sep 17 00:00:00 2001 From: hunterx-code <288423727+hunterx-code@users.noreply.github.com> Date: Tue, 28 Jul 2026 23:40:22 -0700 Subject: [PATCH 5/5] Refresh NGINX Gateway Fabric compatibility --- static/compatibilities.yaml | 6 +-- .../compatibilities/nginx-gateway-fabric.yaml | 6 +-- .../tests/test_nginx_gateway_fabric.py | 43 +++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 utils/compatibility/tests/test_nginx_gateway_fabric.py diff --git a/static/compatibilities.yaml b/static/compatibilities.yaml index 66a6b01543..f9b00168ba 100644 --- a/static/compatibilities.yaml +++ b/static/compatibilities.yaml @@ -20862,13 +20862,13 @@ addons: helm_repository_url: oci://ghcr.io/nginx/charts/nginx-gateway-fabric chart_name: nginx-gateway-fabric versions: - - version: 2.6.5 + - version: 2.6.7 kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] requirements: [] incompatibilities: [] summary: null - chart_version: 2.6.5 - images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.5', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.5'] + chart_version: 2.6.7 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.7', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.7'] - version: 2.6.3 kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] requirements: [] diff --git a/static/compatibilities/nginx-gateway-fabric.yaml b/static/compatibilities/nginx-gateway-fabric.yaml index 9d843ecfe5..3d23026d50 100644 --- a/static/compatibilities/nginx-gateway-fabric.yaml +++ b/static/compatibilities/nginx-gateway-fabric.yaml @@ -4,13 +4,13 @@ release_url: https://github.com/nginx/nginx-gateway-fabric/releases/tag/v{vsn} helm_repository_url: oci://ghcr.io/nginx/charts/nginx-gateway-fabric chart_name: nginx-gateway-fabric versions: -- version: 2.6.5 +- version: 2.6.7 kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] requirements: [] incompatibilities: [] summary: null - chart_version: 2.6.5 - images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.5', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.5'] + chart_version: 2.6.7 + images: ['ghcr.io/nginx/nginx-gateway-fabric:2.6.7', 'ghcr.io/nginx/nginx-gateway-fabric/nginx:2.6.7'] - version: 2.6.3 kube: ['1.35', '1.34', '1.33', '1.32', '1.31'] requirements: [] diff --git a/utils/compatibility/tests/test_nginx_gateway_fabric.py b/utils/compatibility/tests/test_nginx_gateway_fabric.py new file mode 100644 index 0000000000..14e1f2444a --- /dev/null +++ b/utils/compatibility/tests/test_nginx_gateway_fabric.py @@ -0,0 +1,43 @@ +import importlib +import sys +import unittest +from pathlib import Path +from unittest.mock import patch + +COMPATIBILITY_DIR = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(COMPATIBILITY_DIR)) +sys.modules.pop("utils", None) + +scraper = importlib.import_module("scrapers.nginx-gateway-fabric") + + +class NginxGatewayFabricScraperTest(unittest.TestCase): + def test_parse_kube_versions_accepts_ranges_and_rejects_notes(self): + self.assertEqual( + scraper._parse_kube_versions("1.31 - 1.35"), + ["1.31", "1.32", "1.33", "1.34", "1.35"], + ) + self.assertEqual(scraper._parse_kube_versions("see release notes"), []) + + @patch.object( + scraper, + "_default_images", + return_value=["ghcr.io/nginx/nginx-gateway-fabric:2.6.7"], + ) + def test_extract_table_data_skips_edge_release(self, _default_images): + markdown = """\ +| NGINX Gateway Fabric | Gateway API | Kubernetes | +|---|---|---| +| edge | 1.4 | 1.35 | +| 2.6.7 | 1.4 | 1.31 - 1.35 | +""" + + rows = scraper.extract_table_data(markdown) + + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0]["version"], "2.6.7") + self.assertEqual(rows[0]["kube"], ["1.31", "1.32", "1.33", "1.34", "1.35"]) + + +if __name__ == "__main__": + unittest.main()