Files
diun/internal/provider/docker/container.go
2019-12-14 02:18:42 +01:00

99 lines
2.4 KiB
Go

package docker
import (
"fmt"
"reflect"
"strconv"
"strings"
"github.com/crazy-max/diun/internal/model"
"github.com/crazy-max/diun/pkg/docker"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"github.com/rs/zerolog/log"
)
func (c *Client) listContainerImage(elt model.PrdDocker) []model.Image {
sublog := log.With().
Str("provider", "docker").
Str("id", elt.ID).
Logger()
cli, err := docker.NewClient(elt.Endpoint, elt.ApiVersion, elt.TLSCertsPath, elt.TLSVerify)
if err != nil {
sublog.Error().Err(err).Msg("Cannot create Docker client")
return []model.Image{}
}
ctnFilter := filters.NewArgs()
ctnFilter.Add("status", "running")
if elt.WatchStopped {
ctnFilter.Add("status", "created")
ctnFilter.Add("status", "exited")
}
ctns, err := cli.Containers(ctnFilter)
if err != nil {
sublog.Error().Err(err).Msg("Cannot list Docker containers")
return []model.Image{}
}
var list []model.Image
for _, ctn := range ctns {
image, err := c.containerImage(elt, ctn)
if err != nil {
sublog.Error().Err(err).Msgf("Cannot get image for container %s", ctn.ID)
continue
} else if reflect.DeepEqual(image, model.Image{}) {
sublog.Debug().Msgf("Watch disabled for container %s", ctn.ID)
continue
}
list = append(list, image)
}
return list
}
func (c *Client) containerImage(elt model.PrdDocker, ctn types.Container) (img model.Image, err error) {
img = model.Image{
Name: ctn.Image,
}
if enableStr, ok := ctn.Labels["diun.enable"]; ok {
enable, err := strconv.ParseBool(enableStr)
if err != nil {
return img, fmt.Errorf("cannot parse %s value of label diun.enable", enableStr)
}
if !enable {
return model.Image{}, nil
}
} else if !elt.WatchByDefault {
return model.Image{}, nil
}
for key, value := range ctn.Labels {
switch key {
case "diun.os":
img.Os = value
case "diun.arch":
img.Arch = value
case "diun.regopts_id":
img.RegOptsID = value
case "diun.watch_repo":
if img.WatchRepo, err = strconv.ParseBool(value); err != nil {
return img, fmt.Errorf("cannot parse %s value of label %s", value, key)
}
case "diun.max_tags":
if img.MaxTags, err = strconv.Atoi(value); err != nil {
return img, fmt.Errorf("cannot parse %s value of label %s", value, key)
}
case "diun.include_tags":
img.IncludeTags = strings.Split(value, ";")
case "diun.exclude_tags":
img.ExcludeTags = strings.Split(value, ";")
}
}
return img, nil
}