diff --git a/pkg/cmd/create.go b/pkg/cmd/create.go index c3c2e3c2d..263466c9f 100644 --- a/pkg/cmd/create.go +++ b/pkg/cmd/create.go @@ -60,6 +60,9 @@ type createOptions struct { chartAPIVersion string // --chart-api-version } +// ChartV3 is the feature gate for chart API version v3. +const chartV3 gates.Gate = "HELM_EXPERIMENTAL_CHART_V3" + func newCreateCmd(out io.Writer) *cobra.Command { o := &createOptions{} @@ -97,8 +100,8 @@ func (o *createOptions) run(out io.Writer) error { case chart.APIVersionV2, "": return o.createV2Chart(out) case chartv3.APIVersionV3: - if !gates.ChartV3.IsEnabled() { - return gates.ChartV3.Error() + if !chartV3.IsEnabled() { + return chartV3.Error() } return o.createV3Chart(out) default: diff --git a/pkg/cmd/create_test.go b/pkg/cmd/create_test.go index 554d5f1af..3ecbb5387 100644 --- a/pkg/cmd/create_test.go +++ b/pkg/cmd/create_test.go @@ -23,13 +23,12 @@ import ( "testing" chartv3 "helm.sh/helm/v4/internal/chart/v3" - loaderv3 "helm.sh/helm/v4/internal/chart/v3/loader" chartutilv3 "helm.sh/helm/v4/internal/chart/v3/util" "helm.sh/helm/v4/internal/test/ensure" - chart "helm.sh/helm/v4/pkg/chart/v2" - "helm.sh/helm/v4/pkg/chart/v2/loader" + chart "helm.sh/helm/v4/pkg/chart" + chartloader "helm.sh/helm/v4/pkg/chart/loader" + chartv2 "helm.sh/helm/v4/pkg/chart/v2" chartutil "helm.sh/helm/v4/pkg/chart/v2/util" - "helm.sh/helm/v4/pkg/gates" "helm.sh/helm/v4/pkg/helmpath" ) @@ -50,16 +49,26 @@ func TestCreateCmd(t *testing.T) { t.Fatalf("chart is not directory") } - c, err := loader.LoadDir(cname) + c, err := chartloader.LoadDir(cname) if err != nil { t.Fatal(err) } - if c.Name() != cname { - t.Errorf("Expected %q name, got %q", cname, c.Name()) + acc, err := chart.NewAccessor(c) + if err != nil { + t.Fatal(err) + } + + if acc.Name() != cname { + t.Errorf("Expected %q name, got %q", cname, acc.Name()) } - if c.Metadata.APIVersion != chart.APIVersionV2 { - t.Errorf("Wrong API version: %q", c.Metadata.APIVersion) + metadata := acc.MetadataAsMap() + apiVersion, ok := metadata["APIVersion"].(string) + if !ok { + t.Fatal("APIVersion not found in metadata") + } + if apiVersion != chartv2.APIVersionV2 { + t.Errorf("Wrong API version: %q", apiVersion) } } @@ -74,13 +83,13 @@ func TestCreateStarterCmd(t *testing.T) { name: "v2 with relative starter path", chartAPIVersion: "", useAbsolutePath: false, - expectedVersion: chart.APIVersionV2, + expectedVersion: chartv2.APIVersionV2, }, { name: "v2 with absolute starter path", chartAPIVersion: "", useAbsolutePath: true, - expectedVersion: chart.APIVersionV2, + expectedVersion: chartv2.APIVersionV2, }, { name: "v3 with relative starter path", @@ -98,7 +107,7 @@ func TestCreateStarterCmd(t *testing.T) { // Enable feature gate for v3 charts if tt.chartAPIVersion == "v3" { - t.Setenv(string(gates.ChartV3), "1") + t.Setenv(string(chartV3), "1") } cname := "testchart" @@ -129,8 +138,10 @@ func TestCreateStarterCmd(t *testing.T) { starterArg = filepath.Join(starterchart, "starterchart") } cmd := fmt.Sprintf("create --starter=%s", starterArg) - if tt.chartAPIVersion != "" { - cmd += fmt.Sprintf(" --chart-api-version=%s", tt.chartAPIVersion) + if tt.chartAPIVersion == "v3" { + cmd += fmt.Sprintf(" --chart-api-version=%s", chartv3.APIVersionV3) + } else { + cmd += fmt.Sprintf(" --chart-api-version=%s", chartv2.APIVersionV2) } cmd += " " + cname @@ -147,28 +158,25 @@ func TestCreateStarterCmd(t *testing.T) { } // Load and verify the chart - var chartName, apiVersion string + c, err := chartloader.LoadDir(cname) + if err != nil { + t.Fatal(err) + } + + acc, err := chart.NewAccessor(c) + if err != nil { + t.Fatal(err) + } + + chartName := acc.Name() + metadata := acc.MetadataAsMap() + apiVersion, ok := metadata["APIVersion"].(string) + if !ok { + t.Fatal("APIVersion not found in metadata") + } var templates []string - if tt.chartAPIVersion == "v3" { - c, err := loaderv3.LoadDir(cname) - if err != nil { - t.Fatal(err) - } - chartName = c.Name() - apiVersion = c.Metadata.APIVersion - for _, tpl := range c.Templates { - templates = append(templates, tpl.Name) - } - } else { - c, err := loader.LoadDir(cname) - if err != nil { - t.Fatal(err) - } - chartName = c.Name() - apiVersion = c.Metadata.APIVersion - for _, tpl := range c.Templates { - templates = append(templates, tpl.Name) - } + for _, tpl := range acc.Templates() { + templates = append(templates, tpl.Name) } if chartName != cname { @@ -215,23 +223,33 @@ func TestCreateCmdChartAPIVersionV2(t *testing.T) { t.Fatalf("chart is not directory") } - c, err := loader.LoadDir(cname) + c, err := chartloader.LoadDir(cname) if err != nil { t.Fatal(err) } - if c.Name() != cname { - t.Errorf("Expected %q name, got %q", cname, c.Name()) + acc, err := chart.NewAccessor(c) + if err != nil { + t.Fatal(err) } - if c.Metadata.APIVersion != chart.APIVersionV2 { - t.Errorf("Wrong API version: expected %q, got %q", chart.APIVersionV2, c.Metadata.APIVersion) + + if acc.Name() != cname { + t.Errorf("Expected %q name, got %q", cname, acc.Name()) + } + metadata := acc.MetadataAsMap() + apiVersion, ok := metadata["APIVersion"].(string) + if !ok { + t.Fatal("APIVersion not found in metadata") + } + if apiVersion != chartv2.APIVersionV2 { + t.Errorf("Wrong API version: expected %q, got %q", chartv2.APIVersionV2, apiVersion) } } func TestCreateCmdChartAPIVersionV3(t *testing.T) { t.Chdir(t.TempDir()) ensure.HelmHome(t) - t.Setenv(string(gates.ChartV3), "1") + t.Setenv(string(chartV3), "1") cname := "testchart" // Run a create with v3 @@ -246,16 +264,26 @@ func TestCreateCmdChartAPIVersionV3(t *testing.T) { t.Fatalf("chart is not directory") } - c, err := loaderv3.LoadDir(cname) + c, err := chartloader.LoadDir(cname) if err != nil { t.Fatal(err) } - if c.Name() != cname { - t.Errorf("Expected %q name, got %q", cname, c.Name()) + acc, err := chart.NewAccessor(c) + if err != nil { + t.Fatal(err) + } + + if acc.Name() != cname { + t.Errorf("Expected %q name, got %q", cname, acc.Name()) + } + metadata := acc.MetadataAsMap() + apiVersion, ok := metadata["APIVersion"].(string) + if !ok { + t.Fatal("APIVersion not found in metadata") } - if c.Metadata.APIVersion != chartv3.APIVersionV3 { - t.Errorf("Wrong API version: expected %q, got %q", chartv3.APIVersionV3, c.Metadata.APIVersion) + if apiVersion != chartv3.APIVersionV3 { + t.Errorf("Wrong API version: expected %q, got %q", chartv3.APIVersionV3, apiVersion) } } diff --git a/pkg/gates/gates.go b/pkg/gates/gates.go index a6787c789..69559219e 100644 --- a/pkg/gates/gates.go +++ b/pkg/gates/gates.go @@ -36,6 +36,3 @@ func (g Gate) IsEnabled() bool { func (g Gate) Error() error { return fmt.Errorf("this feature has been marked as experimental and is not enabled by default. Please set %s=1 in your environment to use this feature", g.String()) } - -// ChartV3 is the feature gate for chart API version v3. -const ChartV3 Gate = "HELM_EXPERIMENTAL_CHART_V3"