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: | USAGE: | ||||||
|    main [global options] command [command options] [arguments...] |    main [global options] command [command options] [arguments...] | ||||||
| 
 | 
 | ||||||
| VERSION: |  | ||||||
|    0.1.0 |  | ||||||
| 
 |  | ||||||
| COMMANDS: | COMMANDS: | ||||||
|      repos   sync repositories from state file (helm repo add && helm repo update) |      repos   sync repositories from state file (helm repo add && helm repo update) | ||||||
|      charts  sync charts from state file (helm repo upgrade --install) |      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) |      sync    sync all resources from state file (repos && charts) | ||||||
|      delete  delete charts from state file (helm delete) |      delete  delete charts from state file (helm delete) | ||||||
| 
 | 
 | ||||||
|  | @ -65,3 +63,12 @@ GLOBAL OPTIONS: | ||||||
|    --help, -h            show help |    --help, -h            show help | ||||||
|    --version, -v         print the version |    --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 | 	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 { | func (helm *execer) DeleteChart(name string) error { | ||||||
| 	out, err := helm.exec("delete", name) | 	out, err := helm.exec("delete", name) | ||||||
| 	if helm.writer != nil { | 	if helm.writer != nil { | ||||||
|  |  | ||||||
|  | @ -7,5 +7,6 @@ type Interface interface { | ||||||
| 	UpdateRepo() error | 	UpdateRepo() error | ||||||
| 
 | 
 | ||||||
| 	SyncChart(name, chart string, flags ...string) error | 	SyncChart(name, chart string, flags ...string) error | ||||||
|  | 	DiffChart(name, chart string, flags ...string) error | ||||||
| 	DeleteChart(name string) error | 	DeleteChart(name string) error | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										49
									
								
								main.go
								
								
								
								
							
							
						
						
									
										49
									
								
								main.go
								
								
								
								
							|  | @ -107,6 +107,55 @@ func main() { | ||||||
| 				return nil | 				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", | 			Name:  "sync", | ||||||
| 			Usage: "sync all resources from state file (repos && charts)", | 			Usage: "sync all resources from state file (repos && charts)", | ||||||
|  |  | ||||||
|  | @ -115,6 +115,44 @@ func (state *HelmState) SyncCharts(helm helmexec.Interface, additonalValues []st | ||||||
| 	return nil | 	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 { | func (state *HelmState) DeleteCharts(helm helmexec.Interface) []error { | ||||||
| 	var wg sync.WaitGroup | 	var wg sync.WaitGroup | ||||||
| 	errs := []error{} | 	errs := []error{} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue