From 695951cb9edc0d40bf8a6c2d4e0e623d84b47c4c Mon Sep 17 00:00:00 2001 From: "adam.wu" Date: Sun, 27 Apr 2025 21:57:42 +0800 Subject: [PATCH] use depency's package name and version instead of name Signed-off-by: wujunwei Signed-off-by: adam.wu # Conflicts: # pkg/chart/v2/util/dependencies_test.go --- pkg/chart/v2/util/dependencies.go | 23 +++++++--- pkg/chart/v2/util/dependencies_test.go | 40 ++++++++++++++++++ .../Chart.lock | 9 ++++ .../Chart.yaml | 12 ++++++ .../charts/test-0.1.0.tgz | Bin 0 -> 337 bytes .../charts/test-0.2.0.tgz | Bin 0 -> 339 bytes .../templates/autoscaler.yaml | 16 +++++++ .../values.yaml | 11 +++++ 8 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.lock create mode 100644 pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.yaml create mode 100644 pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/charts/test-0.1.0.tgz create mode 100644 pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/charts/test-0.2.0.tgz create mode 100644 pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/templates/autoscaler.yaml create mode 100644 pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/values.yaml diff --git a/pkg/chart/v2/util/dependencies.go b/pkg/chart/v2/util/dependencies.go index e2cce6f2f..56b6f2f4c 100644 --- a/pkg/chart/v2/util/dependencies.go +++ b/pkg/chart/v2/util/dependencies.go @@ -184,18 +184,25 @@ Loop: processDependencyTags(c.Metadata.Dependencies, cvals) processDependencyConditions(c.Metadata.Dependencies, cvals, path) // make a map of charts to remove - rm := map[string]struct{}{} + rm := map[string][]string{} for _, r := range c.Metadata.Dependencies { if !r.Enabled { // remove disabled chart - rm[r.Name] = struct{}{} + rm[r.Name] = append(rm[r.Name], r.Version) } } // don't keep disabled charts in new slice cd := []*chart.Chart{} copy(cd, c.Dependencies()[:0]) for _, n := range c.Dependencies() { - if _, ok := rm[n.Metadata.Name]; !ok { + keep := true + for _, ver := range rm[n.Metadata.Name] { + if n.Metadata.Version == ver || IsCompatibleRange(ver, n.Metadata.Version) { + keep = false + break + } + } + if keep { cd = append(cd, n) } } @@ -203,11 +210,17 @@ Loop: cdMetadata := []*chart.Dependency{} copy(cdMetadata, c.Metadata.Dependencies[:0]) for _, n := range c.Metadata.Dependencies { - if _, ok := rm[n.Name]; !ok { + keep := true + for _, ver := range rm[n.Name] { + if n.Version == ver || IsCompatibleRange(ver, n.Version) { + keep = false + break + } + } + if keep { cdMetadata = append(cdMetadata, n) } } - // recursively call self to process sub dependencies for _, t := range cd { subpath := path + t.Metadata.Name + "." diff --git a/pkg/chart/v2/util/dependencies_test.go b/pkg/chart/v2/util/dependencies_test.go index 9b7fe3bef..2ddf861c7 100644 --- a/pkg/chart/v2/util/dependencies_test.go +++ b/pkg/chart/v2/util/dependencies_test.go @@ -585,3 +585,43 @@ func TestChartWithDependencyAliasedTwiceAndDoublyReferencedSubDependency(t *test } validateDependencyTree(t, c) } + +func TestDependencyWithSameNameDifferentVersion(t *testing.T) { + type M = map[string]interface{} + tests := []struct { + name string + v M + charts []string // expected dependent charts names + versions []string // expected dependent charts versions + }{ + { + "same name subcharts enbale one", + M{"one": M{"enabled": true}, "two": M{"enabled": false}}, + []string{"parent-chart.test"}, + []string{"0.1.0"}, + }, + { + "same name subcharts enbale another one", + M{"one": M{"enabled": false}, "two": M{"enabled": true}}, + []string{"parent-chart.test"}, + []string{"0.2.0"}, + }, + } + + for _, tc := range tests { + c := loadChart(t, "testdata/dependent-chart-with-same-name-different-version") + t.Run(tc.name, func(t *testing.T) { + if err := processDependencyEnabled(c, tc.v, ""); err != nil { + t.Fatalf("error processing enabled dependencies %v", err) + } + if len(c.Dependencies()) != len(tc.charts) { + t.Fatalf("slice lengths do not match got %v, expected %v", len(c.Dependencies()), len(tc.charts)) + } + for i, d := range c.Dependencies() { + if d.Metadata.Version != tc.versions[i] { + t.Fatalf("slice values do not match got %v, expected %v", tc.versions[i], d.Metadata.Version) + } + } + }) + } +} diff --git a/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.lock b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.lock new file mode 100644 index 000000000..b2f17fb39 --- /dev/null +++ b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.lock @@ -0,0 +1,9 @@ +dependencies: +- name: dev + repository: file://envs/dev + version: v0.1.0 +- name: prod + repository: file://envs/prod + version: v0.1.0 +digest: sha256:9403fc24f6cf9d6055820126cf7633b4bd1fed3c77e4880c674059f536346182 +generated: "2020-02-03T10:38:51.180474+01:00" diff --git a/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.yaml b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.yaml new file mode 100644 index 000000000..1db9388db --- /dev/null +++ b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +name: parent-chart +version: 0.1.0 +appVersion: v0.1.0 +dependencies: + - name: test + version: "0.1.0" + condition: one.enabled + + - name: test + version: "0.2.0" + condition: two.enabled \ No newline at end of file diff --git a/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/charts/test-0.1.0.tgz b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/charts/test-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6ee51c1c7b87f35efbdba339181a567495722832 GIT binary patch literal 337 zcmV-X0j~ZZiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PK~)YQr!LhI7tS2zG8Kr%uOm?E|a~y1Ph3XGm=$E1}!dkG6DW zxr|Y|G4OX0`u{@|&@U?|yo4mSbExV1BX2+$Fp^E{(APz^&Im* zQa^CI*#Y=2{|j7B^KXsG`Tq^>U@f78(*{5!VXw3H@E#n4|1`3Q>$v%1&7y>^gGIh|Sn8Z@MqdX}>Suyg*IWA9o@4OADI_7}PSl$B)5x>|2G>U#H1 j>VjXhwCt6(+`wbLM43z`^K(7|009607lsgu01N;CcDc zVQyr3R8em|NM&qo0PK~)YQr!LhI7tS2zG9!q;AG??E|a~y1Ph3XGm=$E1}!dkG6DW zxr|Y=G4OZ!(XT@k&@U@Ty_%8oTtf%=mrAhh!4enqgzJv1yKp2VL l_MOyvw_$17Debs{$8?DjiA3V(d;|ah|No3wW##}30079so|gas literal 0 HcmV?d00001 diff --git a/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/templates/autoscaler.yaml b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/templates/autoscaler.yaml new file mode 100644 index 000000000..976e5a8f1 --- /dev/null +++ b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/templates/autoscaler.yaml @@ -0,0 +1,16 @@ +################################################################################################### +# parent-chart horizontal pod autoscaler +################################################################################################### +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ .Release.Name }}-autoscaler + namespace: {{ .Release.Namespace }} +spec: + scaleTargetRef: + apiVersion: apps/v1beta1 + kind: Deployment + name: {{ .Release.Name }} + minReplicas: {{ required "A valid .Values.resources.autoscaler.minReplicas entry required!" .Values.resources.autoscaler.minReplicas }} + maxReplicas: {{ required "A valid .Values.resources.autoscaler.maxReplicas entry required!" .Values.resources.autoscaler.maxReplicas }} + targetCPUUtilizationPercentage: {{ required "A valid .Values.resources.autoscaler.targetCPUUtilizationPercentage!" .Values.resources.autoscaler.targetCPUUtilizationPercentage }} \ No newline at end of file diff --git a/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/values.yaml b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/values.yaml new file mode 100644 index 000000000..3424c6547 --- /dev/null +++ b/pkg/chartutil/testdata/dependent-chart-with-same-name-different-version/values.yaml @@ -0,0 +1,11 @@ +# Default values for parent-chart. +nameOverride: parent-chart +one: + enabled: false +two: + enabled: true +resources: + autoscaler: + minReplicas: 0 + maxReplicas: 0 + targetCPUUtilizationPercentage: 99 \ No newline at end of file