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.allValues

View on GitHub (pinned to 2d3ccc6ba2)

Solutions

  1. Use the values view on ConfigMap or Secret resources
  2. For a custom resource that stores key/value data, implement GetValues on its DAO to satisfy dao.Valuer
  3. 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

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


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