derailed/k9s · error

no nuker for %q

Error message

no nuker for %q

What it means

Table.Delete resolves the DAO for a GVR and requires the dao.Nuker interface (Delete with propagation/grace). If the DAO has no Delete method, delete requests cannot be delegated and the error names the GVR.

Source

Thrown at internal/model/table.go:154

func (t *Table) Get(ctx context.Context, path string) (runtime.Object, error) {
	meta, err := getMeta(ctx, t.gvr)
	if err != nil {
		return nil, err
	}

	return meta.DAO.Get(ctx, path)
}

// Delete deletes a resource.
func (t *Table) Delete(ctx context.Context, path string, propagation *metav1.DeletionPropagation, grace dao.Grace) error {
	meta, err := getMeta(ctx, t.gvr)
	if err != nil {
		return err
	}

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

	return nuker.Delete(ctx, path, propagation, grace)
}

// GetNamespace returns the model namespace.
func (t *Table) GetNamespace() string {
	return t.data.GetNamespace()
}

// SetNamespace sets up model namespace.
func (t *Table) SetNamespace(ns string) {
	t.data.Reset(ns)
}

// InNamespace checks if current namespace matches desired namespace.
func (t *Table) InNamespace(ns string) bool {
	return t.data.GetNamespace() == ns && !t.data.Empty()

View on GitHub (pinned to 2d3ccc6ba2)

Solutions

  1. Delete the underlying resource from its own view instead of a reference/tree row
  2. For custom DAOs, implement Delete(ctx, path, propagation, grace) to satisfy dao.Nuker (embedding dao.Resource usually provides it)
  3. Fall back to kubectl delete <resource> <name> -n <ns>

Example fix

// before: accessor without delete
type MyDAO struct {
  dao.Resource
}
// (no Delete method -> not a Nuker)

// after: rely on embedded Nuker or implement it
type MyDAO struct {
  dao.Resource // Resource implements dao.Nuker
}
Defensive patterns

Strategy: type-guard

Type guard

func nukerFor(factory dao.Factory, gvr *client.GVR) (dao.Nuker, bool) {
    accessor, err := dao.AccessorFor(factory, gvr)
    if err != nil { return nil, false }
    n, ok := accessor.(dao.Nuker)
    return n, ok
}

Try / catch

err := t.Delete(ctx, path, propagation, grace)
if err != nil && strings.Contains(err.Error(), "no nuker for") {
    return fmt.Errorf("%w — delete this resource from its own view or via kubectl", err)
}

Prevention

When it happens

Trigger: Deleting a resource whose accessor does not implement dao.Nuker: read-only style DAOs (Reference, generic non-resource accessors), or custom DAO registrations missing the Delete method.

Common situations: Attempting delete on reference/pointer rows in k9s (e.g. from a details tree); custom plugin accessors without delete capability.

Related errors


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