Skip to content

Commit

Permalink
Merge pull request #1692 from technosophos/fix/allow-global-map-merges
Browse files Browse the repository at this point in the history
fix(tller): allow deep merge of global maps
  • Loading branch information
technosophos committed Dec 16, 2016
2 parents 08143b6 + 6faf467 commit b3d812b
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 6 deletions.
34 changes: 28 additions & 6 deletions pkg/chartutil/values.go
Expand Up @@ -216,23 +216,45 @@ func coalesceGlobals(dest, src map[string]interface{}) map[string]interface{} {
return dg
}

// We manually copy (instead of using coalesceTables) because (a) we need
// to prevent loops, and (b) we disallow nesting tables under globals.
// Globals should _just_ be k/v pairs.
// EXPERIMENTAL: In the past, we have disallowed globals to test tables. This
// reverses that decision. It may somehow be possible to introduce a loop
// here, but I haven't found a way. So for the time being, let's allow
// tables in globals.
for key, val := range sg {
if istable(val) {
log.Printf("warning: nested values are illegal in globals (%s)", key)
continue
vv := copyMap(val.(map[string]interface{}))
if destv, ok := dg[key]; ok {
if destvmap, ok := destv.(map[string]interface{}); ok {
// Basically, we reverse order of coalesce here to merge
// top-down.
coalesceTables(vv, destvmap)
dg[key] = vv
continue
} else {
log.Printf("Conflict: cannot merge map onto non-map for %q. Skipping.", key)
}
} else {
// Here there is no merge. We're just adding.
dg[key] = vv
}
} else if dv, ok := dg[key]; ok && istable(dv) {
log.Printf("warning: nested values are illegal in globals (%s)", key)
// It's not clear if this condition can actually ever trigger.
log.Printf("key %s is table. Skipping", key)
continue
}
// TODO: Do we need to do any additional checking on the value?
dg[key] = val
}
dest[GlobalKey] = dg
return dest
}

func copyMap(src map[string]interface{}) map[string]interface{} {
dest := make(map[string]interface{}, len(src))
for k, v := range src {
dest[k] = v
}
return dest
}

// coalesceValues builds up a values map for a particular chart.
Expand Down
11 changes: 11 additions & 0 deletions pkg/chartutil/values_test.go
Expand Up @@ -263,11 +263,16 @@ top: yup
global:
name: Ishmael
subject: Queequeg
nested:
boat: true
pequod:
global:
name: Stinky
harpooner: Tashtego
nested:
boat: false
sail: true
ahab:
scope: whale
`
Expand Down Expand Up @@ -307,6 +312,12 @@ func TestCoalesceValues(t *testing.T) {
{"{{.pequod.global.subject}}", "Queequeg"},
{"{{.spouter.global.name}}", "Ishmael"},
{"{{.spouter.global.harpooner}}", "<no value>"},

{"{{.global.nested.boat}}", "true"},
{"{{.pequod.global.nested.boat}}", "true"},
{"{{.spouter.global.nested.boat}}", "true"},
{"{{.pequod.global.nested.sail}}", "true"},
{"{{.spouter.global.nested.sail}}", "<no value>"},
}

for _, tt := range tests {
Expand Down

0 comments on commit b3d812b

Please sign in to comment.