derailed/k9s · error

no describer for

Error message

no describer for %q

What it means

Tree.Describe looks up the meta/DAO for a GVR and requires dao.Describer to serve describe text from a tree browser. If the accessor lacks the interface, the tree describe action fails with the offending GVR.

Solutions

  1. Describe the same resource from its flat list view, which may route to a different accessor
  2. Ensure the accessor for that GVR implements dao.Describer (embed dao.Resource)
  3. Use kubectl describe <gvr> <name> as an external fallback
Defensive patterns

Strategy: type-guard

Type guard

func describerFor(accessor dao.Accessor) (dao.Describer, bool) {
    d, ok := accessor.(dao.Describer)
    return d, ok
}

Try / catch

out, err := t.Describe(ctx, gvr, path)
if err != nil && strings.Contains(err.Error(), "no describer for") {
    out, err = kubectlDescribeFallback(gvr, path) // shell out or refuse with a hint
}
if err != nil { return "", err }

Prevention

When it happens

Trigger: Triggering describe on a tree node whose GVR resolves to an accessor without Describe — custom resources mapped to bare accessors, or tree views configured for resources without describe support.

Common situations: Browsing resource graphs/trees (references between objects) and describing a node for an exotic or custom resource; plugins registering DAOs without describe.

Related errors


AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15). Data as JSON: /api/errors/54066d3b7c85297d. Report an issue: GitHub.

Appendix: source

Thrown at internal/model/tree.go:144

func (t *Tree) Empty() bool {
	return t.root.IsLeaf()
}

// Peek returns model data.
func (t *Tree) Peek() *xray.TreeNode {
	return t.root
}

// Describe describes a given resource.
func (t *Tree) Describe(ctx context.Context, gvr *client.GVR, path string) (string, error) {
	meta, err := t.getMeta(ctx, gvr)
	if err != nil {
		return "", err
	}

	desc, ok := meta.DAO.(dao.Describer)
	if !ok {
		return "", fmt.Errorf("no describer for %q", meta.DAO.GVR())
	}

	return desc.Describe(path)
}

// ToYAML returns a resource yaml.
func (t *Tree) ToYAML(ctx context.Context, gvr *client.GVR, path string) (string, error) {
	meta, err := t.getMeta(ctx, gvr)
	if err != nil {
		return "", err
	}

	desc, ok := meta.DAO.(dao.Describer)
	if !ok {
		return "", fmt.Errorf("no describer for %q", meta.DAO.GVR())
	}

	return desc.ToYAML(path, false)

View on GitHub (pinned to 2d3ccc6ba2)