{"record":{"id":"c50997a7b25d18f4","repo":"derailed/k9s","slug":"no-nuker-for-q","errorCode":null,"errorMessage":"no nuker for %q","messagePattern":"no nuker for %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/model/table.go","lineNumber":154,"sourceCode":"func (t *Table) Get(ctx context.Context, path string) (runtime.Object, error) {\n\tmeta, err := getMeta(ctx, t.gvr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn meta.DAO.Get(ctx, path)\n}\n\n// Delete deletes a resource.\nfunc (t *Table) Delete(ctx context.Context, path string, propagation *metav1.DeletionPropagation, grace dao.Grace) error {\n\tmeta, err := getMeta(ctx, t.gvr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tnuker, ok := meta.DAO.(dao.Nuker)\n\tif !ok {\n\t\treturn fmt.Errorf(\"no nuker for %q\", meta.DAO.GVR())\n\t}\n\n\treturn nuker.Delete(ctx, path, propagation, grace)\n}\n\n// GetNamespace returns the model namespace.\nfunc (t *Table) GetNamespace() string {\n\treturn t.data.GetNamespace()\n}\n\n// SetNamespace sets up model namespace.\nfunc (t *Table) SetNamespace(ns string) {\n\tt.data.Reset(ns)\n}\n\n// InNamespace checks if current namespace matches desired namespace.\nfunc (t *Table) InNamespace(ns string) bool {\n\treturn t.data.GetNamespace() == ns && !t.data.Empty()","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/model/table.go#L136-L172","documentation":"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.","triggerScenarios":"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.","commonSituations":"Attempting delete on reference/pointer rows in k9s (e.g. from a details tree); custom plugin accessors without delete capability.","solutions":["Delete the underlying resource from its own view instead of a reference/tree row","For custom DAOs, implement Delete(ctx, path, propagation, grace) to satisfy dao.Nuker (embedding dao.Resource usually provides it)","Fall back to kubectl delete <resource> <name> -n <ns>"],"exampleFix":"// before: accessor without delete\ntype MyDAO struct {\n  dao.Resource\n}\n// (no Delete method -> not a Nuker)\n\n// after: rely on embedded Nuker or implement it\ntype MyDAO struct {\n  dao.Resource // Resource implements dao.Nuker\n}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"func nukerFor(factory dao.Factory, gvr *client.GVR) (dao.Nuker, bool) {\n    accessor, err := dao.AccessorFor(factory, gvr)\n    if err != nil { return nil, false }\n    n, ok := accessor.(dao.Nuker)\n    return n, ok\n}","tryCatchPattern":"err := t.Delete(ctx, path, propagation, grace)\nif err != nil && strings.Contains(err.Error(), \"no nuker for\") {\n    return fmt.Errorf(\"%w — delete this resource from its own view or via kubectl\", err)\n}","preventionTips":["Hide delete actions on reference rows and read-only accessors","Ensure custom DAOs embed dao.Resource so they satisfy dao.Nuker"],"tags":["kubernetes","delete","interface","dao","k9s"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}