Skip to content

fix: a default chart install could not create a cell, or say why - #13

Merged
wrkode merged 1 commit into
mainfrom
fix/install-blockers
Aug 9, 2026
Merged

fix: a default chart install could not create a cell, or say why#13
wrkode merged 1 commit into
mainfrom
fix/install-blockers

Conversation

@wrkode

@wrkode wrkode commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Found by installing the released v0.1.0 chart on the dev cluster and driving a real pool through it — not by reading manifests. All four are invisible to the test suite, which runs with admin credentials against a rendered-object harness.

Defect Symptom an operator sees
secrets granted get;list;watch only first cell never created: secrets is forbidden in the manager log, pool stuck with stale conditions
events not granted on events.k8s.io kubectl describe gpucellpool shows no events at all; rejections only in the manager log
default image tag 0.1.0 vs published v0.1.0 ImagePullBackOff on a default install
ServiceMonitor without honorLabels pool namespace label arrives as exported_namespace; every alert names the operator's namespace

The operator renders a per-cell bootstrap Secret (reconcileBootstrapSecret), so create+update are load-bearing. delete is deliberately not granted — the per-cell Secret carries the pool's ownerRef and is garbage-collected.

Validation

Live on the dev cluster, chart-installed operator, real GTX 1080 cell:

  • before: Reconciler error ... secrets is forbidden, no cell ever created
  • after granting the verbs: WorkloadClusterReachable=TrueCapacityProviderReady=True → cell created → GPU allocated → VM booted → workload Node joined and went Ready
  • honorLabels: true verified against dev's kube-prometheus-stack: namespace comes back as gpu-cells, not exported_namespace
  • all 8 alert rules load with no lastError; GPUCellPoolWorkloadClusterUnreachable went pending for a deliberately unreachable pool
  • published-tag check: v0.1.0 → HTTP 200, 0.1.0 → 404

CI

Three new guards, each verified to fail on the pre-fix tree:

WOULD FAIL: secrets missing ['create', 'update'] (had ['get', 'list', 'watch'])
WOULD FAIL: events missing ['create'] (had [])

make lint 0 issues, make test green.

🤖 Generated with Claude Code

Four defects, all found by installing the released chart on the dev cluster and
driving a real pool through it rather than by reading the manifests.

RBAC, secrets: the operator RENDERS a per-cell bootstrap Secret from the user's
join template, but the marker granted get;list;watch. Every pool failed with
"secrets is forbidden" on its first cell. This could not surface earlier because
every prior end-to-end run used admin credentials.

RBAC, events: the recorder writes through events.k8s.io, which nothing granted,
so every event the operator emitted was rejected. The failure was visible only
in the manager log — `kubectl describe gpucellpool` showed nothing at all.

Chart image tag: appVersion carries no leading v while the release workflow
pushes the tag verbatim, so the default tag resolved to 0.1.0 — a tag that was
never published (v0.1.0 was). A default install ImagePullBackOff'd on its own
image.

ServiceMonitor: without honorLabels the pool's own `namespace` label was
overwritten by the target's, landing as exported_namespace. Every alert would
have named the operator's namespace instead of the pool's.

CI grows three guards that fail on the pre-fix tree: the rendered default tag
must equal v$(appVersion), and the rendered Role must carry the verbs the code
actually uses.

Signed-off-by: William Rizzo <william.rizzo@gmail.com>
@wrkode
wrkode merged commit 1888749 into main Aug 9, 2026
4 checks passed
@wrkode wrkode mentioned this pull request Aug 9, 2026
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