Merge pull request #12 from jrnt30/diff-command
Adding in diff plugin execution
This commit is contained in:
commit
7a5b32fdea
13
README.md
13
README.md
|
|
@ -49,12 +49,10 @@ NAME:
|
|||
USAGE:
|
||||
main [global options] command [command options] [arguments...]
|
||||
|
||||
VERSION:
|
||||
0.1.0
|
||||
|
||||
COMMANDS:
|
||||
repos sync repositories from state file (helm repo add && helm repo update)
|
||||
charts sync charts from state file (helm repo upgrade --install)
|
||||
diff diff charts from state file against env (helm diff)
|
||||
sync sync all resources from state file (repos && charts)
|
||||
delete delete charts from state file (helm delete)
|
||||
|
||||
|
|
@ -65,3 +63,12 @@ GLOBAL OPTIONS:
|
|||
--help, -h show help
|
||||
--version, -v print the version
|
||||
```
|
||||
|
||||
### diff
|
||||
|
||||
The `helmfile diff` sub-command executes the [helm-diff](https://github.com/databus23/helm-diff) plugin across all of
|
||||
the charts/releases defined in the manifest.
|
||||
|
||||
Under the covers Helmfile is simply using the `helm diff` plugin, so that needs to be installed prior. For Helm 2.3+
|
||||
you should be able to simply execute `helm plugin install https://github.com/databus23/helm-diff`. For more details
|
||||
please look at their [documentation](https://github.com/databus23/helm-diff#helm-diff-plugin).
|
||||
|
|
|
|||
|
|
@ -76,6 +76,18 @@ func (helm *execer) SyncChart(name, chart string, flags ...string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (helm *execer) DiffChart(name, chart string, flags ...string) error {
|
||||
chart, err := normalizeChart(chart)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
out, err := helm.exec(append([]string{"diff", name, chart}, flags...)...)
|
||||
if helm.writer != nil {
|
||||
helm.writer.Write(out)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (helm *execer) DeleteChart(name string) error {
|
||||
out, err := helm.exec("delete", name)
|
||||
if helm.writer != nil {
|
||||
|
|
|
|||
|
|
@ -7,5 +7,6 @@ type Interface interface {
|
|||
UpdateRepo() error
|
||||
|
||||
SyncChart(name, chart string, flags ...string) error
|
||||
DiffChart(name, chart string, flags ...string) error
|
||||
DeleteChart(name string) error
|
||||
}
|
||||
|
|
|
|||
49
main.go
49
main.go
|
|
@ -107,6 +107,55 @@ func main() {
|
|||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "diff",
|
||||
Usage: "diff charts from state file against env (helm diff)",
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "args",
|
||||
Value: "",
|
||||
Usage: "pass args to helm exec",
|
||||
},
|
||||
cli.StringSliceFlag{
|
||||
Name: "values",
|
||||
Usage: "additional value files to be merged into the command",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "sync-repos",
|
||||
Usage: "enable a repo sync prior to diffing",
|
||||
},
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
state, helm, err := before(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
args := c.String("args")
|
||||
if len(args) > 0 {
|
||||
helm.SetExtraArgs(strings.Split(args, " ")...)
|
||||
}
|
||||
|
||||
if c.Bool("sync-repos") {
|
||||
if errs := state.SyncRepos(helm); errs != nil && len(errs) > 0 {
|
||||
for _, err := range errs {
|
||||
fmt.Printf("err: %s\n", err.Error())
|
||||
}
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
values := c.StringSlice("values")
|
||||
|
||||
if errs := state.DiffCharts(helm, values); errs != nil && len(errs) > 0 {
|
||||
for _, err := range errs {
|
||||
fmt.Printf("err: %s\n", err.Error())
|
||||
}
|
||||
os.Exit(1)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "sync",
|
||||
Usage: "sync all resources from state file (repos && charts)",
|
||||
|
|
|
|||
|
|
@ -115,6 +115,44 @@ func (state *HelmState) SyncCharts(helm helmexec.Interface, additonalValues []st
|
|||
return nil
|
||||
}
|
||||
|
||||
func (state *HelmState) DiffCharts(helm helmexec.Interface, additonalValues []string) []error {
|
||||
var wg sync.WaitGroup
|
||||
errs := []error{}
|
||||
|
||||
for _, chart := range state.Charts {
|
||||
wg.Add(1)
|
||||
go func(wg *sync.WaitGroup, chart ChartSpec) {
|
||||
// Plugin command doesn't support explicit namespace
|
||||
chart.Namespace = ""
|
||||
flags, flagsErr := flagsForChart(&chart)
|
||||
if flagsErr != nil {
|
||||
errs = append(errs, flagsErr)
|
||||
}
|
||||
for _, value := range additonalValues {
|
||||
wd, wdErr := os.Getwd()
|
||||
if wdErr != nil {
|
||||
errs = append(errs, wdErr)
|
||||
}
|
||||
valfile := filepath.Join(wd, value)
|
||||
flags = append(flags, "--values", valfile)
|
||||
}
|
||||
if len(errs) == 0 {
|
||||
if err := helm.DiffChart(chart.Name, chart.Chart, flags...); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
wg.Done()
|
||||
}(&wg, chart)
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
if len(errs) != 0 {
|
||||
return errs
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (state *HelmState) DeleteCharts(helm helmexec.Interface) []error {
|
||||
var wg sync.WaitGroup
|
||||
errs := []error{}
|
||||
|
|
|
|||
Loading…
Reference in New Issue