Skip to content

Commit

Permalink
Merge pull request #12 from jrnt30/diff-command
Browse files Browse the repository at this point in the history
Adding in diff plugin execution
  • Loading branch information
roboll authored Sep 7, 2017
2 parents 2abc93c + 6585bf1 commit 7a5b32f
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 3 deletions.
13 changes: 10 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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).
12 changes: 12 additions & 0 deletions helmexec/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions helmexec/helmexec.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 49 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand Down
38 changes: 38 additions & 0 deletions state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand Down

0 comments on commit 7a5b32f

Please sign in to comment.