add general shizzle
(cherry picked from commit 72d164f3960436093d01d00d5ed6d43bc2e4e256)
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user