pull/32097/merge
yxxhero 1 day ago committed by GitHub
commit 2e73a12c6b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -249,17 +249,19 @@ func coalesceValues(printf printFn, c chart.Charter, v map[string]any, prefix st
} }
} else { } else {
// If the key is a child chart, coalesce tables with Merge set to true // If the key is a child chart, coalesce tables with Merge set to true
merge := childChartMergeTrue(c, key, merge) childMerge := childChartMergeTrue(c, key, merge)
// When coalescing, clean nils from chart defaults before merging // When coalescing, clean nils from chart defaults before merging
// so they don't leak into the result. // so they don't leak into the result. Use the original merge flag
// (not childMerge) because childMerge is always true for child
// chart keys, which would skip cleaning subchart-default nils.
if !merge { if !merge {
cleanNilValues(src) cleanNilValues(src)
} }
// Because v has higher precedence than nv, dest values override src // Because v has higher precedence than nv, dest values override src
// values. // values.
coalesceTablesFullKey(printf, dest, src, concatPrefix(subPrefix, key), merge) coalesceTablesFullKey(printf, dest, src, concatPrefix(subPrefix, key), childMerge)
} }
} }
} else { } else {

@ -825,3 +825,114 @@ func TestCoalesceValuesSubchartNilCleanedWhenUserPartiallyOverrides(t *testing.T
_, ok = keyMapping["password"] _, ok = keyMapping["password"]
is.False(ok, "Expected keyMapping.password (nil from chart defaults) to be removed even when user partially overrides the map") is.False(ok, "Expected keyMapping.password (nil from chart defaults) to be removed even when user partially overrides the map")
} }
// TestCoalesceValuesSubchartDefaultNilsCleanedWithUnrelatedUserValues tests that
// nil values in subchart defaults are cleaned even when the parent provides an
// unrelated user value under that subchart's namespace.
//
// This simulates the state after processImportValues (merge=true) populates
// parent.Values with merged child defaults including nils, then CoalesceValues
// is called with user values that touch the child namespace. The bug in #32093
// was that childChartMergeTrue shadowed the merge flag, skipping cleanNilValues.
func TestCoalesceValuesSubchartDefaultNilsCleanedWithUnrelatedUserValues(t *testing.T) {
is := assert.New(t)
subchart := &chart.Chart{
Metadata: &chart.Metadata{Name: "child"},
Values: map[string]any{
"keyMapping": map[string]any{
"password": nil,
},
"ingress": map[string]any{
"configureCertmanager": nil,
},
},
}
parent := withDeps(&chart.Chart{
Metadata: &chart.Metadata{Name: "parent"},
Values: map[string]any{},
}, subchart)
// Simulate the state after processImportValues has populated parent.Values
// with merged defaults (including nils from child chart defaults).
mergedDefaults, err := MergeValues(parent, nil)
is.NoError(err)
parent.Values = mergedDefaults
vals := map[string]any{
"child": map[string]any{
"someOtherKey": "value",
},
}
v, err := CoalesceValues(parent, vals)
is.NoError(err)
childVals, ok := v["child"].(map[string]any)
is.True(ok, "child values should be a map")
keyMapping, ok := childVals["keyMapping"].(map[string]any)
is.True(ok, "keyMapping should be a map")
_, ok = keyMapping["password"]
is.False(ok, "Expected keyMapping.password (nil from chart defaults) to be removed when parent sets unrelated child value")
ingress, ok := childVals["ingress"].(map[string]any)
is.True(ok, "ingress should be a map")
_, ok = ingress["configureCertmanager"]
is.False(ok, "Expected ingress.configureCertmanager (nil from chart defaults) to be removed when parent sets unrelated child value")
}
// TestCoalesceValuesSubchartDefaultNilsCleanedWithPartialOverrideSameMapMerged
// tests that nil values in subchart defaults are cleaned even when the user
// overrides a sibling key within the same map, after the parent chart's Values
// have been populated by a prior merge step.
//
// Unlike TestCoalesceValuesSubchartNilCleanedWhenUserPartiallyOverrides which
// tests coalescing from scratch, this test seeds parent.Values via MergeValues
// to exercise the childChartMergeTrue code path described in issue #32093.
func TestCoalesceValuesSubchartDefaultNilsCleanedWithPartialOverrideSameMapMerged(t *testing.T) {
is := assert.New(t)
subchart := &chart.Chart{
Metadata: &chart.Metadata{Name: "child"},
Values: map[string]any{
"keyMapping": map[string]any{
"password": nil,
"format": "bcrypt",
},
},
}
parent := withDeps(&chart.Chart{
Metadata: &chart.Metadata{Name: "parent"},
Values: map[string]any{},
}, subchart)
// Simulate the state after processImportValues has populated parent.Values
// with merged defaults (including nils from child chart defaults).
mergedDefaults, err := MergeValues(parent, nil)
is.NoError(err)
parent.Values = mergedDefaults
vals := map[string]any{
"child": map[string]any{
"keyMapping": map[string]any{
"format": "sha256",
},
},
}
v, err := CoalesceValues(parent, vals)
is.NoError(err)
childVals, ok := v["child"].(map[string]any)
is.True(ok, "child values should be a map")
keyMapping, ok := childVals["keyMapping"].(map[string]any)
is.True(ok, "keyMapping should be a map")
is.Equal("sha256", keyMapping["format"], "User override should be preserved")
_, ok = keyMapping["password"]
is.False(ok, "Expected keyMapping.password (nil from chart defaults) to be removed when user overrides sibling key in same map")
}

Loading…
Cancel
Save