diff --git a/pkg/chartutil/chartfile.go b/pkg/chartutil/chartfile.go index ea40f57064cde87bfa0992693e96423705b354bf..9897d66ff04ee986ed496066187abc5271120355 100644 --- a/pkg/chartutil/chartfile.go +++ b/pkg/chartutil/chartfile.go @@ -17,7 +17,11 @@ limitations under the License. package chartutil import ( + "errors" + "fmt" "io/ioutil" + "os" + "path/filepath" "github.com/ghodss/yaml" @@ -58,3 +62,37 @@ func SaveChartfile(filename string, cf *chart.Metadata) error { } return ioutil.WriteFile(filename, out, 0644) } + +// IsChartDir validate a chart directory. +// +// Checks for a valid Chart.yaml. +func IsChartDir(dirName string) (bool, error) { + if fi, err := os.Stat(dirName); err != nil { + return false, err + } else if !fi.IsDir() { + return false, fmt.Errorf("%q is not a directory", dirName) + } + + chartYaml := filepath.Join(dirName, "Chart.yaml") + if _, err := os.Stat(chartYaml); os.IsNotExist(err) { + return false, fmt.Errorf("no Chart.yaml exists in directory %q", dirName) + } + + chartYamlContent, err := ioutil.ReadFile(chartYaml) + if err != nil { + return false, fmt.Errorf("cannot read Chart.Yaml in directory %q", dirName) + } + + chartContent, err := UnmarshalChartfile(chartYamlContent) + if err != nil { + return false, err + } + if chartContent == nil { + return false, errors.New("chart metadata (Chart.yaml) missing") + } + if chartContent.Name == "" { + return false, errors.New("invalid chart (Chart.yaml): name must not be empty") + } + + return true, nil +} diff --git a/pkg/chartutil/chartfile_test.go b/pkg/chartutil/chartfile_test.go index 643d800526cca939c464ab4b66f65a57fb56194f..30bb0c69b12498d346d6bfd74bae3fa729b44083 100755 --- a/pkg/chartutil/chartfile_test.go +++ b/pkg/chartutil/chartfile_test.go @@ -95,3 +95,16 @@ func verifyChartfile(t *testing.T, f *chart.Metadata, name string) { } } } + +func TestIsChartDir(t *testing.T) { + validChartDir, err := IsChartDir("testdata/frobnitz") + if !validChartDir { + t.Errorf("unexpected error while reading chart-directory: (%v)", err) + return + } + validChartDir, err = IsChartDir("testdata") + if validChartDir || err == nil { + t.Errorf("expected error but did not get any") + return + } +} diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go index 71bd23f8780cf3545f8cead4b488209e0fc46b75..03ba20e12ab3bdb14e1ff1c79b8408e14b21f50b 100644 --- a/pkg/chartutil/load.go +++ b/pkg/chartutil/load.go @@ -48,6 +48,9 @@ func Load(name string) (*chart.Chart, error) { return nil, err } if fi.IsDir() { + if validChart, err := IsChartDir(name); !validChart { + return nil, err + } return LoadDir(name) } return LoadFile(name)