Skip to content

Add Crunchy Postgres and OpenEBS LocalPV compatibility scrapers - #4146

Closed
uyivzola wants to merge 2 commits into
pluralsh:masterfrom
uyivzola:uyivzola/compatibility-bounties
Closed

Add Crunchy Postgres and OpenEBS LocalPV compatibility scrapers#4146
uyivzola wants to merge 2 commits into
pluralsh:masterfrom
uyivzola:uyivzola/compatibility-bounties

Conversation

@uyivzola

@uyivzola uyivzola commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Plural currently has no compatibility entries for Crunchy Postgres Operator or
OpenEBS Dynamic LocalPV Provisioner. This adds both scrapers, source-derived
tables, chart and project metadata, manifest entries, and aggregate data.

Crunchy reads the vendor's explicit support matrix, including older supported
series. Wildcard minor series are represented by their .0 lower bound, matching
the existing repository convention; this does not identify the latest patch.
Finite Kubernetes ranges are preserved. Its official OCI Helm repository is
included. The scraper reads its public OCI tags and verifies the Helm config's
name, version and appVersion before attaching each exact boundary chart version.
Seven published charts are verified (5.3.0 through 5.8.0 and 6.0.0). Five older
series have no public chart and retain compatibility-only rows. Registry discovery
or advertised-chart verification failures stop the update before writing.

OpenEBS reads its official release-family support matrix and joins it to stable
application versions in the standalone LocalPV Helm index. It excludes HEAD,
prereleases, deprecated charts, and undocumented release families. The documented
>=1.23 range is expanded only through the repository's KUBE_VERSION (1.36 at
generation). These are upstream-declared compatibilities, not claims that every
Kubernetes version was deployed in this test environment.

Sources:

Test Plan

From utils/compatibility:

python -m pip install -r requirements-test.txt
python -m unittest discover -s tests -v

All 27 offline tests pass. Tests cover source table selection, unsupported and
malformed ranges, stable release selection, distinct chart/application versions,
OCI chart identity checks, safe pagination, and avoiding writes when source parsing
or registry verification fails. Live generation succeeded for both
scrapers. All seven verified Crunchy charts and both OpenEBS charts rendered
successfully using Helm 4.2.4. Per-app and aggregate
JSON schema validation passed; prior aggregate entries were compared and remain
unchanged. git diff --check passed.

Implementation was prepared with AI assistance and reviewed and tested. This
submission targets the published contributor-program tier for two new scrapers
($300 each), subject to maintainer review, merge, and reward confirmation. No
reward is assumed approved by submitting the code.

Checklist

  • Meaningful title and summary.
  • Source documentation and metadata included.
  • Regression tests added.
  • Deployment-agent test environment — not applicable; no agent code changed.

Plural Flow: console

@socket-security

socket-security Bot commented Sep 8, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedpypi/​jsonschema@​4.26.099100100100100

View full report

@soffi-ai

soffi-ai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Soffi AI Summary

This PR extends the compatibility-matrix tooling to cover two new add-ons — Crunchy Postgres Operator and OpenEBS Dynamic LocalPV Provisioner — which previously had no entries in the Console's static compatibility data.

Crunchy Postgres Operator scraper (scrapers/crunchy-postgres-operator.py) reads the vendor's official support-matrix page, parses bounded Kubernetes version ranges (rejecting unbounded or malformed inputs), normalises wildcard series to their .0 lower bound, and emits per-version compatibility rows. The official OCI Helm repository is recorded; individual chart versions are not inferred from wildcard series.

OpenEBS LocalPV Provisioner scraper (scrapers/openebs-localpv-provisioner.py) reads the upstream GitHub compatibility table and joins it to stable application versions from the official Helm index. It excludes HEAD, prereleases, deprecated charts, and undocumented release families, and expands the documented >=1.23 range only up to the repository's KUBE_VERSION ceiling.

Both scrapers follow the existing repository conventions (range direction, deduplication, update-only-on-success guards) and are accompanied by:

  • Generated static YAML files (static/compatibilities/crunchy-postgres-operator.yaml, openebs-localpv-provisioner.yaml) and an updated manifest.yaml / compatibilities.yaml aggregate.
  • Offline regression test suites (21 tests total) covering source-table selection, range parsing edge cases, stable-release filtering, schema validation against the existing JSON schema, and no-write-on-failure behaviour.
  • HTML/Markdown/YAML test fixtures and a requirements-test.txt for test dependencies.

Changes

Crunchy Postgres and OpenEBS LocalPV compatibility scrapers

  • Adds scrapers, static compatibility YAML files, manifest entries, and offline regression tests for Crunchy Postgres Operator and OpenEBS Dynamic LocalPV Provisioner. The Crunchy scraper parses the vendor's explicit Kubernetes support matrix, rejecting unbounded or malformed ranges. The OpenEBS scraper joins the upstream compatibility table to stable Helm chart releases, excluding prereleases and undocumented families. Both scrapers guard against writing output when source parsing fails. 21 new tests cover parsing, schema validation, and error-safe behaviour. (96a2425)

Updated: 2026-09-08 09:45 UTC

Deploy in Soffi

@greptile-apps

greptile-apps Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds compatibility metadata, generated data, source scrapers, fixtures, and offline tests for Crunchy Postgres Operator and OpenEBS LocalPV.

  • Crunchy parses bounded Kubernetes support ranges from the vendor HTML matrix.
  • OpenEBS joins documented release families with stable Helm-index application and chart versions.
  • The Crunchy entries currently cannot participate in add-on release polling because they contain no chart versions.

Confidence Score: 4/5

The PR is not safe to merge until Crunchy entries provide usable chart versions, because release polling for the newly registered add-on currently always fails.

OpenEBS generation is consistent with the repository pipeline, but all Crunchy rows are filtered out by the existing add-on poller due to their missing chart versions; the Crunchy parser also has a non-blocking first-match robustness gap.

Files Needing Attention: utils/compatibility/scrapers/crunchy-postgres-operator.py, static/compatibilities/crunchy-postgres-operator.yaml

Important Files Changed

Filename Overview
utils/compatibility/scrapers/crunchy-postgres-operator.py Adds bounded HTML-matrix parsing, but publishes no chart versions and stops at the first matching table even when empty.
utils/compatibility/scrapers/openebs-localpv-provisioner.py Safely joins documented compatibility families to stable, nondeprecated Helm-index releases.
static/compatibilities/crunchy-postgres-operator.yaml Adds the Crunchy compatibility matrix, with every row missing the chart version required by add-on polling.
static/compatibilities/openebs-localpv-provisioner.yaml Adds reduced OpenEBS compatibility output with concrete application and chart versions.
utils/compatibility/tests/test_crunchy_postgres_operator.py Provides broad parser and failure-preservation coverage but misses multiple matching tables with an empty first match.
utils/compatibility/tests/test_openebs_localpv_provisioner.py Covers source selection, range parsing, stable release filtering, version distinction, and failed-update behavior.

Reviews (1): Last reviewed commit: "Add Crunchy Postgres and OpenEBS compati..." | Re-trigger Greptile

# The source describes entire minor series, not particular patches.
# Represent their lower bound as .0, following repository convention.
# Do not infer an OCI chart version from a wildcard release series.
version = f"{int(match[1])}.{int(match[2])}.0"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing Crunchy chart versions

Every generated Crunchy compatibility row omits chart_version. Add-on polling discards rows without that field before selecting a release, so any release observer configured for crunchy-postgres-operator receives an empty version list and returns could not process cncf addon crunchy-postgres-operator. Resolve the wildcard families to actual OCI chart versions before publishing this add-on.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 49c462d. The scraper now discovers the public OCI tags, then verifies the Helm manifest and config name/version/appVersion before attaching chart_version. Seven series have verified charts (5.3.0–5.8.0 and 6.0.0); the five older series absent from the public registry remain compatibility-only. All seven charts were rendered with Helm, and the updated offline suite passes 27 tests.

Comment on lines +103 to +107
return sorted(
versions.values(),
key=lambda entry: tuple(map(int, entry["version"].split("."))),
reverse=True,
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Empty table stops parsing

parse_page returns after the first table with matching headers, even when that table has no rows. If the upstream page places an empty matching matrix before the populated one, the scraper ignores the valid data and leaves the checked-in compatibility file stale. Continue searching when a matching table produces no versions, and cover this case with a test.

Suggested change
return sorted(
versions.values(),
key=lambda entry: tuple(map(int, entry["version"].split("."))),
reverse=True,
)
if versions:
return sorted(
versions.values(),
key=lambda entry: tuple(map(int, entry["version"].split("."))),
reverse=True,
)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 49c462d. parse_page now continues past an empty table with matching headers, and a regression test places that empty table before the populated matrix. The updated offline suite passes all 27 tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants