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/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

@ -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 {
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 {
// Overwrite Metadata only if flag was not set by user to keep backwards compatibility.
if !keepMetadata {
f.Data = []byte(fmt.Sprintf(defaultChartfile, name))
metadataBytes, err := yaml.Marshal(schart.Metadata)
if err != nil {
return errors.Wrap(err, "marshalling metadata override")
}
// Deserialize Metadata and check for errors
f.Data = metadataBytes
break
}
}
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
if err := yaml.Unmarshal(transform(string(f.Data), name), &m); err != nil {
return errors.Wrap(err, "transforming charts file")
}
schart.Metadata = &m
break
}
}

@ -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)
}

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

Loading…
Cancel
Save