Skip to content

Commit 50f7d01

Browse files
author
Miguel Martínez Triviño
authored
feat: Remove dependency references (#148)
* feat: Remove dependency references Signed-off-by: Miguel Martinez Trivino <[email protected]>
1 parent 5fbdfb0 commit 50f7d01

File tree

9 files changed

+126
-1
lines changed

9 files changed

+126
-1
lines changed

internal/testdata/applyoutput/3-levels-chart/Chart.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
apiVersion: v2
22
appVersion: 1.16.0
3+
dependencies:
4+
- name: subchart-1
5+
repository: ""
6+
version: 0.1.0
7+
- name: subchart-2
8+
repository: ""
9+
version: 0.1.0
310
description: A Helm chart for Kubernetes
411
name: 3-levels-chart
512
type: application
Binary file not shown.
Binary file not shown.

pkg/mover/chart.go

+24
Original file line numberDiff line numberDiff line change
@@ -642,9 +642,33 @@ func modifyChart(originalChart *chart.Chart, actions []*internal.RewriteAction,
642642
}
643643
}
644644

645+
// Remove dependencies references. The chart will still work because it has the dependencies vendored in charts/
646+
// This just prevents users from overriding the relocation overrides applied by this tool
647+
if err := stripDependencyRefs(modifiedChart); err != nil {
648+
return err
649+
}
650+
645651
return saveChart(modifiedChart, toChartFilename)
646652
}
647653

654+
// Remove dependency references in the Helm Chart so helm dep update is not available once the chart has been relocated
655+
// See https://github.com/vmware-tanzu/asset-relocation-tool-for-kubernetes/issues/142#issue-1124233145
656+
// Removes recursively the Chart.lock file and the dependencies reference inside Chart.yaml
657+
func stripDependencyRefs(c *chart.Chart) error {
658+
// By setting this to nil, chart.Save will re-save the Chart.yaml and ignore the lock
659+
c.Metadata.Dependencies = nil
660+
c.Lock = nil
661+
662+
// Apply to sub-charts too
663+
for _, dep := range c.Dependencies() {
664+
if err := stripDependencyRefs(dep); err != nil {
665+
return err
666+
}
667+
}
668+
669+
return nil
670+
}
671+
648672
func saveChart(chart *chart.Chart, toChartFilename string) error {
649673
cwd, _ := os.Getwd()
650674
tempDir, err := ioutil.TempDir(cwd, "relok8s-*")

pkg/mover/chart_test.go

+72
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"sort"
1313
"testing"
1414

15+
"helm.sh/helm/v3/pkg/chartutil"
16+
1517
"helm.sh/helm/v3/pkg/chart"
1618

1719
"github.com/google/go-containerregistry/pkg/name"
@@ -736,3 +738,73 @@ func TestGroupChangesByChart(t *testing.T) {
736738
t.Errorf("got=%v; want=%v", got, want)
737739
}
738740
}
741+
742+
// Check that a relocated Helm Chart does not contain information about their dependencies
743+
func TestStripDependencyRefs(t *testing.T) {
744+
testChart, err := loader.Load(filepath.Join(fixturesRoot, "3-levels-chart"))
745+
if err != nil {
746+
t.Fatal(err)
747+
}
748+
749+
if got, want := len(testChart.Metadata.Dependencies), 2; got != want {
750+
t.Errorf("invalid number of dependencies, got=%d, want=%d", got, want)
751+
}
752+
753+
if testChart.Lock == nil {
754+
t.Error("Chart.lock file expected ")
755+
}
756+
757+
firstLevelDeps := testChart.Dependencies()
758+
// Sort dependencies since they come in arbitrary order
759+
sortCharts(firstLevelDeps)
760+
761+
// Subchart1
762+
if got, want := len(firstLevelDeps[0].Metadata.Dependencies), 1; got != want {
763+
t.Errorf("invalid number of dependencies, got=%d, want=%d", got, want)
764+
}
765+
766+
if firstLevelDeps[0].Lock == nil {
767+
t.Error("Chart.lock file expected ")
768+
}
769+
770+
// Strip dependencies and re-package chart
771+
if err := stripDependencyRefs(testChart); err != nil {
772+
t.Fatal(err)
773+
}
774+
775+
tmpDir, err := os.MkdirTemp("", "external-tests-*")
776+
if err != nil {
777+
t.Fatal(err)
778+
}
779+
780+
// Repackage chart
781+
filename, err := chartutil.Save(testChart, tmpDir)
782+
if err != nil {
783+
t.Fatal(err)
784+
}
785+
786+
// Load from re-packaged version
787+
modifiedChart, err := loader.Load(filename)
788+
if err != nil {
789+
t.Fatal(err)
790+
}
791+
792+
firstLevelDeps = modifiedChart.Dependencies()
793+
sortCharts(firstLevelDeps)
794+
795+
for _, c := range []*chart.Chart{modifiedChart, firstLevelDeps[0]} {
796+
if got := len(c.Metadata.Dependencies); got != 0 {
797+
t.Errorf("expected no dependencies got=%d", got)
798+
}
799+
800+
if c.Lock != nil {
801+
t.Error("Chart.lock file unexpected ")
802+
}
803+
}
804+
}
805+
806+
func sortCharts(charts []*chart.Chart) {
807+
sort.Slice(charts, func(i, j int) bool {
808+
return charts[i].Name() < charts[j].Name()
809+
})
810+
}
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
dependencies:
2+
- name: subchart-1
3+
repository: ""
4+
version: 0.1.0
5+
- name: subchart-2
6+
repository: ""
7+
version: 0.1.0
8+
digest: sha256:a7493ea91a9ff512f9eb05db01b79fddaf56214ecf45c049d0d18f57363e93ef
9+
generated: "2022-02-17T16:27:12.34928543+01:00"

test/fixtures/3-levels-chart/Chart.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
apiVersion: v2
22
name: 3-levels-chart
33
description: A Helm chart for Kubernetes
4+
dependencies:
5+
- name: subchart-1
6+
version: 0.1.0
7+
- name: subchart-2
8+
version: 0.1.0
49

510
# A chart can be either an 'application' or a 'library' chart.
611
#
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dependencies:
2+
- name: subchart-3
3+
repository: ""
4+
version: 0.1.0
5+
digest: sha256:c8e962b6fdb2bc5929dcfbb964f24826400c00529754d0c6848bd6ad66ff960f
6+
generated: "2022-02-17T16:28:44.347503267+01:00"

test/fixtures/3-levels-chart/charts/subchart-1/Chart.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
apiVersion: v2
22
name: subchart-1
33
description: A Helm chart for Kubernetes
4-
4+
dependencies:
5+
- name: subchart-3
6+
version: 0.1.0
57
# A chart can be either an 'application' or a 'library' chart.
68
#
79
# Application charts are a collection of templates that can be packaged into versioned archives

0 commit comments

Comments
 (0)