kubernetes/kops · error
error re-marshaling manifest: %v
Error message
error re-marshaling manifest: %v
What it means
ToYAML re-serializes each Object in the manifest back to YAML and joins documents. If any individual object's ToYAML (yaml.Marshal of its data map) fails, the multi-document write is aborted with this error. This surfaces Marshal failures such as unencodable values inside the parsed data.
Source
Thrown at pkg/kubemanifest/manifest.go:119
return true
}
}
return false
}
// ToYAML serializes a list of objects back to bytes; it is the opposite of LoadObjectsFrom
func (l ObjectList) ToYAML() ([]byte, error) {
yamlSeparator := []byte("\n---\n\n")
var yamls [][]byte
for _, object := range l {
// Don't serialize empty objects - they confuse yaml parsers
if object.IsEmptyObject() {
continue
}
y, err := object.ToYAML()
if err != nil {
return nil, fmt.Errorf("error re-marshaling manifest: %v", err)
}
yamls = append(yamls, y)
}
return bytes.Join(yamls, yamlSeparator), nil
}
func (m *Object) ToYAML() ([]byte, error) {
b, err := yaml.Marshal(m.data)
if err != nil {
return nil, fmt.Errorf("error marshaling manifest to yaml: %w", err)
}
return b, nil
}
func (m *Object) MarshalJSON() ([]byte, error) {
b, err := json.Marshal(m.data)View on GitHub (pinned to 4c8573c808)
Solutions
- Inspect what was inserted into the object's data map; only plain YAML-representable values (maps, slices, scalars) are allowed
- Use the wrapped error to identify the unserializable value's path
- Re-parse the manifest from disk to reset the data to clean values
- Fix the transformation code (e.g. addPodSpecLabels-style rewriters) to avoid injecting non-basic types
Defensive patterns
Strategy: try-catch
Validate before calling
// verify data contains only YAML-safe values before ToYAML
func yamlSafe(v interface{}) bool {
switch t := v.(type) {
case map[string]interface{}:
for _, vv := range t { if !yamlSafe(vv) { return false } }
case []interface{}:
for _, vv := range t { if !yamlSafe(vv) { return false } }
case string, bool, int, int64, float64, nil:
return true
default:
return false
}
return true
}
Try / catch
y, err := manifest.ToYAML()
if err != nil {
return fmt.Errorf("manifest rewrite produced unserializable data: %w", err)
}
Prevention
- Only insert plain maps/slices/scalars into Object data
- Re-parse from source YAML after suspicious mutations
- Unit-test manifest rewriting round-trips (load -> mutate -> ToYAML)
- Avoid storing Go-native types in generic manifest maps
When it happens
Trigger: Calling ToYAML (or its callers Replace/Build) after the manifest data map contains values that yaml.Marshal cannot serialize — e.g. channels, funcs, or cyclic structures injected programmatically into the Object's data.
Common situations: Programmatic manifest mutation that inserted unsupported Go values into the object map; corrupted in-memory data after a buggy transformation.
Related errors
- error parsing addons or manifest: %v
- failed to parse objects: %w
- failed to parse objects: %w
- error marshaling yaml: %v
- error writing yaml to stdout: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/0cd7f970a0e94934.
Report an issue: GitHub.