134 lines
3.3 KiB
Go
134 lines
3.3 KiB
Go
|
package helmunit
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
|
||
|
"helm.sh/helm/v3/pkg/action"
|
||
|
"helm.sh/helm/v3/pkg/chart/loader"
|
||
|
"helm.sh/helm/v3/pkg/cli"
|
||
|
v "helm.sh/helm/v3/pkg/cli/values"
|
||
|
"helm.sh/helm/v3/pkg/downloader"
|
||
|
"helm.sh/helm/v3/pkg/getter"
|
||
|
"helm.sh/helm/v3/pkg/releaseutil"
|
||
|
"sigs.k8s.io/yaml"
|
||
|
)
|
||
|
|
||
|
var settings *cli.EnvSettings
|
||
|
|
||
|
type HelmChart struct {
|
||
|
Name string
|
||
|
ChartPath string
|
||
|
Manifests manifestCollection
|
||
|
Hooks manifestCollection
|
||
|
Notes string
|
||
|
Values map[string]interface{}
|
||
|
}
|
||
|
|
||
|
func New(name string, chartPath string) HelmChart {
|
||
|
h := HelmChart{
|
||
|
Name: name,
|
||
|
ChartPath: chartPath,
|
||
|
Manifests: make(manifestCollection),
|
||
|
Hooks: make(manifestCollection),
|
||
|
}
|
||
|
return h
|
||
|
}
|
||
|
|
||
|
func (c *HelmChart) UpdateDependencies() error {
|
||
|
settings = cli.New()
|
||
|
client := defaultClient(c.Name, settings.Namespace())
|
||
|
p := getter.All(&cli.EnvSettings{})
|
||
|
|
||
|
// Check chart dependencies to make sure all are present in /charts
|
||
|
chartRequested, err := loader.Load(c.ChartPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if req := chartRequested.Metadata.Dependencies; req != nil {
|
||
|
if err := action.CheckDependencies(chartRequested, req); err != nil {
|
||
|
if client.DependencyUpdate {
|
||
|
man := &downloader.Manager{
|
||
|
Out: io.Discard,
|
||
|
ChartPath: c.ChartPath,
|
||
|
Keyring: client.ChartPathOptions.Keyring,
|
||
|
SkipUpdate: false,
|
||
|
Getters: p,
|
||
|
}
|
||
|
if err := man.Update(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *HelmChart) Render(valueFilePaths, stringValues []string, rawYamlValues *string) error {
|
||
|
settings = cli.New()
|
||
|
client := defaultClient(c.Name, settings.Namespace())
|
||
|
c.Manifests.Initialize()
|
||
|
c.Hooks.Initialize()
|
||
|
|
||
|
p := getter.All(&cli.EnvSettings{})
|
||
|
valueOpts := &v.Options{
|
||
|
ValueFiles: valueFilePaths,
|
||
|
Values: stringValues,
|
||
|
}
|
||
|
|
||
|
values, err := valueOpts.MergeValues(p)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if !(rawYamlValues == nil) {
|
||
|
currentMap := map[string]interface{}{}
|
||
|
if err := yaml.Unmarshal([]byte(*rawYamlValues), ¤tMap); err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
values = mergeMaps(currentMap, values)
|
||
|
}
|
||
|
|
||
|
c.Values = values
|
||
|
|
||
|
chartRequested, err := loader.Load(c.ChartPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
release, err := client.Run(chartRequested, values)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for _, manifest := range releaseutil.SplitManifests(release.Manifest) {
|
||
|
err := c.Manifests.Add([]byte(manifest))
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for _, manifest := range release.Hooks {
|
||
|
err := c.Hooks.Add([]byte(manifest.Manifest))
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
c.Notes = release.Info.Notes
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func defaultClient(name, namespace string) *action.Install {
|
||
|
client := action.NewInstall(&action.Configuration{})
|
||
|
client.Version = ">0.0.0-0"
|
||
|
client.ReleaseName = name
|
||
|
client.Namespace = namespace
|
||
|
client.ClientOnly = true
|
||
|
client.DryRun = true
|
||
|
client.DependencyUpdate = true
|
||
|
|
||
|
return client
|
||
|
}
|