From 10964adc104c16c2eddfca481a4d9a61380ab2ae Mon Sep 17 00:00:00 2001 From: Michal Cwienczek Date: Fri, 29 Sep 2017 22:14:41 +0200 Subject: [PATCH] Closes #2937 Added required dependency to run make test in developer's guide --- docs/developers.md | 1 + pkg/downloader/chart_downloader.go | 44 ++++++++++++++++++++++++++++-- pkg/repo/chartrepo.go | 7 ++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/docs/developers.md b/docs/developers.md index e0aeb374a..3ccf1232e 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -7,6 +7,7 @@ Helm and Tiller. - Go 1.6.0 or later - Glide 0.12.0 or later +- Gometalinter - kubectl 1.2 or later - A Kubernetes cluster (optional) - The gRPC toolchain diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 15e97f6a1..659a655e1 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -86,9 +86,21 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven return "", nil, err } - data, err := g.Get(u.String()) + chartURL := u.String() + + data, err := g.Get(chartURL) if err != nil { - return "", nil, err + originalError := err + + chartURL, err = fixupURL(chartURL) + if err != nil { + return "", nil, originalError + } + fmt.Println(chartURL) + data, err = g.Get(chartURL) + if err != nil { + return "", nil, originalError + } } name := filepath.Base(u.Path) @@ -125,6 +137,34 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven return destfile, ver, nil } +// https://github.com/kubernetes/helm/issues/2937 +// tries to fix URL because of BUG #2937 +// transforms URL from +// https://url.to.repo/path?key=value/chart-0.1.0.tgz +// into +// https://url.to.repo/path/chart-0-1-0.tgz?key=value +func fixupURL(chartURL string) (string, error) { + queryStringStartIndex := strings.Index(chartURL, "?") + + if queryStringStartIndex == -1 { + return "", errors.New("Could not fixup URL") + } + var appendedURLIndex int + for i := queryStringStartIndex + 1; i < len(chartURL); i++ { + if chartURL[i] == '/' { + appendedURLIndex = i + break + } + } + + appendedURL := chartURL[appendedURLIndex:] + restURL := chartURL[0:appendedURLIndex] + + uu, _ := url.Parse(restURL) + uu.Path = strings.TrimSuffix(uu.Path, "/") + appendedURL + return uu.String(), nil +} + // ResolveChartVersion resolves a chart reference to a URL. // // It returns the URL as well as a preconfigured repo.Getter that can fetch diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index 97506e607..e7283dc10 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -110,8 +110,13 @@ func (r *ChartRepository) Load() error { // is for pre-2.2.0 repo files. func (r *ChartRepository) DownloadIndexFile(cachePath string) error { var indexURL string + parsedURL, err := url.Parse(r.Config.URL) + if err != nil { + return err + } + parsedURL.Path = strings.TrimSuffix(parsedURL.Path, "/") + "/index.yaml" - indexURL = strings.TrimSuffix(r.Config.URL, "/") + "/index.yaml" + indexURL = parsedURL.String() resp, err := r.Client.Get(indexURL) if err != nil { return err