[#9136] - processDependencyImportValues should only apply import values and not additional coalesced values

Signed-off-by: Elliot Kennedy <me@elken.io>
pull/9138/head
Elliot Kennedy 5 years ago
parent 018982f177
commit c0224c0509

@ -16,6 +16,7 @@ limitations under the License.
package chartutil package chartutil
import ( import (
"github.com/mitchellh/copystructure"
"log" "log"
"strings" "strings"
@ -23,11 +24,28 @@ import (
) )
// ProcessDependencies checks through this chart's dependencies, processing accordingly. // ProcessDependencies checks through this chart's dependencies, processing accordingly.
func ProcessDependencies(c *chart.Chart, v Values) error { func ProcessDependencies(c *chart.Chart, vals map[string]interface{}) error {
if err := processDependencyEnabled(c, v, ""); err != nil { v, err := copystructure.Copy(vals)
if err != nil {
return err
}
valsCopy := v.(map[string]interface{})
// if we have an empty map, make sure it is initialized
if valsCopy == nil {
valsCopy = make(map[string]interface{})
}
return process(c, valsCopy)
}
// process processes the dependencies
//
// This is a helper function for ProcessDependencies.
func process(c *chart.Chart, vals map[string]interface{}) error {
if err := processDependencyEnabled(c, vals, ""); err != nil {
return err return err
} }
return processDependencyImportValues(c) return processDependencyImportValues(c, vals)
} }
// processDependencyConditions disables charts based on condition path value in values // processDependencyConditions disables charts based on condition path value in values
@ -217,12 +235,11 @@ func set(path []string, data map[string]interface{}) map[string]interface{} {
} }
// processImportValues merges values from child to parent based on the chart's dependencies' ImportValues field. // processImportValues merges values from child to parent based on the chart's dependencies' ImportValues field.
func processImportValues(c *chart.Chart) error { func processImportValues(c *chart.Chart, v map[string]interface{}) error {
if c.Metadata.Dependencies == nil { if c.Metadata.Dependencies == nil {
return nil return nil
} }
// combine chart values and empty config to get Values cvals, err := CoalesceValues(c, v)
cvals, err := CoalesceValues(c, nil)
if err != nil { if err != nil {
return err return err
} }
@ -247,8 +264,8 @@ func processImportValues(c *chart.Chart) error {
log.Printf("Warning: ImportValues missing table from chart %s: %v", r.Name, err) log.Printf("Warning: ImportValues missing table from chart %s: %v", r.Name, err)
continue continue
} }
// create value map from child to be merged into parent // create value map from child to be merged into parent values
b = CoalesceTables(cvals, pathToMap(parent, vv.AsMap())) b = CoalesceTables(b, pathToMap(parent, vv.AsMap()))
case string: case string:
child := "exports." + iv child := "exports." + iv
outiv = append(outiv, map[string]string{ outiv = append(outiv, map[string]string{
@ -267,19 +284,19 @@ func processImportValues(c *chart.Chart) error {
r.ImportValues = outiv r.ImportValues = outiv
} }
// set the new values // merge the import values into the chart config
c.Values = CoalesceTables(b, cvals) c.Values = CoalesceTables(b, c.Values)
return nil return nil
} }
// processDependencyImportValues imports specified chart values from child to parent. // processDependencyImportValues imports specified chart values from child to parent.
func processDependencyImportValues(c *chart.Chart) error { func processDependencyImportValues(c *chart.Chart, v map[string]interface{}) error {
for _, d := range c.Dependencies() { for _, d := range c.Dependencies() {
// recurse // recurse
if err := processDependencyImportValues(d); err != nil { if err := processDependencyImportValues(d, v); err != nil {
return err return err
} }
} }
return processImportValues(c) return processImportValues(c, v)
} }

@ -181,10 +181,11 @@ func TestProcessDependencyImportValues(t *testing.T) {
e["imported-chartA-B.SPextra5"] = "k8s" e["imported-chartA-B.SPextra5"] = "k8s"
e["imported-chartA-B.SC1extra5"] = "tiller" e["imported-chartA-B.SC1extra5"] = "tiller"
e["overridden-chart1.SC1bool"] = "false" // overridden values are not applied by processDependencyImportValues
e["overridden-chart1.SC1float"] = "3.141592" e["overridden-chart1.SC1bool"] = "true"
e["overridden-chart1.SC1int"] = "99" e["overridden-chart1.SC1float"] = "3.14"
e["overridden-chart1.SC1string"] = "pollywog" e["overridden-chart1.SC1int"] = "100"
e["overridden-chart1.SC1string"] = "dollywood"
e["overridden-chart1.SPextra2"] = "42" e["overridden-chart1.SPextra2"] = "42"
e["overridden-chartA.SCAbool"] = "true" e["overridden-chartA.SCAbool"] = "true"
@ -194,13 +195,13 @@ func TestProcessDependencyImportValues(t *testing.T) {
e["overridden-chartA.SPextra4"] = "true" e["overridden-chartA.SPextra4"] = "true"
e["overridden-chartA-B.SCAbool"] = "true" e["overridden-chartA-B.SCAbool"] = "true"
e["overridden-chartA-B.SCAfloat"] = "41.3" e["overridden-chartA-B.SCAfloat"] = "3.33"
e["overridden-chartA-B.SCAint"] = "808" e["overridden-chartA-B.SCAint"] = "555"
e["overridden-chartA-B.SCAstring"] = "jabberwocky" e["overridden-chartA-B.SCAstring"] = "wormwood"
e["overridden-chartA-B.SCBbool"] = "false" e["overridden-chartA-B.SCBbool"] = "true"
e["overridden-chartA-B.SCBfloat"] = "1.99" e["overridden-chartA-B.SCBfloat"] = "0.25"
e["overridden-chartA-B.SCBint"] = "77" e["overridden-chartA-B.SCBint"] = "98"
e["overridden-chartA-B.SCBstring"] = "jango" e["overridden-chartA-B.SCBstring"] = "murkwood"
e["overridden-chartA-B.SPextra6"] = "111" e["overridden-chartA-B.SPextra6"] = "111"
e["overridden-chartA-B.SCAextra1"] = "23" e["overridden-chartA-B.SCAextra1"] = "23"
e["overridden-chartA-B.SCBextra1"] = "13" e["overridden-chartA-B.SCBextra1"] = "13"
@ -212,7 +213,7 @@ func TestProcessDependencyImportValues(t *testing.T) {
e["SCBexported2A"] = "blaster" e["SCBexported2A"] = "blaster"
e["global.SC1exported2.all.SC1exported3"] = "SC1expstr" e["global.SC1exported2.all.SC1exported3"] = "SC1expstr"
if err := processDependencyImportValues(c); err != nil { if err := processDependencyImportValues(c, make(map[string]interface{})); err != nil {
t.Fatalf("processing import values dependencies %v", err) t.Fatalf("processing import values dependencies %v", err)
} }
cc := Values(c.Values) cc := Values(c.Values)
@ -225,15 +226,15 @@ func TestProcessDependencyImportValues(t *testing.T) {
switch pv := pv.(type) { switch pv := pv.(type) {
case float64: case float64:
if s := strconv.FormatFloat(pv, 'f', -1, 64); s != vv { if s := strconv.FormatFloat(pv, 'f', -1, 64); s != vv {
t.Errorf("failed to match imported float value %v with expected %v", s, vv) t.Errorf("failed to match %s, imported float value %v, expected %v", kk, s, vv)
} }
case bool: case bool:
if b := strconv.FormatBool(pv); b != vv { if b := strconv.FormatBool(pv); b != vv {
t.Errorf("failed to match imported bool value %v with expected %v", b, vv) t.Errorf("failed to match %s, imported bool value %v, expected %v", kk, b, vv)
} }
default: default:
if pv != vv { if pv != vv {
t.Errorf("failed to match imported string value %q with expected %q", pv, vv) t.Errorf("failed to match %s, imported string value %q, expected %q", kk, pv, vv)
} }
} }
} }
@ -243,7 +244,7 @@ func TestProcessDependencyImportValuesForEnabledCharts(t *testing.T) {
c := loadChart(t, "testdata/import-values-from-enabled-subchart/parent-chart") c := loadChart(t, "testdata/import-values-from-enabled-subchart/parent-chart")
nameOverride := "parent-chart-prod" nameOverride := "parent-chart-prod"
if err := processDependencyImportValues(c); err != nil { if err := processDependencyImportValues(c, make(map[string]interface{})); err != nil {
t.Fatalf("processing import values dependencies %v", err) t.Fatalf("processing import values dependencies %v", err)
} }

Loading…
Cancel
Save