derailed/k9s · warning
resource %s is not Valuer
Error message
resource %s is not Valuer
What it means
Values.getValues resolves the DAO accessor for a GVR and requires dao.Valuer (GetValues). Resources whose accessor doesn't implement it cannot serve a values view (the decoded key/value listing used for ConfigMaps and Secrets).
Source
Thrown at internal/model/values.go:62
// Init initializes the model.
func (v *Values) Init(f dao.Factory) error {
v.factory = f
var err error
v.lines, err = v.getValues()
return err
}
func (v *Values) getValues() ([]string, error) {
accessor, err := dao.AccessorFor(v.factory, v.gvr)
if err != nil {
return nil, err
}
valuer, ok := accessor.(dao.Valuer)
if !ok {
return nil, fmt.Errorf("resource %s is not Valuer", v.gvr)
}
values, err := valuer.GetValues(v.path, v.allValues)
if err != nil {
return nil, err
}
return strings.Split(string(values), "\n"), nil
}
// GVR returns the resource gvr.
func (v *Values) GVR() *client.GVR {
return v.gvr
}
// ToggleValues toggles between user supplied values and computed values.
func (v *Values) ToggleValues() error {
v.allValues = !v.allValuesView on GitHub (pinned to 2d3ccc6ba2)
Solutions
- Use the values view on ConfigMap or Secret resources
- For a custom resource that stores key/value data, implement GetValues on its DAO to satisfy dao.Valuer
- Otherwise view the resource YAML (ToYAML) instead of a values listing
Example fix
// before: values on a Deployment accessor
valuer, ok := accessor.(dao.Valuer) // ok == false
// after: guard and route
if valuer, ok := accessor.(dao.Valuer); ok {
values, err := valuer.GetValues(path, all)
} Defensive patterns
Strategy: type-guard
Type guard
func valuerFor(factory dao.Factory, gvr *client.GVR) (dao.Valuer, bool) {
accessor, err := dao.AccessorFor(factory, gvr)
if err != nil { return nil, false }
v, ok := accessor.(dao.Valuer)
return v, ok
} Try / catch
vals, err := v.getValues()
if err != nil && strings.Contains(err.Error(), "is not Valuer") {
return nil, fmt.Errorf("%w — values view applies to ConfigMap/Secret-like resources", err)
} Prevention
- Offer the values action only for config-carrying GVRs (configmaps, secrets, custom config CRDs implementing GetValues)
- Implement dao.Valuer on custom config resources so the view works uniformly
When it happens
Trigger: Opening the values view on a resource that is not ConfigMap/Secret-like: Deployments, Pods, Services, CRDs — any accessor without GetValues(path, allValues).
Common situations: Pressing the values shortcut on an arbitrary resource in k9s; custom resources expected to behave like config carriers.
Related errors
- no describer for %q
- resource %s is not Loggable
- no nuker for %q
- expecting a switchable resource
- expecting a switchable resource
AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15).
Data as JSON: /api/errors/f390a84112b41322.
Report an issue: GitHub.