derailed/k9s · error
no tree renderer defined for this resource
Error message
no tree renderer defined for this resource
What it means
treeHydrate fans out per-object rendering to a TreeRenderer via a worker pool. A nil renderer means no code path knows how to draw children for this resource, so hydration is refused before any work is dispatched.
Source
Thrown at internal/model/tree.go:294
// ----------------------------------------------------------------------------
// Helpers...
func rxMatch(q, path string) bool {
rx := regexp.MustCompile(`(?i)` + q)
tokens := strings.Split(path, "::")
for _, t := range tokens {
if rx.MatchString(t) {
return true
}
}
return false
}
func treeHydrate(ctx context.Context, ns string, oo []runtime.Object, re TreeRenderer) error {
if re == nil {
return fmt.Errorf("no tree renderer defined for this resource")
}
pool := internal.NewWorkerPool(ctx, internal.DefaultPoolSize)
for _, o := range oo {
pool.Add(func(_ context.Context) error {
return re.Render(ctx, ns, o)
})
}
errs := pool.Drain()
if len(errs) > 0 {
return errs[0]
}
return nil
}
func genericTreeHydrate(ctx context.Context, ns string, table *metav1.Table, re TreeRenderer) error {
tre, ok := re.(*xray.Generic)
if !ok {View on GitHub (pinned to 2d3ccc6ba2)
Solutions
- Check views/skin config for tree/custom view overrides on that resource and remove them
- Ensure a TreeRenderer is registered for the GVR before building the tree model
- Upgrade k9s: renderer coverage for the resource may exist in a newer release
Defensive patterns
Strategy: validation
Validate before calling
// Guard in the caller before hydrating.
if renderer == nil {
return fmt.Errorf("tree view unavailable for %s (no renderer registered)", gvr)
}
err := treeHydrate(ctx, ns, objs, renderer) Type guard
func hasRenderer(r TreeRenderer) bool { return r != nil } Try / catch
if err := treeHydrate(ctx, ns, oo, re); err != nil && strings.Contains(err.Error(), "no tree renderer") {
// fall back to a flat list view for this GVR
return openListViewFor(gvr)
} Prevention
- Only enable tree mode in views/skins for GVRs with registered renderers
- Register renderers in an init() next to the model so registration can't be skipped
When it happens
Trigger: Loading a tree view for a resource whose renderer was never registered — custom views/skins referencing a GVR with no tree renderer, or a code path calling treeHydrate without passing the renderer from the registry.
Common situations: Custom views.yaml/skin entries that enable tree mode for unsupported resources; k9s versions where a new tree feature is enabled for a GVR whose renderer landed later.
Related errors
- no describer for %q
- no data found for resource %s
- invalid annotation %q
- expecting a ForwardRes but got %T
- expected Unstructured, but got %T
AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15).
Data as JSON: /api/errors/aab5ec929bf68a25.
Report an issue: GitHub.