Add SaveWithOpts and abstract code for reuse

Signed-off-by: Peter Engelbert <pmengelbert@gmail.com>
pull/8216/head
Peter Engelbert 5 years ago
parent e04b58cdf7
commit 521c7632bb

@ -288,7 +288,7 @@ func (cache *Cache) saveChartConfig(ch *chart.Chart) (*ocispec.Descriptor, bool,
func (cache *Cache) saveChartContentLayer(ch *chart.Chart) (*ocispec.Descriptor, bool, error) { func (cache *Cache) saveChartContentLayer(ch *chart.Chart) (*ocispec.Descriptor, bool, error) {
destDir := filepath.Join(cache.rootDir, ".build") destDir := filepath.Join(cache.rootDir, ".build")
os.MkdirAll(destDir, 0755) os.MkdirAll(destDir, 0755)
tmpFile, err := chartutil.Save(ch, destDir, chartutil.WithoutTimestamp()) tmpFile, err := chartutil.SaveWithOpts(ch, destDir, chartutil.WithoutTimestamp())
defer os.Remove(tmpFile) defer os.Remove(tmpFile)
if err != nil { if err != nil {
return nil, false, errors.Wrap(err, "failed to save") return nil, false, errors.Wrap(err, "failed to save")

@ -32,6 +32,12 @@ import (
) )
type ( type (
tarGzipWriter struct {
TarWriter *tar.Writer
GzipWriter *gzip.Writer
File *os.File
}
saveConfig struct { saveConfig struct {
noTimestamp bool noTimestamp bool
} }
@ -47,6 +53,12 @@ func WithoutTimestamp() SaveOpt {
} }
} }
func (w *tarGzipWriter) Close() {
w.TarWriter.Close()
w.GzipWriter.Close()
w.File.Close()
}
var headerBytes = []byte("+aHR0cHM6Ly95b3V0dS5iZS96OVV6MWljandyTQo=") var headerBytes = []byte("+aHR0cHM6Ly95b3V0dS5iZS96OVV6MWljandyTQo=")
// SaveDir saves a chart as files in a directory. // SaveDir saves a chart as files in a directory.
@ -115,14 +127,65 @@ func SaveDir(c *chart.Chart, dest string) error {
// will generate /foo/bar-1.0.0.tgz. // will generate /foo/bar-1.0.0.tgz.
// //
// This returns the absolute path to the chart archive file. // This returns the absolute path to the chart archive file.
func Save(c *chart.Chart, outDir string, saveOpts ...SaveOpt) (string, error) { func Save(c *chart.Chart, outDir string) (string, error) {
tgzWriter, err := createTarGzipWriter(c, outDir)
if err != nil {
return "", err
}
filename := tgzWriter.File.Name()
rollback := false
defer func() {
tgzWriter.Close()
if rollback {
os.Remove(filename)
}
}()
if err := writeTarContents(tgzWriter.TarWriter, c, "", time.Now()); err != nil {
rollback = true
return filename, err
}
return filename, nil
}
func SaveWithOpts(c *chart.Chart, outDir string, opts ...SaveOpt) (string, error) {
config := new(saveConfig) config := new(saveConfig)
for _, fn := range saveOpts { for _, fn := range opts {
fn(config) fn(config)
} }
tgzWriter, err := createTarGzipWriter(c, outDir)
if err != nil {
return "", err
}
filename := tgzWriter.File.Name()
rollback := false
defer func() {
tgzWriter.Close()
if rollback {
os.Remove(filename)
}
}()
var timestamp time.Time
if !config.noTimestamp {
timestamp = time.Now()
}
if err := writeTarContents(tgzWriter.TarWriter, c, "", timestamp); err != nil {
rollback = true
return filename, err
}
return filename, nil
}
func createTarGzipWriter(c *chart.Chart, outDir string) (*tarGzipWriter, error) {
if err := c.Validate(); err != nil { if err := c.Validate(); err != nil {
return "", errors.Wrap(err, "chart validation") return nil, errors.Wrap(err, "chart validation")
} }
filename := fmt.Sprintf("%s-%s.tgz", c.Name(), c.Metadata.Version) filename := fmt.Sprintf("%s-%s.tgz", c.Name(), c.Metadata.Version)
@ -131,18 +194,18 @@ func Save(c *chart.Chart, outDir string, saveOpts ...SaveOpt) (string, error) {
if stat, err := os.Stat(dir); err != nil { if stat, err := os.Stat(dir); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
if err2 := os.MkdirAll(dir, 0755); err2 != nil { if err2 := os.MkdirAll(dir, 0755); err2 != nil {
return "", err2 return nil, err2
} }
} else { } else {
return "", errors.Wrapf(err, "stat %s", dir) return nil, errors.Wrapf(err, "stat %s", dir)
} }
} else if !stat.IsDir() { } else if !stat.IsDir() {
return "", errors.Errorf("is not a directory: %s", dir) return nil, errors.Errorf("is not a directory: %s", dir)
} }
f, err := os.Create(filename) f, err := os.Create(filename)
if err != nil { if err != nil {
return "", err return nil, err
} }
// Wrap in gzip writer // Wrap in gzip writer
@ -152,26 +215,14 @@ func Save(c *chart.Chart, outDir string, saveOpts ...SaveOpt) (string, error) {
// Wrap in tar writer // Wrap in tar writer
twriter := tar.NewWriter(zipper) twriter := tar.NewWriter(zipper)
rollback := false
defer func() {
twriter.Close()
zipper.Close()
f.Close()
if rollback {
os.Remove(filename)
}
}()
var timestamp time.Time cxvf := &tarGzipWriter{
if !config.noTimestamp { TarWriter: twriter,
timestamp = time.Now() GzipWriter: zipper,
File: f,
} }
if err := writeTarContents(twriter, c, "", timestamp); err != nil { return cxvf, nil
rollback = true
return filename, err
}
return filename, nil
} }
func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string, timestamp time.Time) error { func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string, timestamp time.Time) error {

Loading…
Cancel
Save