fix(pkg): respect subchart conditions when dependency uses an alias in v3 & add logging

Signed-off-by: Julian Siebert <j.siebert@micromata.de>
pull/31847/head
Julian Siebert 3 months ago
parent 2e8f0b70cc
commit 19fcdd6f15

@ -214,6 +214,21 @@ Loop:
// recursively call self to process sub dependencies
for _, t := range cd {
// cvals[path][alias] may be stale when an alias is used, because ancestor
// CoalesceValues calls used the original chart name. Fill in missing keys from the
// correctly-coalesced top-level entry, keeping the nested entry authoritative.
if path != "" {
if pt, err := cvals.Table(strings.TrimSuffix(path, ".")); err == nil {
if top, ok := cvals[t.Metadata.Name].(map[string]interface{}); ok {
if v, ok := pt[t.Metadata.Name]; ok && !istable(v) {
slog.Warn("skipping nested path update: value is not a table", "path", path+t.Metadata.Name)
} else {
nested, _ := v.(map[string]interface{})
pt[t.Metadata.Name] = util.CoalesceTables(nested, top)
}
}
}
}
subpath := path + t.Metadata.Name + "."
if err := processDependencyEnabled(t, cvals, subpath); err != nil {
return err

@ -552,6 +552,32 @@ func validateDependencyTree(t *testing.T, c *chart.Chart) {
}
}
func TestDependencyEnabledAliasNestedCondition(t *testing.T) {
// Chart structure:
// parentchart -> mid (alias: midchart) -> leaf (alias: leafchart) -> util (condition: util.enabled)
//
// leaf/values.yaml sets util.enabled: false.
// No user-provided values override this.
// Expected: util is NOT included in the output.
c := loadChart(t, "testdata/alias-condition-nested")
if err := processDependencyEnabled(c, c.Values, ""); err != nil {
t.Fatalf("error processing enabled dependencies: %v", err)
}
names := extractChartNames(c)
expected := []string{"parentchart", "parentchart.midchart", "parentchart.midchart.leafchart"}
sort.Strings(expected)
if len(names) != len(expected) {
t.Fatalf("slice lengths do not match: got %v, expected %v", names, expected)
}
for i := range names {
if names[i] != expected[i] {
t.Fatalf("slice values do not match: got %v, expected %v", names, expected)
}
}
}
func TestChartWithDependencyAliasedTwiceAndDoublyReferencedSubDependency(t *testing.T) {
c := loadChart(t, "testdata/chart-with-dependency-aliased-twice")

@ -0,0 +1,9 @@
apiVersion: v3
name: parentchart
version: 0.1.0
dependencies:
- name: mid
repository: http://localhost:10191
version: 0.1.0
alias: midchart
condition: midchart.enabled

@ -0,0 +1,9 @@
apiVersion: v3
name: mid
version: 0.1.0
dependencies:
- name: leaf
repository: http://localhost:10191
version: 0.1.0
alias: leafchart
condition: leafchart.enabled

@ -0,0 +1,8 @@
apiVersion: v3
name: leaf
version: 0.1.0
dependencies:
- name: util
repository: http://localhost:10191
version: 0.1.0
condition: util.enabled

@ -0,0 +1,3 @@
# util is disabled by default in this chart's values
util:
enabled: false

@ -220,8 +220,12 @@ Loop:
if path != "" {
if pt, err := cvals.Table(strings.TrimSuffix(path, ".")); err == nil {
if top, ok := cvals[t.Metadata.Name].(map[string]interface{}); ok {
nested, _ := pt[t.Metadata.Name].(map[string]interface{})
pt[t.Metadata.Name] = util.CoalesceTables(nested, top)
if v, ok := pt[t.Metadata.Name]; ok && !istable(v) {
slog.Warn("skipping nested path update: value is not a table", "path", path+t.Metadata.Name)
} else {
nested, _ := v.(map[string]interface{})
pt[t.Metadata.Name] = util.CoalesceTables(nested, top)
}
}
}
}

Loading…
Cancel
Save