kubernetes/kops · error

stringSliceValue %q: %w

Error message

stringSliceValue %q: %w

What it means

lazyQuoteStringSliceValue.Set parses the incoming comma-separated flag value as CSV (supporting lazy quotes when configured) via readAsCSV; any csv.Reader parse failure is wrapped as `stringSliceValue "<val>": <err>`. This catches malformed quoting such as an unbalanced or stray double-quote inside the flag value.

Source

Thrown at cmd/kops/flags_stringslice_lazyquotes.go:73

	csvReader.LazyQuotes = lazyQuotes
	return csvReader.Read()
}

func writeAsCSV(vals []string) (string, error) {
	b := &bytes.Buffer{}
	w := csv.NewWriter(b)
	err := w.Write(vals)
	if err != nil {
		return "", err
	}
	w.Flush()
	return strings.TrimSuffix(b.String(), "\n"), nil
}

func (s *lazyQuoteStringSliceValue) Set(val string) error {
	v, err := readAsCSV(val, s.lazyQuotes)
	if err != nil {
		return fmt.Errorf("stringSliceValue %q: %w", val, err)
	}
	if !s.changed {
		*s.value = v
	} else {
		*s.value = append(*s.value, v...)
	}
	s.changed = true
	return nil
}

func (s *lazyQuoteStringSliceValue) Type() string {
	return "stringSlice"
}

func (s *lazyQuoteStringSliceValue) String() string {
	str, _ := writeAsCSV(*s.value)
	return "[" + str + "]"
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Balance the quotes in the value or remove them: --flag a,b,c
  2. Escape embedded quotes properly, e.g. --flag 'a,"b"' so CSV parses them
  3. If the value legitimately contains commas/quotes, check whether the flag supports repeated use: --flag a --flag b
  4. Inspect the wrapped %w error message — it names the exact CSV offset of the bad quote

Example fix

// before
kops create cluster ... --cloud-labels 'owner="team,env=dev'
// after
kops create cluster ... --cloud-labels 'owner=team,env=dev'
Defensive patterns

Strategy: validation

Validate before calling

func balancedQuotes(s string) error {
    inQuote := false
    for i, r := range s {
        if r == '"' {
            if inQuote && i > 0 && s[i-1] == '\\' { continue }
            inQuote = !inQuote
        }
    }
    if inQuote {
        return fmt.Errorf("unbalanced quote in value %q", s)
    }
    return nil
}

Try / catch

if err := cmd.Flags().Set("cloud-labels", val); err != nil {
    var wrapped *fmt.WrapError
    if strings.Contains(err.Error(), "stringSliceValue") {
        // value failed CSV parsing: check quoting
    }
}

Prevention

When it happens

Trigger: Setting a pflag string-slice flag (e.g. --node-labels-like list flags in kops) with a value containing an unclosed quote, e.g. --flag 'a,"b' — encoding/csv returns ErrBareQuote/ErrQuote and Set wraps it.

Common situations: Users quoting values inside comma lists like key:"some value without close; shell escaping stripping quotes before Go sees them; copy-pasting examples where quotes were meant for the shell, not CSV.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/b7312d19c6a2bb3e. Report an issue: GitHub.