Skip to content

fix(chart): refuse an uppercase repository path in logging.collector.image - #2363

Merged
freeqaz merged 3 commits into
mainfrom
fix-1272
Oct 13, 2026
Merged

freeqaz merged 3 commits into
mainfrom
fix-1272

Conversation

@freeqaz

@freeqaz freeqaz commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator

Problem

#2358 and #2362 made profile preflight and the chart refuse an uppercase letter in an image repository path, which Kubernetes refuses to pull (InvalidImageName). logging.collector.image was left out: the chart checks it with its own looser rule (^[^[:space:]@]+@sha256:[a-f0-9]{64}$), which accepts docker.io/Otel/collector@sha256:..., so the Collector DaemonSet renders and then never pulls.

Change

  • Chart: an enabled Collector whose logging.collector.image has an uppercase repository path fails with logging.collector.image repository path must be lowercase; Kubernetes refuses to pull an uppercase one, using the images.* rule (uppercase only in the registry host, the first component when a / follows it, and in the tag).
  • The Collector keeps its looser shape rule. The stricter images.* shape comes from prepare-bootstrap-volume, which never sees the Collector image, and the looser rule lets the Collector use an IPv6 registry host ([fd00::1]:5000/otel/collector@sha256:...), as runtime.image can. Other spellings the looser rule still accepts (a tag with no repository, + or ? in the path) are unchanged.
  • Preflight: profiles take no Collector image. controlPlane.loggingCollector accepts only enabled and exporter, so preflight refuses a loggingCollector.image field and writes none, and the chart renders its default (lowercase) image. The new tests pin both.
  • upgrade-production-images is unchanged: its Collector drift guard compares only the config Secret, never the image.
  • Docs: fix(profiles): refuse an @ before url hosts and uppercase image repository paths #2358's breaking-changes entry lists logging.collector.image among the chart fields; the observability guide asks for a lowercase repository path.

Verification

  • New refusals fail on main (chart change reverted) and pass with the fix, Helm 3.19.2:
    • profile-preflight-chart-parity.test.mjs: the chart refuses registry.example.invalid/Otel/collector, ...:5000/otel/Collector:release_1, Registry.Example.invalid/otel/Collector, [fd00::1]:5000/otel/Collector and Collector, and accepts an uppercase registry host and tag and an IPv6 registry host (also with uppercase hex). A profile with loggingCollector.image fails preflight; an enabled Collector profile writes no image and renders the chart default.
    • logging-packaging.test.mjs: an uppercase Collector repository path fails with the new message.
    • profile-renderer.test.mjs: a controlPlane.loggingCollector.image row in the Collector refusal table (passes on main too: it pins existing behaviour).
  • Full files once: chart parity 28/28, profile-renderer 65/65, logging-packaging 4/4.
  • Touched tests 20/20 pinned to 2 CPUs (taskset -c 0,1): the chart parity Collector and uppercase tests, the renderer Collector refusal table and the logging-packaging refusal test, each 20/20 (and 20/20 again after the review nits).
  • Prettier clean on touched files.
  • Open PRs touching these files (Support custom Installation profiles and readable Preset starters #2253, feat(deploy): configure hosted Codex discovery egress with profiles #1782, fix(controller): close refused native-admin sockets before audit settlement #1707): each has the same conflicted-file set against this head as against main.

Risks

  • Breaking for values that set an uppercase Collector repository path; Kubernetes could never pull those images, so the Collector never ran. Uppercase registry hosts and tags still pass, and the chart default is unchanged.

…image

The chart applies the images.* repository path rule to the Collector image: uppercase is
allowed only in the registry host and the tag. Its looser shape rule stays, so an IPv6
registry host still works. Profiles take no Collector image and leave the chart default.
@freeqaz
freeqaz requested a review from a team as a code owner October 13, 2026 21:04
@clawsweeper

clawsweeper Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@freeqaz
freeqaz temporarily deployed to integration-qa-pr October 13, 2026 21:06 — with GitHub Actions Inactive
@freeqaz
freeqaz temporarily deployed to integration-qa-pr October 13, 2026 21:06 — with GitHub Actions Inactive
@clawsweeper

clawsweeper Bot commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

What this changes

The Helm chart rejects uppercase repository paths in enabled Collector images and documents the restriction.

Example: Enable the Collector with docker.io/Otel/collector@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.

  • Before: Helm renders a DaemonSet whose image Kubernetes cannot pull.
  • After: Helm refuses rendering with a message requiring a lowercase repository path.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) A focused, source-supported repair with relevant real-Helm integration coverage; supplied behavioral evidence remains reported test execution.
Proof confidence 🦐 gold shrimp (3/6) The supplied maintainer-authored classification exempts ordinary proof gating; reported Helm integration runs exercise the changed owner, while the three inspected screenshots show unrelated Agent creation UI and provide no chart proof.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Bug fix · Worth it: Yes · Fix scope: Complete
User problem: A custom Collector image with an uppercase repository path renders successfully but leaves the Collector unable to start.
Reason: The narrow guard prevents a known unusable deployment configuration and follows the supplied maintainer-approved direction.

Merge readiness

✅ Ready for maintainer review

Keep this PR open: it closes a verified Collector image-validation gap on main, and no introduced correctness or security defect was found.

Priority: P2
Reviewed head: 68abf27b04d8c8f528888dfcaa3e22c436e18c95

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: No standalone terminal demonstration of the changed Helm refusal is supplied; the body reports regression runs through real Helm.
Agent review details

How this fits together

The production Helm chart consumes operator values and emits Collector workload, identity, and network-policy manifests; image validation runs before those manifests are rendered.

flowchart TD
  A[Operator values] --> B[Collector chart validation]
  B --> C[Invalid image refusal]
  B --> D[Collector DaemonSet]
  D --> E[Kubernetes image pull]
Loading

Technical review

Best possible solution:

Reject unusable Collector repository paths at the existing Helm validation boundary while preserving valid image spellings.

Do we have a high-confidence way to reproduce the issue?

Main's Collector guard accepts docker.io/Otel/collector with a lowercase SHA-256 digest; the PR reports failing-before and passing-after Helm cases, but this review executed no target code.

Is this the best way to solve the issue?

The patch fixes the omitted consumer at its existing validation boundary, preserves the intentionally broader Collector image syntax, and adds relevant positive and negative integration coverage.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against e4aae3e111c7.

Provenance checked

Testing

Proof path: in-process harness.

Security

None.

Evidence

What I checked:

Likely related people:

  • freeqaz: Raw commit 28a9114 adds deploy/helm/openclaw-enterprise/templates/collector.yaml:3 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 28a9114b9981; files: deploy/helm/openclaw-enterprise/templates/collector.yaml)
  • Kevin: Raw commit b020ea5 adds deploy/helm/openclaw-enterprise/templates/collector.yaml:1 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: b020ea50de03; files: deploy/helm/openclaw-enterprise/templates/collector.yaml)

Review metrics

Metric Value Why it matters
Change distribution Chart +4; integration tests +91; documentation +4/-2 Most growth exercises rejection and preservation cases through existing Helm and profile workflows.

Labels

Label changes:

  • add P2: The bug affects opt-in Collector deployments with custom uppercase repository paths; default deployments are unaffected.
  • add merge-risk: 🚨 compatibility: Existing values with uppercase Collector paths now stop Helm rendering, an explicitly accepted restriction for images Kubernetes cannot pull.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Label justifications:

  • P2: The bug affects opt-in Collector deployments with custom uppercase repository paths; default deployments are unaffected.
  • merge-risk: 🚨 compatibility: Existing values with uppercase Collector paths now stop Helm rendering, an explicitly accepted restriction for images Kubernetes cannot pull.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

Reviewed October 13, 2026, 5:07 PM ET / 21:07 UTC.

@freeqaz
freeqaz merged commit 07e240c into main Oct 13, 2026
42 checks passed
@freeqaz
freeqaz deleted the fix-1272 branch October 13, 2026 21:13

This branch was previously deployed

1 inactive deployment
integration-qa-pr — 68abf27b Deployed Oct 13, 2026 by freeqaz via QA advisory (compose) #729
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.

1 participant