You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
helm/pkg/lint/rules/template.go

71 lines
1.8 KiB

package rules
import (
"fmt"
"github.com/Masterminds/sprig"
"io/ioutil"
"k8s.io/helm/pkg/lint/support"
"os"
"path/filepath"
"text/template"
)
// Templates lints a chart's templates.
func Templates(linter *support.Linter) {
templatespath := filepath.Join(linter.ChartDir, "templates")
templatesExist := linter.RunLinterRule(support.WarningSev, validateTemplatesExistence(linter, templatespath))
// Templates directory is optional for now
if !templatesExist {
return
}
linter.RunLinterRule(support.ErrorSev, validateTemplatesDir(linter, templatespath))
linter.RunLinterRule(support.ErrorSev, validateTemplatesParseable(linter, templatespath))
}
func validateTemplatesExistence(linter *support.Linter, templatesPath string) (lintError support.LintError) {
if _, err := os.Stat(templatesPath); err != nil {
lintError = fmt.Errorf("Templates directory not found")
}
return
}
func validateTemplatesDir(linter *support.Linter, templatesPath string) (lintError support.LintError) {
fi, err := os.Stat(templatesPath)
if err == nil && !fi.IsDir() {
lintError = fmt.Errorf("'templates' is not a directory")
}
return
}
func validateTemplatesParseable(linter *support.Linter, templatesPath string) (lintError support.LintError) {
tpl := template.New("tpl").Funcs(sprig.TxtFuncMap())
lintError = filepath.Walk(templatesPath, func(name string, fi os.FileInfo, e error) error {
if e != nil {
return e
}
if fi.IsDir() {
return nil
}
data, err := ioutil.ReadFile(name)
if err != nil {
lintError = fmt.Errorf("cannot read %s: %s", name, err)
return lintError
}
newtpl, err := tpl.Parse(string(data))
if err != nil {
lintError = fmt.Errorf("error processing %s: %s", name, err)
return lintError
}
tpl = newtpl
return nil
})
return
}