Fix race condition. Add concurrency option similiar to DiffReleases
This commit is contained in:
parent
d380b8d550
commit
2b07b9715e
8
main.go
8
main.go
|
|
@ -134,6 +134,11 @@ func main() {
|
||||||
Name: "sync-repos",
|
Name: "sync-repos",
|
||||||
Usage: "enable a repo sync prior to diffing",
|
Usage: "enable a repo sync prior to diffing",
|
||||||
},
|
},
|
||||||
|
cli.IntFlag{
|
||||||
|
Name: "concurrency",
|
||||||
|
Value: 0,
|
||||||
|
Usage: "maximum number of concurrent helm processes to run, 0 is unlimited",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
state, helm, err := before(c)
|
state, helm, err := before(c)
|
||||||
|
|
@ -156,8 +161,9 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
values := c.StringSlice("values")
|
values := c.StringSlice("values")
|
||||||
|
workers := c.Int("concurrency")
|
||||||
|
|
||||||
errs := state.DiffReleases(helm, values)
|
errs := state.DiffReleases(helm, values, workers)
|
||||||
return clean(state, errs)
|
return clean(state, errs)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -230,45 +230,75 @@ func (state *HelmState) SyncReleases(helm helmexec.Interface, additionalValues [
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (state *HelmState) DiffReleases(helm helmexec.Interface, additionalValues []string) []error {
|
func (state *HelmState) DiffReleases(helm helmexec.Interface, additionalValues []string, workerLimit int) []error {
|
||||||
var wg sync.WaitGroup
|
var wgRelease sync.WaitGroup
|
||||||
|
var wgError sync.WaitGroup
|
||||||
errs := []error{}
|
errs := []error{}
|
||||||
|
jobQueue := make(chan *ReleaseSpec, len(state.Releases))
|
||||||
|
errQueue := make(chan error)
|
||||||
|
|
||||||
for i := 0; i < len(state.Releases); i++ {
|
if workerLimit < 1 {
|
||||||
release := &state.Releases[i]
|
workerLimit = len(state.Releases)
|
||||||
renderedName, err := renderTemplateString(release.Name)
|
}
|
||||||
if err != nil {
|
|
||||||
errs = append(errs, err)
|
|
||||||
}
|
|
||||||
wg.Add(1)
|
|
||||||
go func(wg *sync.WaitGroup, release *ReleaseSpec) {
|
|
||||||
// Plugin command doesn't support explicit namespace
|
|
||||||
release.Namespace = ""
|
|
||||||
flags, flagsErr := flagsForRelease(helm, state.BaseChartPath, release)
|
|
||||||
if flagsErr != nil {
|
|
||||||
errs = append(errs, flagsErr)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, value := range additionalValues {
|
wgRelease.Add(len(state.Releases))
|
||||||
valfile, err := filepath.Abs(value)
|
|
||||||
|
for w := 1; w <= workerLimit; w++ {
|
||||||
|
go func() {
|
||||||
|
for release := range jobQueue {
|
||||||
|
errs := []error{}
|
||||||
|
renderedName, err := renderTemplateString(release.Name)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
// Plugin command doesn't support explicit namespace
|
||||||
|
release.Namespace = ""
|
||||||
|
flags, err := flagsForRelease(helm, state.BaseChartPath, release)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(valfile); os.IsNotExist(err) {
|
for _, value := range additionalValues {
|
||||||
errs = append(errs, err)
|
valfile, err := filepath.Abs(value)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Stat(valfile); os.IsNotExist(err) {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
flags = append(flags, "--values", valfile)
|
||||||
}
|
}
|
||||||
flags = append(flags, "--values", valfile)
|
|
||||||
}
|
if len(errs) == 0 {
|
||||||
if len(errs) == 0 {
|
if err := helm.DiffRelease(renderedName, normalizeChart(state.BaseChartPath, release.Chart), flags...); err != nil {
|
||||||
if err := helm.DiffRelease(renderedName, normalizeChart(state.BaseChartPath, release.Chart), flags...); err != nil {
|
errs = append(errs, err)
|
||||||
errs = append(errs, err)
|
}
|
||||||
}
|
}
|
||||||
|
for _, err := range errs {
|
||||||
|
errQueue <- err
|
||||||
|
}
|
||||||
|
wgRelease.Done()
|
||||||
}
|
}
|
||||||
wg.Done()
|
}()
|
||||||
}(&wg, release)
|
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wgError.Add(1)
|
||||||
|
go func() {
|
||||||
|
for err := range errQueue {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
wgError.Done()
|
||||||
|
}()
|
||||||
|
|
||||||
|
for i := 0; i < len(state.Releases); i++ {
|
||||||
|
jobQueue <- &state.Releases[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
close(jobQueue)
|
||||||
|
wgRelease.Wait()
|
||||||
|
|
||||||
|
close(errQueue)
|
||||||
|
wgError.Wait()
|
||||||
|
|
||||||
if len(errs) != 0 {
|
if len(errs) != 0 {
|
||||||
return errs
|
return errs
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue