constellation/internal/helm/chartutil.go

87 lines
2.4 KiB
Go
Raw Normal View History

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package helm
import (
"fmt"
"path/filepath"
"github.com/edgelesssys/constellation/v2/internal/file"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chartutil"
)
// saveChartToDisk saves a chart as files in a directory.
//
// This takes the chart name, and creates a new subdirectory inside of the given dest
// directory, writing the chart's contents to that subdirectory.
// Dependencies are written using the same format, instead of writing them as tar files
//
// View the SaveDir implementation in chartutil as reference: https://github.com/helm/helm/blob/3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e/pkg/chartutil/save.go#L40
func saveChartToDisk(c *chart.Chart, dest string, fileHandler file.Handler) error {
// Create the chart directory
outdir := filepath.Join(dest, c.Name())
if fi, err := fileHandler.Stat(outdir); err == nil && !fi.IsDir() {
return fmt.Errorf("file %s already exists and is not a directory", outdir)
}
if err := fileHandler.MkdirAll(outdir); err != nil {
return err
}
// Save the chart file.
if err := chartutil.SaveChartfile(filepath.Join(outdir, chartutil.ChartfileName), c.Metadata); err != nil {
return err
}
// Save values.yaml
for _, f := range c.Raw {
if f.Name == chartutil.ValuesfileName {
vf := filepath.Join(outdir, chartutil.ValuesfileName)
if err := writeFile(vf, f.Data, fileHandler); err != nil {
return err
}
}
}
// Save values.schema.json if it exists
if c.Schema != nil {
filename := filepath.Join(outdir, chartutil.SchemafileName)
if err := writeFile(filename, c.Schema, fileHandler); err != nil {
return err
}
}
// Save templates and files
for _, o := range [][]*chart.File{c.Templates, c.Files} {
for _, f := range o {
n := filepath.Join(outdir, f.Name)
if err := writeFile(n, f.Data, fileHandler); err != nil {
return err
}
}
}
// Save dependencies
base := filepath.Join(outdir, chartutil.ChartsDir)
for _, dep := range c.Dependencies() {
// Don't write dependencies as tar files
// Instead recursively use saveChartToDisk
if err := saveChartToDisk(dep, base, fileHandler); err != nil {
return fmt.Errorf("saving %s: %w", dep.ChartFullPath(), err)
}
}
return nil
}
func writeFile(name string, content []byte, fileHandler file.Handler) error {
if err := fileHandler.MkdirAll(filepath.Dir(name)); err != nil {
return err
}
return fileHandler.Write(name, content)
}