diff --git a/CHANGELOG.md b/CHANGELOG.md index c526c28b..35560048 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 1.0.2 (2019/07/01) + +* Worker pool can be full while retrieving tags + ## 1.0.1 (2019/07/01) * Fix runtime error diff --git a/internal/app/diun.go b/internal/app/diun.go index d66295a6..5005d870 100644 --- a/internal/app/diun.go +++ b/internal/app/diun.go @@ -94,10 +94,6 @@ func (di *Diun) Run() { if err != nil { log.Error().Err(err).Msg("Job image error") } - err = di.imageRepoJob(t) - if err != nil { - log.Error().Err(err).Msg("Job image repo error") - } } di.wg.Done() }) diff --git a/internal/app/image.go b/internal/app/image.go index 6ae01699..bda06ff3 100644 --- a/internal/app/image.go +++ b/internal/app/image.go @@ -12,7 +12,6 @@ import ( ) type imageJob struct { - origin bool image model.Image registry *docker.RegistryClient } @@ -33,15 +32,55 @@ func (di *Diun) procImages() { continue } + image, err := registry.ParseImage(img.Name) + if err != nil { + log.Error().Err(err).Str("image", img.Name).Msg("Cannot parse image") + continue + } + di.wg.Add(1) err = di.pool.Invoke(imageJob{ - origin: true, image: img, registry: reg, }) if err != nil { log.Error().Err(err).Msgf("Invoking image job") } + + if !img.WatchRepo || image.Domain == "" { + continue + } + + tags, err := reg.Tags(docker.TagsOptions{ + Image: image, + Max: img.MaxTags, + Include: img.IncludeTags, + Exclude: img.ExcludeTags, + }) + if err != nil { + log.Error().Err(err).Str("image", image.String()).Msg("Cannot retrieve tags") + continue + } + + log.Debug().Str("image", image.String()).Msgf("%d tag(s) found in repository. %d will be analyzed (%d max, %d not included, %d excluded).", + tags.Total, + len(tags.List), + img.MaxTags, + tags.NotIncluded, + tags.Excluded, + ) + + for _, tag := range tags.List { + img.Name = fmt.Sprintf("%s/%s:%s", image.Domain, image.Path, tag) + di.wg.Add(1) + err = di.pool.Invoke(imageJob{ + image: img, + registry: reg, + }) + if err != nil { + log.Error().Err(err).Msgf("Invoking image job (tag)") + } + } } } @@ -96,44 +135,3 @@ func (di *Diun) imageJob(job imageJob) error { return nil } - -func (di *Diun) imageRepoJob(job imageJob) error { - image, err := registry.ParseImage(job.image.Name) - if err != nil { - return err - } - - if !job.origin || image.Domain == "" || !job.image.WatchRepo { - return nil - } - - tags, err := job.registry.Tags(docker.TagsOptions{ - Image: image, - Max: job.image.MaxTags, - Include: job.image.IncludeTags, - Exclude: job.image.ExcludeTags, - }) - if err != nil { - return err - } - - log.Debug().Str("image", image.String()).Msgf("%d tag(s) found in repository. %d will be analyzed (%d max, %d not included, %d excluded).", - tags.Total, - len(tags.List), - job.image.MaxTags, - tags.NotIncluded, - tags.Excluded, - ) - - job.origin = false - for _, tag := range tags.List { - job.image.Name = fmt.Sprintf("%s/%s:%s", image.Domain, image.Path, tag) - di.wg.Add(1) - err = di.pool.Invoke(job) - if err != nil { - log.Error().Err(err).Msgf("Invoking repo image job") - } - } - - return nil -}