diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go index a2343555e..696f3ec95 100644 --- a/pkg/chartutil/values.go +++ b/pkg/chartutil/values.go @@ -278,26 +278,23 @@ func coalesceValues(c *chart.Chart, v map[string]interface{}) (map[string]interf } for key, val := range nv { - if _, ok := v[key]; !ok { + if value, ok := v[key]; ok { + if value == nil { + delete(v, key) + } else if dest, ok := value.(map[string]interface{}); ok { + // if v[key] is a table, merge nv's val table into v[key]. + src, ok := val.(map[string]interface{}) + if !ok { + log.Printf("warning: skipped value for %s: Not a table.", key) + continue + } + // Because v has higher precedence than nv, dest values override src + // values. + coalesceTables(dest, src) + } + } else { // If the key is not in v, copy it from nv. v[key] = val - } else if ok && v[key] == nil { - // When the YAML value is null, we remove the value's key. - // This allows Helm's various sources of values (value files or --set) to - // remove incompatible keys from any previous chart, file, or set values. - // ref: http://www.yaml.org/spec/1.2/spec.html#id2803362 - delete(v, key) - continue - } else if dest, ok := v[key].(map[string]interface{}); ok { - // if v[key] is a table, merge nv's val table into v[key]. - src, ok := val.(map[string]interface{}) - if !ok { - log.Printf("warning: skipped value for %s: Not a table.", key) - continue - } - // Because v has higher precedence than nv, dest values override src - // values. - coalesceTables(dest, src) } } return v, nil diff --git a/pkg/chartutil/values_test.go b/pkg/chartutil/values_test.go index 7d5750bd5..eb240452a 100644 --- a/pkg/chartutil/values_test.go +++ b/pkg/chartutil/values_test.go @@ -350,6 +350,10 @@ func TestCoalesceValues(t *testing.T) { } } + // When the YAML value is null, we remove the value's key. + // This allows Helm's various sources of values (value files or --set) to + // remove incompatible keys from any previous chart, file, or set values. + // ref: http://www.yaml.org/spec/1.2/spec.html#id2803362 nullKeys := []string{"bottom", "right", "left", "front"} for _, nullKey := range nullKeys { if _, ok := v[nullKey]; ok {