Rework override mechanism for helm create with starters

Signed-off-by: Filip Krakowski <krakowski@hhu.de>
pull/11273/head
Filip Krakowski 3 years ago
parent c45230d849
commit fcf7c14039
No known key found for this signature in database
GPG Key ID: 9C1E31CEA7A605B8

@ -23,6 +23,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/cmd/helm/require" "helm.sh/helm/v3/cmd/helm/require"
"helm.sh/helm/v3/pkg/chartutil" "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) fmt.Fprintf(out, "Creating %s\n", o.name)
chartname := filepath.Base(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 != "" { if o.starter != "" {
// Create from the starter // Create from the starter
@ -105,7 +118,7 @@ func (o *createOptions) run(out io.Writer) error {
if filepath.IsAbs(o.starter) { if filepath.IsAbs(o.starter) {
lstarter = 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 chartutil.Stderr = out

@ -548,22 +548,23 @@ spec:
var Stderr io.Writer = os.Stderr var Stderr io.Writer = os.Stderr
// CreateFrom creates a new chart, but scaffolds it from the src chart. // CreateFrom creates a new chart, but scaffolds it from the src chart.
// Deprecated: Use CreateFromWithMetadata // Deprecated: Use CreateFromWithOverride
// TODO Helm 4: Fold CreateFromWithMetadata back into CreateFrom // TODO Helm 4: Fold CreateFromWithOverride back into CreateFrom
func CreateFrom(chartfile *chart.Metadata, dest, src string) error { 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 // CreateFromWithOverride creates a new chart, but scaffolds it from the src chart and
// provides the option to preserve custom metadata (Chart.yaml) files. // provides the option to override the chart's metadata (Chart.yaml).
func CreateFromWithMetadata(name, dest, src string, keepMetadata bool) error { func CreateFromWithOverride(name, dest, src string, override *chart.Metadata) error {
schart, err := loader.Load(src) schart, err := loader.Load(src)
if err != nil { if err != nil {
return errors.Wrapf(err, "could not load %s", src) return errors.Wrapf(err, "could not load %s", src)
} }
if err = setMetadata(schart, name, keepMetadata); err != nil { // Override the chart's metadata if the user requested it
return errors.Wrap(err, "could not set metadata") if err := setMetadata(schart, name, override); err != nil {
return errors.Wrap(err, "setting metadata")
} }
var updatedTemplates []*chart.File var updatedTemplates []*chart.File
@ -733,20 +734,36 @@ func validateChartName(name string) error {
return nil return nil
} }
func setMetadata(schart *chart.Chart, name string, keepMetadata bool) error { func setMetadata(schart *chart.Chart, name string, override *chart.Metadata) error {
for _, f := range schart.Raw { // Override the source chart's metadata and raw chart file content
if f.Name == ChartfileName { // if the user provided a chart.Metadata struct
// Overwrite Metadata only if flag was not set by user to keep backwards compatibility. if override != nil {
if !keepMetadata { schart.Metadata = override
f.Data = []byte(fmt.Sprintf(defaultChartfile, name)) 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 <CHARTNAME> placeholders if no override was requested
for _, f := range schart.Raw {
if f.Name == ChartfileName {
var m chart.Metadata var m chart.Metadata
if err := yaml.Unmarshal(transform(string(f.Data), name), &m); err != nil { if err := yaml.Unmarshal(transform(string(f.Data), name), &m); err != nil {
return errors.Wrap(err, "transforming charts file") return errors.Wrap(err, "transforming charts file")
} }
schart.Metadata = &m schart.Metadata = &m
break
} }
} }

@ -23,6 +23,7 @@ import (
"strings" "strings"
"testing" "testing"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chart/loader" "helm.sh/helm/v3/pkg/chart/loader"
) )
@ -67,10 +68,16 @@ func TestCreate(t *testing.T) {
func TestCreateFrom(t *testing.T) { func TestCreateFrom(t *testing.T) {
tdir := t.TempDir() tdir := t.TempDir()
cf := &chart.Metadata{
APIVersion: chart.APIVersionV1,
Name: "foo",
Version: "0.1.0",
}
chartname := "foo" chartname := "foo"
srcdir := "./testdata/frobnitz/charts/mariner" 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) 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() tdir := t.TempDir()
chartname := "foo" chartname := "foo"
@ -116,7 +123,7 @@ func TestCreateFromKeepMetadata(t *testing.T) {
t.Errorf("Unable to read file %s: %s", srcMetadata, err) 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) t.Fatal(err)
} }

@ -57,6 +57,7 @@ func SaveDir(c *chart.Chart, dest string) error {
for _, f := range c.Raw { for _, f := range c.Raw {
if f.Name == ChartfileName { if f.Name == ChartfileName {
hasRawMetadata = true hasRawMetadata = true
break
} }
} }

Loading…
Cancel
Save