From 8775f632f246ff3c7746c3cc3f71d51a06101e93 Mon Sep 17 00:00:00 2001 From: Christian Jauvin Date: Wed, 25 Oct 2017 18:36:55 -0400 Subject: [PATCH] Fix for relative chart path support in index.yaml --- pkg/downloader/chart_downloader.go | 11 +++++--- pkg/downloader/chart_downloader_test.go | 4 +++ .../cache/testing-relative-index.yaml | 28 +++++++++++++++++++ ...testing-relative-trailing-slash-index.yaml | 28 +++++++++++++++++++ .../helmhome/repository/repositories.yaml | 6 +++- 5 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml create mode 100644 pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index a8a1b5a57..f0fd5073c 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -217,12 +217,15 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, ge // If the URL is relative (no scheme), prepend the chart repo's base URL if !u.IsAbs() { - path := u.Path - u, err = url.Parse(rc.URL) + repoURL, err := url.Parse(rc.URL) if err != nil { - return u, r.Client, err + return repoURL, r.Client, err } - u.Path = u.Path + path + q := repoURL.Query() + // We need a trailing slash for ResolveReference to work, but make sure there isn't already one + repoURL.Path = strings.TrimSuffix(repoURL.Path, "/") + "/" + u = repoURL.ResolveReference(u) + u.RawQuery = q.Encode() return u, r.Client, err } diff --git a/pkg/downloader/chart_downloader_test.go b/pkg/downloader/chart_downloader_test.go index 73f9191c9..0100772e9 100644 --- a/pkg/downloader/chart_downloader_test.go +++ b/pkg/downloader/chart_downloader_test.go @@ -44,6 +44,10 @@ func TestResolveChartRef(t *testing.T) { {name: "reference, version, testing repo", ref: "testing/alpine", version: "0.2.0", expect: "http://example.com/alpine-0.2.0.tgz"}, {name: "reference, version, malformed repo", ref: "malformed/alpine", version: "1.2.3", expect: "http://dl.example.com/alpine-1.2.3.tgz"}, {name: "reference, querystring repo", ref: "testing-querystring/alpine", expect: "http://example.com/alpine-1.2.3.tgz?key=value"}, + {name: "reference, testing-relative repo", ref: "testing-relative/foo", expect: "http://example.com/helm/charts/foo-1.2.3.tgz"}, + {name: "reference, testing-relative repo", ref: "testing-relative/bar", expect: "http://example.com/helm/bar-1.2.3.tgz"}, + {name: "reference, testing-relative-trailing-slash repo", ref: "testing-relative-trailing-slash/foo", expect: "http://example.com/helm/charts/foo-1.2.3.tgz"}, + {name: "reference, testing-relative-trailing-slash repo", ref: "testing-relative-trailing-slash/bar", expect: "http://example.com/helm/bar-1.2.3.tgz"}, {name: "full URL, HTTPS, irrelevant version", ref: "https://example.com/foo-1.2.3.tgz", version: "0.1.0", expect: "https://example.com/foo-1.2.3.tgz", fail: true}, {name: "full URL, file", ref: "file:///foo-1.2.3.tgz", fail: true}, {name: "invalid", ref: "invalid-1.2.3", fail: true}, diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml new file mode 100644 index 000000000..210f92e45 --- /dev/null +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +entries: + foo: + - name: foo + description: Foo Chart With Relative Path + engine: gotpl + home: https://k8s.io/helm + keywords: [] + maintainers: [] + sources: + - https://github.com/kubernetes/charts + urls: + - charts/foo-1.2.3.tgz + version: 1.2.3 + checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d + bar: + - name: bar + description: Bar Chart With Relative Path + engine: gotpl + home: https://k8s.io/helm + keywords: [] + maintainers: [] + sources: + - https://github.com/kubernetes/charts + urls: + - bar-1.2.3.tgz + version: 1.2.3 + checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml new file mode 100644 index 000000000..210f92e45 --- /dev/null +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +entries: + foo: + - name: foo + description: Foo Chart With Relative Path + engine: gotpl + home: https://k8s.io/helm + keywords: [] + maintainers: [] + sources: + - https://github.com/kubernetes/charts + urls: + - charts/foo-1.2.3.tgz + version: 1.2.3 + checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d + bar: + - name: bar + description: Bar Chart With Relative Path + engine: gotpl + home: https://k8s.io/helm + keywords: [] + maintainers: [] + sources: + - https://github.com/kubernetes/charts + urls: + - bar-1.2.3.tgz + version: 1.2.3 + checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d diff --git a/pkg/downloader/testdata/helmhome/repository/repositories.yaml b/pkg/downloader/testdata/helmhome/repository/repositories.yaml index 68efb461a..374d95c8a 100644 --- a/pkg/downloader/testdata/helmhome/repository/repositories.yaml +++ b/pkg/downloader/testdata/helmhome/repository/repositories.yaml @@ -11,4 +11,8 @@ repositories: - name: malformed url: "http://dl.example.com" - name: testing-querystring - url: "http://example.com?key=value" \ No newline at end of file + url: "http://example.com?key=value" + - name: testing-relative + url: "http://example.com/helm" + - name: testing-relative-trailing-slash + url: "http://example.com/helm/" \ No newline at end of file