diff --git a/pkg/lint/rules/chartfile.go b/pkg/lint/rules/chartfile.go index b49f2cec0..4e8a9524a 100644 --- a/pkg/lint/rules/chartfile.go +++ b/pkg/lint/rules/chartfile.go @@ -21,6 +21,7 @@ import ( "io/ioutil" "os" "path/filepath" + "regexp" "github.com/Masterminds/semver/v3" "github.com/asaskevich/govalidator" @@ -104,9 +105,14 @@ func validateChartYamlFormat(chartFileError error) error { } func validateChartName(cf *chart.Metadata) error { + var validNameRegex = regexp.MustCompile(`^[a-z0-9](([-a-z0-9]*)?)$`) + if cf.Name == "" { return errors.New("name is required") } + if !validNameRegex.MatchString(cf.Name) { + return errors.New(fmt.Sprintf("invalid release name, must match regex %s", validNameRegex.String())) + } return nil } diff --git a/pkg/lint/rules/chartfile_test.go b/pkg/lint/rules/chartfile_test.go index 087cda047..4b537f3eb 100644 --- a/pkg/lint/rules/chartfile_test.go +++ b/pkg/lint/rules/chartfile_test.go @@ -30,11 +30,13 @@ import ( ) const ( + goodChartDir = "testdata/goodone" badChartDir = "testdata/badchartfile" anotherBadChartDir = "testdata/anotherbadchartfile" ) var ( + goodChartFilePath = filepath.Join(goodChartDir, "Chart.yaml") badChartFilePath = filepath.Join(badChartDir, "Chart.yaml") nonExistingChartFilePath = filepath.Join(os.TempDir(), "Chart.yaml") ) @@ -65,9 +67,15 @@ func TestValidateChartYamlFormat(t *testing.T) { } func TestValidateChartName(t *testing.T) { - err := validateChartName(badChart) - if err == nil { - t.Errorf("validateChartName to return a linter error, got no error") + badNameChart, _ := chartutil.LoadChartfile(goodChartFilePath) + badName := &badNameChart.Name + + for _, name := range []string{"", "with-Capital", "with_underscore"} { + *badName = name + err := validateChartName(badNameChart) + if err == nil { + t.Errorf("validateChartName to return a linter error for chart name %s, got no error", name) + } } }