derailed/k9s · error

invalid label selector: %w

Error message

invalid label selector: %w

What it means

After the label selector template renders successfully, the result is parsed with labels.Parse() from apimachinery. Parsing failed, meaning the rendered string is not valid Kubernetes label selector grammar (=, !=, in, notin, exists operators with proper quoting).

Source

Thrown at internal/view/custom_jump.go:64

			v = NewBrowser(targetGVR)
			if mv.enterFn != nil {
				v.GetTable().SetEnterFn(mv.enterFn)
			}
		}
	} else {
		v = NewScaleExtender(NewOwnerExtender(NewBrowser(targetGVR)))
	}

	// Build label selector if specified
	var labelSel labels.Selector
	if rule.LabelSelector != "" {
		labelStr, labelErr := applyTemplate(rule.LabelSelector, sourceObj)
		if labelErr != nil {
			return fmt.Errorf("failed to process label selector template: %w", labelErr)
		}
		labelSel, labelErr = labels.Parse(labelStr)
		if labelErr != nil {
			return fmt.Errorf("invalid label selector: %w", labelErr)
		}
	}

	// Set label selector if we have one
	if labelSel != nil {
		v.SetLabelSelector(labelSel, true)
	}

	// Build field selector if specified
	var fieldSel string
	if rule.FieldSelector != "" {
		var fieldErr error
		fieldSel, fieldErr = applyTemplate(rule.FieldSelector, sourceObj)
		if fieldErr != nil {
			return fmt.Errorf("failed to process field selector template: %w", fieldErr)
		}
	}

View on GitHub (pinned to 2d3ccc6ba2)

Solutions

  1. Dry-run the exact rendered string: kubectl get pods -l '<rendered selector>'
  2. Fix the grammar: single key=value pairs joined by commas, set-based operators (in/notin) with parenthesized value lists
  3. If the template can render empty, guard it — an empty labelSelector entry should stay empty (which is skipped) rather than emit stray text

Example fix

// before
labelSelector: "{{ .metadata.labels.app }}"   // renders to bare value 'myapp' — invalid
// after
labelSelector: "app={{ .metadata.labels.app }}"  // renders to 'app=myapp' — valid
Defensive patterns

Strategy: validation

Validate before calling

// validate selector grammar the same way k9s will, before shipping the rule
sel, err := labels.Parse(renderedSelector)
if err != nil {
    return fmt.Errorf("selector %q is not valid k8s label-selector syntax: %w", renderedSelector, err)
}
_ = sel

Prevention

When it happens

Trigger: A template that expands to an empty string, injects whitespace/quotes in the wrong place, or produces something like 'app=foo bar' or 'app in (a,b' — e.g. a label value containing characters that break the key=value pair.

Common situations: Label values with spaces or '=' inside; field-selector syntax (metadata.name=x) mistakenly put under labelSelector; template rendering to empty because the referenced label exists but is empty.

Related errors


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