From fcf7c14039dca93b020706f5dd6b956d7242037b Mon Sep 17 00:00:00 2001 From: Filip Krakowski Date: Fri, 9 Sep 2022 13:02:04 +0200 Subject: [PATCH] Rework override mechanism for helm create with starters Signed-off-by: Filip Krakowski --- cmd/helm/create.go | 15 +++++++++++- pkg/chartutil/create.go | 47 ++++++++++++++++++++++++------------ pkg/chartutil/create_test.go | 13 +++++++--- pkg/chartutil/save.go | 1 + 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/cmd/helm/create.go b/cmd/helm/create.go index 247049c67..a3f5fdba8 100644 --- a/cmd/helm/create.go +++ b/cmd/helm/create.go @@ -23,6 +23,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/cmd/helm/require" "helm.sh/helm/v3/pkg/chartutil" @@ -97,6 +98,18 @@ func (o *createOptions) run(out io.Writer) error { fmt.Fprintf(out, "Creating %s\n", o.name) chartname := filepath.Base(o.name) + cfile := &chart.Metadata{ + Name: chartname, + Description: "A Helm chart for Kubernetes", + Type: "application", + Version: "0.1.0", + AppVersion: "0.1.0", + APIVersion: chart.APIVersionV2, + } + + if o.keepMetadata { + cfile = nil + } if o.starter != "" { // Create from the starter @@ -105,7 +118,7 @@ func (o *createOptions) run(out io.Writer) error { if filepath.IsAbs(o.starter) { lstarter = o.starter } - return chartutil.CreateFromWithMetadata(chartname, filepath.Dir(chartname), lstarter, o.keepMetadata) + return chartutil.CreateFromWithOverride(chartname, filepath.Dir(chartname), lstarter, cfile) } chartutil.Stderr = out diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index f4c951ec8..54c6be53c 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -548,22 +548,23 @@ spec: var Stderr io.Writer = os.Stderr // CreateFrom creates a new chart, but scaffolds it from the src chart. -// Deprecated: Use CreateFromWithMetadata -// TODO Helm 4: Fold CreateFromWithMetadata back into CreateFrom +// Deprecated: Use CreateFromWithOverride +// TODO Helm 4: Fold CreateFromWithOverride back into CreateFrom func CreateFrom(chartfile *chart.Metadata, dest, src string) error { - return CreateFromWithMetadata(chartfile.Name, dest, src, false) + return CreateFromWithOverride(chartfile.Name, dest, src, chartfile) } -// CreateFromWithMetadata creates a new chart, but scaffolds it from the src chart and -// provides the option to preserve custom metadata (Chart.yaml) files. -func CreateFromWithMetadata(name, dest, src string, keepMetadata bool) error { +// CreateFromWithOverride creates a new chart, but scaffolds it from the src chart and +// provides the option to override the chart's metadata (Chart.yaml). +func CreateFromWithOverride(name, dest, src string, override *chart.Metadata) error { schart, err := loader.Load(src) if err != nil { return errors.Wrapf(err, "could not load %s", src) } - if err = setMetadata(schart, name, keepMetadata); err != nil { - return errors.Wrap(err, "could not set metadata") + // Override the chart's metadata if the user requested it + if err := setMetadata(schart, name, override); err != nil { + return errors.Wrap(err, "setting metadata") } var updatedTemplates []*chart.File @@ -733,20 +734,36 @@ func validateChartName(name string) error { return nil } -func setMetadata(schart *chart.Chart, name string, keepMetadata bool) error { - for _, f := range schart.Raw { - if f.Name == ChartfileName { - // Overwrite Metadata only if flag was not set by user to keep backwards compatibility. - if !keepMetadata { - f.Data = []byte(fmt.Sprintf(defaultChartfile, name)) +func setMetadata(schart *chart.Chart, name string, override *chart.Metadata) error { + // Override the source chart's metadata and raw chart file content + // if the user provided a chart.Metadata struct + if override != nil { + schart.Metadata = override + for _, f := range schart.Raw { + if f.Name == ChartfileName { + metadataBytes, err := yaml.Marshal(schart.Metadata) + if err != nil { + return errors.Wrap(err, "marshalling metadata override") + } + + f.Data = metadataBytes + break } + } - // Deserialize Metadata and check for errors + return nil + } + + // Unmarshal Chart.yaml from source directory while replacing + // all placeholders if no override was requested + for _, f := range schart.Raw { + if f.Name == ChartfileName { var m chart.Metadata if err := yaml.Unmarshal(transform(string(f.Data), name), &m); err != nil { return errors.Wrap(err, "transforming charts file") } schart.Metadata = &m + break } } diff --git a/pkg/chartutil/create_test.go b/pkg/chartutil/create_test.go index 22e490c91..76b935208 100644 --- a/pkg/chartutil/create_test.go +++ b/pkg/chartutil/create_test.go @@ -23,6 +23,7 @@ import ( "strings" "testing" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chart/loader" ) @@ -67,10 +68,16 @@ func TestCreate(t *testing.T) { func TestCreateFrom(t *testing.T) { tdir := t.TempDir() + cf := &chart.Metadata{ + APIVersion: chart.APIVersionV1, + Name: "foo", + Version: "0.1.0", + } + chartname := "foo" srcdir := "./testdata/frobnitz/charts/mariner" - if err := CreateFrom(chartname, tdir, srcdir, false); err != nil { + if err := CreateFrom(cf, tdir, srcdir); err != nil { t.Fatal(err) } @@ -105,7 +112,7 @@ func TestCreateFrom(t *testing.T) { } } -func TestCreateFromKeepMetadata(t *testing.T) { +func TestCreateFromWithOverride(t *testing.T) { tdir := t.TempDir() chartname := "foo" @@ -116,7 +123,7 @@ func TestCreateFromKeepMetadata(t *testing.T) { t.Errorf("Unable to read file %s: %s", srcMetadata, err) } - if err := CreateFrom(chartname, tdir, srcdir, true); err != nil { + if err := CreateFromWithOverride(chartname, tdir, srcdir, nil); err != nil { t.Fatal(err) } diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 8e3753549..13277c5eb 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -57,6 +57,7 @@ func SaveDir(c *chart.Chart, dest string) error { for _, f := range c.Raw { if f.Name == ChartfileName { hasRawMetadata = true + break } }