optimize OCI chart version check (#1052)

* optimize OCI chart version check

Signed-off-by: yxxhero <aiopsclub@163.com>

* fix tests

Signed-off-by: yxxhero <aiopsclub@163.com>

---------

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero 2023-10-07 02:16:41 -05:00 committed by GitHub
parent 212c39cb53
commit 904f303a34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 6 deletions

View File

@ -3467,7 +3467,10 @@ func (st *HelmState) Reverse() {
}
func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helmexec.Interface) (*string, error) {
qualifiedChartName, chartName, chartVersion := st.getOCIQualifiedChartName(release)
qualifiedChartName, chartName, chartVersion, err := st.getOCIQualifiedChartName(release, helm)
if err != nil {
return nil, err
}
if qualifiedChartName == "" {
return nil, nil
@ -3533,7 +3536,7 @@ func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helm
return &chartPath, nil
}
func (st *HelmState) getOCIQualifiedChartName(release *ReleaseSpec) (qualifiedChartName, chartName, chartVersion string) {
func (st *HelmState) getOCIQualifiedChartName(release *ReleaseSpec, helm helmexec.Interface) (qualifiedChartName, chartName, chartVersion string, err error) {
chartVersion = "latest"
if release.Version != "" {
chartVersion = release.Version
@ -3554,6 +3557,9 @@ func (st *HelmState) getOCIQualifiedChartName(release *ReleaseSpec) (qualifiedCh
}
qualifiedChartName = fmt.Sprintf("%s/%s:%s", repo.URL, chartName, chartVersion)
}
if chartVersion == "latest" && helm.IsVersionAtLeast("3.8.0") {
return "", "", "", fmt.Errorf("the version for OCI charts should be semver compliant, the latest tag is not supported anymore for helm >= 3.8.0")
}
return
}

View File

@ -17,6 +17,7 @@ import (
"github.com/helmfile/helmfile/pkg/filesystem"
"github.com/helmfile/helmfile/pkg/helmexec"
"github.com/helmfile/helmfile/pkg/testhelper"
"github.com/helmfile/helmfile/pkg/testutil"
)
var logger = helmexec.NewLogger(io.Discard, "warn")
@ -3140,6 +3141,8 @@ func TestGetOCIQualifiedChartName(t *testing.T) {
chartName string
chartVersion string
}
helmVersion string
wantErr bool
}{
{
state: HelmState{
@ -3153,6 +3156,7 @@ func TestGetOCIQualifiedChartName(t *testing.T) {
},
},
},
helmVersion: "3.13.0",
expected: []struct {
qualifiedChartName string
chartName string
@ -3161,6 +3165,35 @@ func TestGetOCIQualifiedChartName(t *testing.T) {
{"registry/chart-path/chart-name:0.1.2", "chart-name", "0.1.2"},
},
},
{
state: HelmState{
ReleaseSetSpec: ReleaseSetSpec{
Repositories: []RepositorySpec{},
Releases: []ReleaseSpec{
{
Chart: "oci://registry/chart-path/chart-name",
Version: "latest",
},
},
},
},
helmVersion: "3.13.0",
wantErr: true,
},
{
state: HelmState{
ReleaseSetSpec: ReleaseSetSpec{
Repositories: []RepositorySpec{},
Releases: []ReleaseSpec{
{
Chart: "oci://registry/chart-path/chart-name",
Version: "latest",
},
},
},
},
helmVersion: "3.7.0",
},
{
state: HelmState{
ReleaseSetSpec: ReleaseSetSpec{
@ -3179,6 +3212,7 @@ func TestGetOCIQualifiedChartName(t *testing.T) {
},
},
},
helmVersion: "3.13.0",
expected: []struct {
qualifiedChartName string
chartName string
@ -3191,11 +3225,19 @@ func TestGetOCIQualifiedChartName(t *testing.T) {
for _, tt := range tests {
t.Run(fmt.Sprintf("%+v", tt.expected), func(t *testing.T) {
helm := testutil.NewVersionHelmExec(tt.helmVersion)
for i, r := range tt.state.Releases {
qualifiedChartName, chartName, chartVersion := tt.state.getOCIQualifiedChartName(&r)
require.Equalf(t, qualifiedChartName, tt.expected[i].qualifiedChartName, "qualifiedChartName got = %v, want %v", qualifiedChartName, tt.expected[i].qualifiedChartName)
require.Equalf(t, chartName, tt.expected[i].chartName, "chartName got = %v, want %v", chartName, tt.expected[i].chartName)
require.Equalf(t, chartVersion, tt.expected[i].chartVersion, "chartVersion got = %v, want %v", chartVersion, tt.expected[i].chartVersion)
qualifiedChartName, chartName, chartVersion, err := tt.state.getOCIQualifiedChartName(&r, helm)
if tt.wantErr {
require.Error(t, err, "getOCIQualifiedChartName() error = nil, want error")
return
}
require.NoError(t, err, "getOCIQualifiedChartName() error = %v, want nil", err)
if len(tt.expected) > 0 {
require.Equalf(t, qualifiedChartName, tt.expected[i].qualifiedChartName, "qualifiedChartName got = %v, want %v", qualifiedChartName, tt.expected[i].qualifiedChartName)
require.Equalf(t, chartName, tt.expected[i].chartName, "chartName got = %v, want %v", chartName, tt.expected[i].chartName)
require.Equalf(t, chartVersion, tt.expected[i].chartVersion, "chartVersion got = %v, want %v", chartVersion, tt.expected[i].chartVersion)
}
}
})
}