feat(ui): Enter drill-down from owners to their pods - #21
Merged
Conversation
Enter on a Deployment/ReplicaSet/StatefulSet/DaemonSet now opens a Pods view scoped to that owner's pods; Enter on a Node shows the pods scheduled on it. Closes the top gap from the k9s readonly parity audit (4.7). - Live filter, not a snapshot: a DrillFilter on ViewRequest is applied in the projector, so rollouts/new pods appear/disappear in real time. Deployment ownership is resolved transitively through the pod's ReplicaSet (reusing the owner chain the log fan-in relies on); other workloads and Node match directly (ownerReferences / scheduled node). - The Pods title shows `[DRILL] <owner> → Pods`; `esc` pops back to the owner's list (krust has no view stack). Drill clears on any kind/namespace change. - Leaf kinds keep the previous behavior (Enter → describe; namespace → its resources). svc→endpoints drill deferred (needs the service selector, not currently extracted) — noted in the audit/ROADMAP. Tests: projector owner-chain/node filtering, and an Enter→drill render integration test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The deployment→pod chain resolves transitively through each pod's ReplicaSet, but ReplicaSets were only watched in the Logs pane — during a drill the active kind is Pods (Table pane), so the RS were never loaded and every pod was filtered out (zero pods). Two-part fix: - Watch ReplicaSets for the drilled namespace while a Deployment drill is active, so the chain resolves authoritatively from store state. - Add a name-convention fallback in DrillFilter: a deployment's RS is always named `<deploy>-<pod-template-hash>` (hash has no `-`), so pods match immediately even before the RS watch populates or if RS are RBAC-denied. The no-`-` check keeps `web` from matching `web-api`'s ReplicaSets. Test: projector deployment drill now covers a pod whose RS is absent from the store (name-fallback path). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes the top gap from the k9s readonly parity audit (4.7): Enter drill-down.
Enteron a Deployment / ReplicaSet / StatefulSet / DaemonSet → a Pods view scoped to that owner's pods.Enteron a Node → the pods scheduled on it.Design
DrillFilteronViewRequestis applied in the projector each frame, so a rollout's new/old pods appear and disappear in real time. Deployment ownership is resolved transitively through the pod's ReplicaSet (reusing the owner chain the log fan-in already relies on); other workloads and Node match directly viaownerReferences/ scheduled node.[DRILL] <owner> → Pods;escpops back to the owner's list (krust has no view stack). The drill clears on any kind/namespace change.svc → endpointsdrill is deferred — it needs the Service selector, which isn't currently extracted (noted in the audit/ROADMAP).Testing
make validategreen (101 tests + release build)🤖 Generated with Claude Code