make chartv3 private and use loader to load the chart

Signed-off-by: Evans Mungai <mbuevans@gmail.com>
pull/31592/head
Evans Mungai 10 months ago
parent bb26682b6e
commit 1676abc742
No known key found for this signature in database
GPG Key ID: BBEB812143DD14E1

@ -60,6 +60,9 @@ type createOptions struct {
chartAPIVersion string // --chart-api-version 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 { func newCreateCmd(out io.Writer) *cobra.Command {
o := &createOptions{} o := &createOptions{}
@ -97,8 +100,8 @@ func (o *createOptions) run(out io.Writer) error {
case chart.APIVersionV2, "": case chart.APIVersionV2, "":
return o.createV2Chart(out) return o.createV2Chart(out)
case chartv3.APIVersionV3: case chartv3.APIVersionV3:
if !gates.ChartV3.IsEnabled() { if !chartV3.IsEnabled() {
return gates.ChartV3.Error() return chartV3.Error()
} }
return o.createV3Chart(out) return o.createV3Chart(out)
default: default:

@ -23,13 +23,12 @@ import (
"testing" "testing"
chartv3 "helm.sh/helm/v4/internal/chart/v3" 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" chartutilv3 "helm.sh/helm/v4/internal/chart/v3/util"
"helm.sh/helm/v4/internal/test/ensure" "helm.sh/helm/v4/internal/test/ensure"
chart "helm.sh/helm/v4/pkg/chart/v2" chart "helm.sh/helm/v4/pkg/chart"
"helm.sh/helm/v4/pkg/chart/v2/loader" 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" chartutil "helm.sh/helm/v4/pkg/chart/v2/util"
"helm.sh/helm/v4/pkg/gates"
"helm.sh/helm/v4/pkg/helmpath" "helm.sh/helm/v4/pkg/helmpath"
) )
@ -50,16 +49,26 @@ func TestCreateCmd(t *testing.T) {
t.Fatalf("chart is not directory") t.Fatalf("chart is not directory")
} }
c, err := loader.LoadDir(cname) c, err := chartloader.LoadDir(cname)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if c.Name() != cname { acc, err := chart.NewAccessor(c)
t.Errorf("Expected %q name, got %q", cname, c.Name()) 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 { metadata := acc.MetadataAsMap()
t.Errorf("Wrong API version: %q", c.Metadata.APIVersion) 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", name: "v2 with relative starter path",
chartAPIVersion: "", chartAPIVersion: "",
useAbsolutePath: false, useAbsolutePath: false,
expectedVersion: chart.APIVersionV2, expectedVersion: chartv2.APIVersionV2,
}, },
{ {
name: "v2 with absolute starter path", name: "v2 with absolute starter path",
chartAPIVersion: "", chartAPIVersion: "",
useAbsolutePath: true, useAbsolutePath: true,
expectedVersion: chart.APIVersionV2, expectedVersion: chartv2.APIVersionV2,
}, },
{ {
name: "v3 with relative starter path", name: "v3 with relative starter path",
@ -98,7 +107,7 @@ func TestCreateStarterCmd(t *testing.T) {
// Enable feature gate for v3 charts // Enable feature gate for v3 charts
if tt.chartAPIVersion == "v3" { if tt.chartAPIVersion == "v3" {
t.Setenv(string(gates.ChartV3), "1") t.Setenv(string(chartV3), "1")
} }
cname := "testchart" cname := "testchart"
@ -129,8 +138,10 @@ func TestCreateStarterCmd(t *testing.T) {
starterArg = filepath.Join(starterchart, "starterchart") starterArg = filepath.Join(starterchart, "starterchart")
} }
cmd := fmt.Sprintf("create --starter=%s", starterArg) cmd := fmt.Sprintf("create --starter=%s", starterArg)
if tt.chartAPIVersion != "" { if tt.chartAPIVersion == "v3" {
cmd += fmt.Sprintf(" --chart-api-version=%s", tt.chartAPIVersion) cmd += fmt.Sprintf(" --chart-api-version=%s", chartv3.APIVersionV3)
} else {
cmd += fmt.Sprintf(" --chart-api-version=%s", chartv2.APIVersionV2)
} }
cmd += " " + cname cmd += " " + cname
@ -147,28 +158,25 @@ func TestCreateStarterCmd(t *testing.T) {
} }
// Load and verify the chart // 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 var templates []string
if tt.chartAPIVersion == "v3" { for _, tpl := range acc.Templates() {
c, err := loaderv3.LoadDir(cname) templates = append(templates, tpl.Name)
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)
}
} }
if chartName != cname { if chartName != cname {
@ -215,23 +223,33 @@ func TestCreateCmdChartAPIVersionV2(t *testing.T) {
t.Fatalf("chart is not directory") t.Fatalf("chart is not directory")
} }
c, err := loader.LoadDir(cname) c, err := chartloader.LoadDir(cname)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if c.Name() != cname { acc, err := chart.NewAccessor(c)
t.Errorf("Expected %q name, got %q", cname, c.Name()) 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) { func TestCreateCmdChartAPIVersionV3(t *testing.T) {
t.Chdir(t.TempDir()) t.Chdir(t.TempDir())
ensure.HelmHome(t) ensure.HelmHome(t)
t.Setenv(string(gates.ChartV3), "1") t.Setenv(string(chartV3), "1")
cname := "testchart" cname := "testchart"
// Run a create with v3 // Run a create with v3
@ -246,16 +264,26 @@ func TestCreateCmdChartAPIVersionV3(t *testing.T) {
t.Fatalf("chart is not directory") t.Fatalf("chart is not directory")
} }
c, err := loaderv3.LoadDir(cname) c, err := chartloader.LoadDir(cname)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if c.Name() != cname { acc, err := chart.NewAccessor(c)
t.Errorf("Expected %q name, got %q", cname, c.Name()) 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 { if apiVersion != chartv3.APIVersionV3 {
t.Errorf("Wrong API version: expected %q, got %q", chartv3.APIVersionV3, c.Metadata.APIVersion) t.Errorf("Wrong API version: expected %q, got %q", chartv3.APIVersionV3, apiVersion)
} }
} }

@ -36,6 +36,3 @@ func (g Gate) IsEnabled() bool {
func (g Gate) Error() error { 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()) 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"

Loading…
Cancel
Save