package chartutil import ( "fmt" "io/ioutil" "os" "path/filepath" "github.com/kubernetes/helm/pkg/proto/hapi/chart" ) const ( // ChartfileName is the default Chart file name. ChartfileName = "Chart.yaml" // ValuesfileName is the default values file name. ValuesfileName = "values.yaml" // TemplatesDir is the relative directory name for templates. TemplatesDir = "templates" // ChartsDir is the relative directory name for charts dependencies. ChartsDir = "charts" ) const defaultValues = `# Default values for %s. # This is a YAML-formatted file. # Declare name/value pairs to be passed into your templates. # name: value ` // Create creates a new chart in a directory. // // Inside of dir, this will create a directory based on the name of // chartfile.Name. It will then write the Chart.yaml into this directory and // create the (empty) appropriate directories. // // The returned string will point to the newly created directory. It will be // an absolute path, even if the provided base directory was relative. // // If dir does not exist, this will return an error. // If Chart.yaml or any directories cannot be created, this will return an // error. In such a case, this will attempt to clean up by removing the // new chart directory. func Create(chartfile *chart.Metadata, dir string) (string, error) { path, err := filepath.Abs(dir) if err != nil { return path, err } if fi, err := os.Stat(path); err != nil { return path, err } else if !fi.IsDir() { return path, fmt.Errorf("no such directory %s", path) } n := chartfile.Name cdir := filepath.Join(path, n) if fi, err := os.Stat(cdir); err == nil && !fi.IsDir() { return cdir, fmt.Errorf("file %s already exists and is not a directory", cdir) } if err := os.MkdirAll(cdir, 0755); err != nil { return cdir, err } if err := SaveChartfile(filepath.Join(cdir, ChartfileName), chartfile); err != nil { return cdir, err } val := []byte(fmt.Sprintf(defaultValues, chartfile.Name)) if err := ioutil.WriteFile(filepath.Join(cdir, ValuesfileName), val, 0644); err != nil { return cdir, err } for _, d := range []string{TemplatesDir, ChartsDir} { if err := os.MkdirAll(filepath.Join(cdir, d), 0755); err != nil { return cdir, err } } return cdir, nil }