110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
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")
|
|
}
|