Refactor into package structure

This commit is contained in:
2020-11-11 01:46:48 +01:00
parent 04fa50d9ae
commit 27993e9fa0
13 changed files with 329 additions and 179 deletions

View File

@ -0,0 +1,109 @@
package worker
import (
"hulthe.net/lookbuilding/internal/pkg/docker"
l "hulthe.net/lookbuilding/internal/pkg/logging"
"hulthe.net/lookbuilding/internal/pkg/registry"
"hulthe.net/lookbuilding/internal/pkg/semver"
"github.com/docker/docker/client"
)
var (
triggerCh = make(chan struct{})
)
func TriggerScan() {
triggerCh <- struct{}{}
}
func Worker() {
l.Logger.Debugf("background worker starting")
responseCh := make(chan struct{})
workerRunning := false
triggerWaiting := false
for {
select {
case _ = <-triggerCh:
if workerRunning {
triggerWaiting = true
} else {
workerRunning = true
go func() {
checkAndDoUpdate()
responseCh <- struct{}{}
}()
}
case _ = <-responseCh:
if triggerWaiting {
triggerWaiting = false
go func() {
checkAndDoUpdate()
responseCh <- struct{}{}
}()
} else {
workerRunning = false
}
}
}
}
func checkAndDoUpdate() {
l.Logger.Infof("starting scan")
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
hub, err := registry.AnonymousClient()
if err != nil {
panic(err)
}
labeledContainers := docker.GetLabeledContainers(cli)
l.Logger.Infof("found %d valid containers", len(labeledContainers))
for _, lc := range labeledContainers {
owner, repository, tag := lc.SplitImageParts()
name := lc.GetName()
imageName := docker.CombineImageParts(owner, repository, nil)
if tag == nil {
l.Logger.Errorf(`no tag specified for container "%s", ignoring`, name)
continue
}
l.Logger.Infof(`container "%s" image="%s" mode=%s tag="%s"`, name, imageName, lc.Mode.Label(), *tag)
repoTags, err := hub.GetRepoTags(owner, repository)
if err != nil {
panic(err)
}
l.Logger.Infof(`tags in registry for "%s": %d`, name, len(repoTags))
for _, tag := range repoTags {
svt := semver.ParseTagAsSemVer(tag.Name)
l.Logger.Infof(`tag_name="%s" semver=%t`, tag.Name, svt != nil)
}
shouldUpdateTo := lc.Mode.ShouldUpdate(*tag, repoTags)
if shouldUpdateTo != nil {
l.Logger.Infof(`updating %s from %s to: %s`, name, *tag, shouldUpdateTo.Name)
go func() {
err = lc.UpdateTo(cli, *shouldUpdateTo)
if err != nil {
l.Logger.Error(err)
}
}()
} else {
l.Logger.Infof("no update available for container %s", name)
}
}
l.Logger.Infof("all done")
}