From 6cbc12f9bb4d1059f1dd439ebbc29dafe7190da1 Mon Sep 17 00:00:00 2001 From: qiaozp <47812250+chivalryq@users.noreply.github.com> Date: Sat, 2 Sep 2023 21:00:41 +0800 Subject: [PATCH] Fix: addon dependency package retrieving is not compatible to v-prefixed version (#6316) --- pkg/addon/versioned_registry.go | 5 ++-- pkg/addon/versioned_registry_test.go | 37 ++++++++++++++++++++++------ pkg/utils/strings.go | 5 ++++ pkg/utils/strings_test.go | 5 ++++ 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/pkg/addon/versioned_registry.go b/pkg/addon/versioned_registry.go index 0d50ae89f..9be34b8ae 100644 --- a/pkg/addon/versioned_registry.go +++ b/pkg/addon/versioned_registry.go @@ -161,7 +161,7 @@ func (i versionedRegistry) loadAddon(ctx context.Context, name, version string) sort.Sort(sort.Reverse(versions)) addonVersion, availableVersions := chooseVersion(version, versions) if addonVersion == nil { - return nil, errors.Errorf("specified version %s not exist", utils.Sanitize(version)) + return nil, errors.Errorf("specified version %s for addon %s not exist", utils.Sanitize(version), name) } for _, chartURL := range addonVersion.URLs { if !utils.IsValidURL(chartURL) { @@ -231,6 +231,7 @@ func loadAddonPackage(addonName string, files []*loader.BufferedFile) (*WholeAdd } // chooseVersion will return the target version and all available versions +// This function is not sensitive to v-prefix, which means if specifiedVersion=0.3.0, v0.3.0 can be chosen. func chooseVersion(specifiedVersion string, versions []*repo.ChartVersion) (*repo.ChartVersion, []string) { var addonVersion *repo.ChartVersion var availableVersions []string @@ -241,7 +242,7 @@ func chooseVersion(specifiedVersion string, versions []*repo.ChartVersion) (*rep continue } if len(specifiedVersion) != 0 { - if v.Version == specifiedVersion { + if utils.IgnoreVPrefix(v.Version) == utils.IgnoreVPrefix(specifiedVersion) { addonVersion = versions[i] } } else { diff --git a/pkg/addon/versioned_registry_test.go b/pkg/addon/versioned_registry_test.go index 6e3e0225b..34abd3147 100644 --- a/pkg/addon/versioned_registry_test.go +++ b/pkg/addon/versioned_registry_test.go @@ -51,13 +51,36 @@ func TestChooseAddonVersion(t *testing.T) { }, }, } - targetVersion, availableVersion := chooseVersion("v1.2.0", versions) - assert.Equal(t, availableVersion, []string{"v1.4.0-beta1", "v1.3.6", "v1.2.0"}) - assert.Equal(t, targetVersion.Version, "v1.2.0") - - targetVersion, availableVersion = chooseVersion("", versions) - assert.Equal(t, availableVersion, []string{"v1.4.0-beta1", "v1.3.6", "v1.2.0"}) - assert.Equal(t, targetVersion.Version, "v1.3.6") + avs := []string{"v1.4.0-beta1", "v1.3.6", "v1.2.0"} + for _, tc := range []struct { + name string + specifiedVersion string + wantVersion string + wantAVersions []string + }{ + { + name: "choose specified", + specifiedVersion: "v1.2.0", + wantVersion: "v1.2.0", + wantAVersions: avs, + }, + { + name: "choose specified, ignore v prefix", + specifiedVersion: "1.2.0", + wantVersion: "v1.2.0", + wantAVersions: avs, + }, + { + name: "not specifying version, choose non-prerelease && highest version", + specifiedVersion: "", + wantVersion: "v1.3.6", + wantAVersions: avs, + }, + } { + targetVersion, availableVersion := chooseVersion(tc.specifiedVersion, versions) + assert.Equal(t, availableVersion, tc.wantAVersions) + assert.Equal(t, targetVersion.Version, tc.wantVersion) + } } var versionedHandler http.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) { diff --git a/pkg/utils/strings.go b/pkg/utils/strings.go index add614a65..ff4fa96bf 100644 --- a/pkg/utils/strings.go +++ b/pkg/utils/strings.go @@ -80,3 +80,8 @@ func Sanitize(s string) string { s = strings.ReplaceAll(s, "\r", "") return s } + +// IgnoreVPrefix removes the leading "v" from a string +func IgnoreVPrefix(s string) string { + return strings.TrimPrefix(s, "v") +} diff --git a/pkg/utils/strings_test.go b/pkg/utils/strings_test.go index 1cfa5c032..7b181568a 100644 --- a/pkg/utils/strings_test.go +++ b/pkg/utils/strings_test.go @@ -26,3 +26,8 @@ func TestSanitize(t *testing.T) { s := "abc\ndef\rgh" require.Equal(t, "abcdefgh", Sanitize(s)) } + +func TestIgnoreVPrefix(t *testing.T) { + require.Equal(t, "1.2.0", IgnoreVPrefix("v1.2.0")) + require.Equal(t, "1.2.0", IgnoreVPrefix("1.2.0")) +}