mirror of
https://github.com/crazy-max/diun.git
synced 2025-12-21 13:23:09 +01:00
fix defaults not handled by yaml configuration
This commit is contained in:
2
.github/workflows/e2e.yml
vendored
2
.github/workflows/e2e.yml
vendored
@@ -45,6 +45,8 @@ jobs:
|
|||||||
loglevel: info
|
loglevel: info
|
||||||
- folder: docker4
|
- folder: docker4
|
||||||
loglevel: info
|
loglevel: info
|
||||||
|
- folder: docker5
|
||||||
|
loglevel: info
|
||||||
- folder: dockerfile1
|
- folder: dockerfile1
|
||||||
loglevel: debug
|
loglevel: debug
|
||||||
- folder: dockerfile2
|
- folder: dockerfile2
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ func (di *Diun) createJob(job model.Job) {
|
|||||||
sublog.Error().Err(err).Msgf("Invoking job")
|
sublog.Error().Err(err).Msgf("Invoking job")
|
||||||
}
|
}
|
||||||
|
|
||||||
if job.Image.WatchRepo == nil || !*job.Image.WatchRepo || len(job.RegImage.Domain) == 0 {
|
if !*job.Image.WatchRepo || len(job.RegImage.Domain) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,8 +58,10 @@ func TestLoadFile(t *testing.T) {
|
|||||||
BaseURL: "https://hc-ping.com/",
|
BaseURL: "https://hc-ping.com/",
|
||||||
UUID: "5bf66975-d4c7-4bf5-bcc8-b8d8a82ea278",
|
UUID: "5bf66975-d4c7-4bf5-bcc8-b8d8a82ea278",
|
||||||
},
|
},
|
||||||
ImageDefaults: &model.Image{
|
ImageDefaults: &model.ImageDefaults{
|
||||||
NotifyOn: model.NotifyOnDefaults,
|
WatchRepo: utl.NewFalse(),
|
||||||
|
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
||||||
|
MaxTags: 5,
|
||||||
SortTags: registry.SortTagReverse,
|
SortTags: registry.SortTagReverse,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ watch:
|
|||||||
healthchecks:
|
healthchecks:
|
||||||
baseURL: https://hc-ping.com/
|
baseURL: https://hc-ping.com/
|
||||||
uuid: 5bf66975-d4c7-4bf5-bcc8-b8d8a82ea278
|
uuid: 5bf66975-d4c7-4bf5-bcc8-b8d8a82ea278
|
||||||
|
imageDefaults:
|
||||||
|
notifyOn:
|
||||||
|
- new
|
||||||
|
maxTags: 5
|
||||||
|
|
||||||
notif:
|
notif:
|
||||||
amqp:
|
amqp:
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package model
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crazy-max/diun/v4/pkg/registry"
|
|
||||||
"github.com/crazy-max/diun/v4/pkg/utl"
|
"github.com/crazy-max/diun/v4/pkg/utl"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -16,7 +15,7 @@ type Watch struct {
|
|||||||
RunOnStartup *bool `yaml:"runOnStartup,omitempty" json:"runOnStartup,omitempty" validate:"required"`
|
RunOnStartup *bool `yaml:"runOnStartup,omitempty" json:"runOnStartup,omitempty" validate:"required"`
|
||||||
CompareDigest *bool `yaml:"compareDigest,omitempty" json:"compareDigest,omitempty" validate:"required"`
|
CompareDigest *bool `yaml:"compareDigest,omitempty" json:"compareDigest,omitempty" validate:"required"`
|
||||||
Healthchecks *Healthchecks `yaml:"healthchecks,omitempty" json:"healthchecks,omitempty"`
|
Healthchecks *Healthchecks `yaml:"healthchecks,omitempty" json:"healthchecks,omitempty"`
|
||||||
ImageDefaults *Image `yaml:"defaults,omitempty" json:"defaults,omitempty"`
|
ImageDefaults *ImageDefaults `yaml:"imageDefaults,omitempty" json:"imageDefaults,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDefaults gets the default values
|
// GetDefaults gets the default values
|
||||||
@@ -33,8 +32,4 @@ func (s *Watch) SetDefaults() {
|
|||||||
s.FirstCheckNotif = utl.NewFalse()
|
s.FirstCheckNotif = utl.NewFalse()
|
||||||
s.RunOnStartup = utl.NewTrue()
|
s.RunOnStartup = utl.NewTrue()
|
||||||
s.CompareDigest = utl.NewTrue()
|
s.CompareDigest = utl.NewTrue()
|
||||||
s.ImageDefaults = &Image{
|
|
||||||
NotifyOn: NotifyOnDefaults,
|
|
||||||
SortTags: registry.SortTagReverse,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
31
internal/model/watch_imagedefaults.go
Normal file
31
internal/model/watch_imagedefaults.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/crazy-max/diun/v4/pkg/registry"
|
||||||
|
"github.com/crazy-max/diun/v4/pkg/utl"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ImageDefaults holds data necessary for image defaults configuration
|
||||||
|
type ImageDefaults struct {
|
||||||
|
WatchRepo *bool `yaml:"watchRepo,omitempty" json:"watchRepo,omitempty"`
|
||||||
|
NotifyOn []NotifyOn `yaml:"notifyOn,omitempty" json:"notifyOn,omitempty"`
|
||||||
|
MaxTags int `yaml:"maxTags,omitempty" json:"maxTags,omitempty"`
|
||||||
|
SortTags registry.SortTag `yaml:"sortTags,omitempty" json:"sortTags,omitempty"`
|
||||||
|
IncludeTags []string `yaml:"includeTags,omitempty" json:"includeTags,omitempty"`
|
||||||
|
ExcludeTags []string `yaml:"excludeTags,omitempty" json:"excludeTags,omitempty"`
|
||||||
|
Metadata map[string]string `yaml:"metadata,omitempty" json:"metadata,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDefaults gets the default values
|
||||||
|
func (s *ImageDefaults) GetDefaults() *Watch {
|
||||||
|
n := &Watch{}
|
||||||
|
n.SetDefaults()
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetDefaults sets the default values
|
||||||
|
func (s *ImageDefaults) SetDefaults() {
|
||||||
|
s.WatchRepo = utl.NewFalse()
|
||||||
|
s.NotifyOn = NotifyOnDefaults
|
||||||
|
s.SortTags = registry.SortTagReverse
|
||||||
|
}
|
||||||
@@ -18,19 +18,25 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// ValidateImage returns a standard image through Docker labels
|
// ValidateImage returns a standard image through Docker labels
|
||||||
func ValidateImage(image string, metadata, labels map[string]string, watchByDef bool, imageDefaults model.Image) (img model.Image, err error) {
|
func ValidateImage(image string, metadata, labels map[string]string, watchByDef bool, imageDefaults *model.ImageDefaults) (img model.Image, err error) {
|
||||||
img = model.Image{
|
img = model.Image{
|
||||||
Name: image,
|
Name: image,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mergo.Merge(&img, imageDefaults); err != nil {
|
if imageDefaults != nil {
|
||||||
return img, &invalidLabelError{errors.Wrapf(err, "failed to merge image defaults for image %s", image)}
|
img.WatchRepo = imageDefaults.WatchRepo
|
||||||
|
img.NotifyOn = imageDefaults.NotifyOn
|
||||||
|
img.MaxTags = imageDefaults.MaxTags
|
||||||
|
img.SortTags = imageDefaults.SortTags
|
||||||
|
img.IncludeTags = imageDefaults.IncludeTags
|
||||||
|
img.ExcludeTags = imageDefaults.ExcludeTags
|
||||||
|
img.Metadata = imageDefaults.Metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
if enableStr, ok := labels["diun.enable"]; ok {
|
if enableStr, ok := labels["diun.enable"]; ok {
|
||||||
enable, err := strconv.ParseBool(enableStr)
|
enable, err := strconv.ParseBool(enableStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return img, &invalidLabelError{errors.Wrapf(err, "cannot parse %q value of label diun.enable", enableStr)}
|
return img, errors.Wrapf(err, "cannot parse %q value of label diun.enable", enableStr)
|
||||||
}
|
}
|
||||||
if !enable {
|
if !enable {
|
||||||
return model.Image{}, nil
|
return model.Image{}, nil
|
||||||
@@ -47,7 +53,7 @@ func ValidateImage(image string, metadata, labels map[string]string, watchByDef
|
|||||||
if watchRepo, err := strconv.ParseBool(value); err == nil {
|
if watchRepo, err := strconv.ParseBool(value); err == nil {
|
||||||
img.WatchRepo = &watchRepo
|
img.WatchRepo = &watchRepo
|
||||||
} else {
|
} else {
|
||||||
return img, &invalidLabelError{errors.Wrapf(err, "cannot parse %q value of label %s", value, key)}
|
return img, errors.Wrapf(err, "cannot parse %q value of label %s", value, key)
|
||||||
}
|
}
|
||||||
case key == "diun.notify_on":
|
case key == "diun.notify_on":
|
||||||
if len(value) == 0 {
|
if len(value) == 0 {
|
||||||
@@ -57,7 +63,7 @@ func ValidateImage(image string, metadata, labels map[string]string, watchByDef
|
|||||||
for _, no := range strings.Split(value, ";") {
|
for _, no := range strings.Split(value, ";") {
|
||||||
notifyOn := model.NotifyOn(no)
|
notifyOn := model.NotifyOn(no)
|
||||||
if !notifyOn.Valid() {
|
if !notifyOn.Valid() {
|
||||||
return img, &invalidLabelError{errors.Errorf("unknown notify status %q", value)}
|
return img, errors.Errorf("unknown notify status %q", value)
|
||||||
}
|
}
|
||||||
img.NotifyOn = append(img.NotifyOn, notifyOn)
|
img.NotifyOn = append(img.NotifyOn, notifyOn)
|
||||||
}
|
}
|
||||||
@@ -67,12 +73,12 @@ func ValidateImage(image string, metadata, labels map[string]string, watchByDef
|
|||||||
}
|
}
|
||||||
sortTags := registry.SortTag(value)
|
sortTags := registry.SortTag(value)
|
||||||
if !sortTags.Valid() {
|
if !sortTags.Valid() {
|
||||||
return img, &invalidLabelError{errors.Errorf("unknown sort tags type %q", value)}
|
return img, errors.Errorf("unknown sort tags type %q", value)
|
||||||
}
|
}
|
||||||
img.SortTags = sortTags
|
img.SortTags = sortTags
|
||||||
case key == "diun.max_tags":
|
case key == "diun.max_tags":
|
||||||
if img.MaxTags, err = strconv.Atoi(value); err != nil {
|
if img.MaxTags, err = strconv.Atoi(value); err != nil {
|
||||||
return img, &invalidLabelError{errors.Wrapf(err, "cannot parse %q value of label %s", value, key)}
|
return img, errors.Wrapf(err, "cannot parse %q value of label %s", value, key)
|
||||||
}
|
}
|
||||||
case key == "diun.include_tags":
|
case key == "diun.include_tags":
|
||||||
img.IncludeTags = strings.Split(value, ";")
|
img.IncludeTags = strings.Split(value, ";")
|
||||||
@@ -85,7 +91,7 @@ func ValidateImage(image string, metadata, labels map[string]string, watchByDef
|
|||||||
case key == "diun.platform":
|
case key == "diun.platform":
|
||||||
platform, err := platforms.Parse(value)
|
platform, err := platforms.Parse(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return img, &invalidLabelError{errors.Wrapf(err, "cannot parse %q platform of label %s", value, key)}
|
return img, errors.Wrapf(err, "cannot parse %q platform of label %s", value, key)
|
||||||
}
|
}
|
||||||
img.Platform = model.ImagePlatform{
|
img.Platform = model.ImagePlatform{
|
||||||
OS: platform.OS,
|
OS: platform.OS,
|
||||||
@@ -98,7 +104,7 @@ func ValidateImage(image string, metadata, labels map[string]string, watchByDef
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err := validateMetadataKey(mkey); err != nil {
|
if err := validateMetadataKey(mkey); err != nil {
|
||||||
return img, &invalidLabelError{errors.Wrapf(err, "invalid metadata key %q", mkey)}
|
return img, errors.Wrapf(err, "invalid metadata key %q", mkey)
|
||||||
}
|
}
|
||||||
if img.Metadata == nil {
|
if img.Metadata == nil {
|
||||||
img.Metadata = map[string]string{}
|
img.Metadata = map[string]string{}
|
||||||
@@ -121,15 +127,3 @@ func validateMetadataKey(key string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type invalidLabelError struct {
|
|
||||||
error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *invalidLabelError) Error() string {
|
|
||||||
return e.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *invalidLabelError) Unwrap() error {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"github.com/crazy-max/diun/v4/internal/model"
|
"github.com/crazy-max/diun/v4/internal/model"
|
||||||
"github.com/crazy-max/diun/v4/pkg/registry"
|
"github.com/crazy-max/diun/v4/pkg/registry"
|
||||||
"github.com/crazy-max/diun/v4/pkg/utl"
|
"github.com/crazy-max/diun/v4/pkg/utl"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -16,9 +17,9 @@ func TestValidateImage(t *testing.T) {
|
|||||||
metadata map[string]string
|
metadata map[string]string
|
||||||
labels map[string]string
|
labels map[string]string
|
||||||
watchByDef bool
|
watchByDef bool
|
||||||
imageDefaults model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
expectedImage model.Image
|
expectedImage model.Image
|
||||||
expectedErr interface{}
|
expectedErr error
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Test with digest",
|
name: "Test with digest",
|
||||||
@@ -76,9 +77,8 @@ func TestValidateImage(t *testing.T) {
|
|||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.Errorf(`cannot parse "chickens" value of label diun.enable`),
|
||||||
},
|
},
|
||||||
// Test diun.regopt
|
|
||||||
{
|
{
|
||||||
name: "Set regopt",
|
name: "Set regopt",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -86,7 +86,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.regopt": "foo",
|
"diun.regopt": "foo",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
imageDefaults: &model.ImageDefaults{},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
RegOpt: "foo",
|
RegOpt: "foo",
|
||||||
@@ -100,49 +100,17 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.regopt": "",
|
"diun.regopt": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
RegOpt: "",
|
RegOpt: "",
|
||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "Default regopt",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
RegOpt: "foo",
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
RegOpt: "foo",
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Override default regopt",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{
|
|
||||||
"diun.regopt": "bar",
|
|
||||||
},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
RegOpt: "foo",
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
RegOpt: "bar",
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
// Test watch_repo
|
|
||||||
{
|
{
|
||||||
name: "Include using global settings",
|
name: "Include using global settings",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
WatchRepo: utl.NewTrue(),
|
WatchRepo: utl.NewTrue(),
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -158,11 +126,11 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.watch_repo": "chickens",
|
"diun.watch_repo": "chickens",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{},
|
imageDefaults: &model.ImageDefaults{},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`cannot parse "chickens" value of label diun.watch_repo`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Override default image values with labels (true > false)",
|
name: "Override default image values with labels (true > false)",
|
||||||
@@ -171,7 +139,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.watch_repo": "false",
|
"diun.watch_repo": "false",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
WatchRepo: utl.NewTrue(),
|
WatchRepo: utl.NewTrue(),
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -187,7 +155,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.watch_repo": "true",
|
"diun.watch_repo": "true",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
WatchRepo: utl.NewFalse(),
|
WatchRepo: utl.NewFalse(),
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -196,7 +164,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
// Test diun.notify_on
|
|
||||||
{
|
{
|
||||||
name: "Set valid notify_on",
|
name: "Set valid notify_on",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -204,7 +171,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.notify_on": "new",
|
"diun.notify_on": "new",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
||||||
@@ -218,12 +184,11 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.notify_on": "chickens",
|
"diun.notify_on": "chickens",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
NotifyOn: []model.NotifyOn{},
|
NotifyOn: []model.NotifyOn{},
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`unknown notify status "chickens"`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Set empty notify_on",
|
name: "Set empty notify_on",
|
||||||
@@ -232,7 +197,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.notify_on": "",
|
"diun.notify_on": "",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
@@ -243,7 +207,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -259,7 +223,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.notify_on": "update",
|
"diun.notify_on": "update",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
NotifyOn: []model.NotifyOn{model.NotifyOnNew},
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -268,7 +232,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
// Test diun.sort_tags
|
|
||||||
{
|
{
|
||||||
name: "Set valid sort_tags",
|
name: "Set valid sort_tags",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -276,7 +239,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.sort_tags": "semver",
|
"diun.sort_tags": "semver",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
SortTags: registry.SortTagSemver,
|
SortTags: registry.SortTagSemver,
|
||||||
@@ -290,11 +252,10 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.sort_tags": "chickens",
|
"diun.sort_tags": "chickens",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`unknown sort tags type "chickens"`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Set empty sort_tags",
|
name: "Set empty sort_tags",
|
||||||
@@ -303,7 +264,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.sort_tags": "",
|
"diun.sort_tags": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
@@ -314,7 +274,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
SortTags: registry.SortTagSemver,
|
SortTags: registry.SortTagSemver,
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -330,7 +290,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.sort_tags": "reverse",
|
"diun.sort_tags": "reverse",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
SortTags: registry.SortTagSemver,
|
SortTags: registry.SortTagSemver,
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -339,7 +299,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
// Test diun.max_tags
|
|
||||||
{
|
{
|
||||||
name: "Set valid max_tags",
|
name: "Set valid max_tags",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -347,7 +306,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.max_tags": "10",
|
"diun.max_tags": "10",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
MaxTags: 10,
|
MaxTags: 10,
|
||||||
@@ -361,11 +319,10 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.max_tags": "chickens",
|
"diun.max_tags": "chickens",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`cannot parse "chickens" value of label diun.max_tags`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Set empty max_tags",
|
name: "Set empty max_tags",
|
||||||
@@ -374,18 +331,17 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.max_tags": "",
|
"diun.max_tags": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`cannot parse "" value of label diun.max_tags`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Default max_tags",
|
name: "Default max_tags",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
MaxTags: 10,
|
MaxTags: 10,
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -401,7 +357,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.max_tags": "11",
|
"diun.max_tags": "11",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
MaxTags: 10,
|
MaxTags: 10,
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -410,7 +366,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
// Test diun.include_tags
|
|
||||||
{
|
{
|
||||||
name: "Set include_tags",
|
name: "Set include_tags",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -418,7 +373,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.include_tags": "alpine;ubuntu",
|
"diun.include_tags": "alpine;ubuntu",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
IncludeTags: []string{"alpine", "ubuntu"},
|
IncludeTags: []string{"alpine", "ubuntu"},
|
||||||
@@ -432,7 +386,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.include_tags": "",
|
"diun.include_tags": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
IncludeTags: []string{""},
|
IncludeTags: []string{""},
|
||||||
@@ -444,7 +397,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
IncludeTags: []string{"alpine"},
|
IncludeTags: []string{"alpine"},
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -460,7 +413,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.include_tags": "ubuntu",
|
"diun.include_tags": "ubuntu",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
IncludeTags: []string{"alpine"},
|
IncludeTags: []string{"alpine"},
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -469,7 +422,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
// Test diun.exclude_tags
|
|
||||||
{
|
{
|
||||||
name: "Set exclude_tags",
|
name: "Set exclude_tags",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -477,7 +429,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.exclude_tags": "alpine;ubuntu",
|
"diun.exclude_tags": "alpine;ubuntu",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
ExcludeTags: []string{"alpine", "ubuntu"},
|
ExcludeTags: []string{"alpine", "ubuntu"},
|
||||||
@@ -491,7 +442,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.exclude_tags": "",
|
"diun.exclude_tags": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
ExcludeTags: []string{""},
|
ExcludeTags: []string{""},
|
||||||
@@ -503,7 +453,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
ExcludeTags: []string{"alpine"},
|
ExcludeTags: []string{"alpine"},
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -519,7 +469,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.exclude_tags": "ubuntu",
|
"diun.exclude_tags": "ubuntu",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
ExcludeTags: []string{"alpine"},
|
ExcludeTags: []string{"alpine"},
|
||||||
},
|
},
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
@@ -528,7 +478,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
// Test diun.hub_tpl
|
|
||||||
{
|
{
|
||||||
name: "Set hub_tpl",
|
name: "Set hub_tpl",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -536,7 +485,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.hub_tpl": "foo",
|
"diun.hub_tpl": "foo",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
HubTpl: "foo",
|
HubTpl: "foo",
|
||||||
@@ -550,44 +498,12 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.hub_tpl": "",
|
"diun.hub_tpl": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
HubTpl: "",
|
HubTpl: "",
|
||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "Default hub_tpl",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
HubTpl: "foo",
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
HubTpl: "foo",
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Override default hub_tpl",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{
|
|
||||||
"diun.hub_tpl": "bar",
|
|
||||||
},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
HubTpl: "foo",
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
HubTpl: "bar",
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
// Test diun.hub_link
|
|
||||||
{
|
{
|
||||||
name: "Set hub_link",
|
name: "Set hub_link",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -595,7 +511,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.hub_link": "foo",
|
"diun.hub_link": "foo",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
HubLink: "foo",
|
HubLink: "foo",
|
||||||
@@ -609,44 +524,12 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.hub_link": "",
|
"diun.hub_link": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
HubLink: "",
|
HubLink: "",
|
||||||
},
|
},
|
||||||
expectedErr: nil,
|
expectedErr: nil,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "Default hub_link",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
HubLink: "foo",
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
HubLink: "foo",
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Override default hub_link",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{
|
|
||||||
"diun.hub_link": "bar",
|
|
||||||
},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
HubLink: "foo",
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
HubLink: "bar",
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
// Test diun.platform
|
|
||||||
{
|
{
|
||||||
name: "Set valid platform",
|
name: "Set valid platform",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -654,7 +537,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.platform": "linux/arm/v7",
|
"diun.platform": "linux/arm/v7",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
Platform: model.ImagePlatform{
|
Platform: model.ImagePlatform{
|
||||||
@@ -672,11 +554,10 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.platform": "chickens",
|
"diun.platform": "chickens",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`cannot parse "chickens" platform of label diun.platform`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Set empty platform",
|
name: "Set empty platform",
|
||||||
@@ -685,60 +566,12 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.platform": "",
|
"diun.platform": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
Platform: model.ImagePlatform{},
|
Platform: model.ImagePlatform{},
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`cannot parse "" platform of label diun.platform`),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "Default platform",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
Platform: model.ImagePlatform{
|
|
||||||
OS: "linux",
|
|
||||||
Arch: "arm",
|
|
||||||
Variant: "v7",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
Platform: model.ImagePlatform{
|
|
||||||
OS: "linux",
|
|
||||||
Arch: "arm",
|
|
||||||
Variant: "v7",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Override default platform",
|
|
||||||
image: "myimg",
|
|
||||||
watchByDef: true,
|
|
||||||
labels: map[string]string{
|
|
||||||
"diun.platform": "linux/arm/v6",
|
|
||||||
},
|
|
||||||
imageDefaults: model.Image{
|
|
||||||
Platform: model.ImagePlatform{
|
|
||||||
OS: "linux",
|
|
||||||
Arch: "arm",
|
|
||||||
Variant: "v7",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedImage: model.Image{
|
|
||||||
Name: "myimg",
|
|
||||||
Platform: model.ImagePlatform{
|
|
||||||
OS: "linux",
|
|
||||||
Arch: "arm",
|
|
||||||
Variant: "v6",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedErr: nil,
|
|
||||||
},
|
|
||||||
// Test diun.metadata
|
|
||||||
{
|
{
|
||||||
name: "Set valid metadata",
|
name: "Set valid metadata",
|
||||||
image: "myimg",
|
image: "myimg",
|
||||||
@@ -746,7 +579,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.metadata.foo123": "bar",
|
"diun.metadata.foo123": "bar",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
Metadata: map[string]string{
|
Metadata: map[string]string{
|
||||||
@@ -762,11 +594,10 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.metadata.lots of chickens": "bar",
|
"diun.metadata.lots of chickens": "bar",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
expectedErr: &invalidLabelError{},
|
expectedErr: errors.New(`invalid metadata key "lots of chickens"`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Set empty metadata key",
|
name: "Set empty metadata key",
|
||||||
@@ -775,7 +606,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.metadata.": "bar",
|
"diun.metadata.": "bar",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
@@ -787,7 +617,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
"diun.metadata.foo123": "",
|
"diun.metadata.foo123": "",
|
||||||
},
|
},
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
imageDefaults: model.Image{},
|
|
||||||
expectedImage: model.Image{
|
expectedImage: model.Image{
|
||||||
Name: "myimg",
|
Name: "myimg",
|
||||||
},
|
},
|
||||||
@@ -797,7 +626,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
image: "myimg",
|
image: "myimg",
|
||||||
watchByDef: true,
|
watchByDef: true,
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
Metadata: map[string]string{
|
Metadata: map[string]string{
|
||||||
"foo123": "bar",
|
"foo123": "bar",
|
||||||
},
|
},
|
||||||
@@ -817,7 +646,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.metadata.biz123": "baz",
|
"diun.metadata.biz123": "baz",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
Metadata: map[string]string{
|
Metadata: map[string]string{
|
||||||
"foo123": "bar",
|
"foo123": "bar",
|
||||||
},
|
},
|
||||||
@@ -838,7 +667,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
labels: map[string]string{
|
labels: map[string]string{
|
||||||
"diun.metadata.foo123": "baz",
|
"diun.metadata.foo123": "baz",
|
||||||
},
|
},
|
||||||
imageDefaults: model.Image{
|
imageDefaults: &model.ImageDefaults{
|
||||||
Metadata: map[string]string{
|
Metadata: map[string]string{
|
||||||
"foo123": "bar",
|
"foo123": "bar",
|
||||||
},
|
},
|
||||||
@@ -856,7 +685,6 @@ func TestValidateImage(t *testing.T) {
|
|||||||
for _, tt := range cases {
|
for _, tt := range cases {
|
||||||
tt := tt
|
tt := tt
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
img, err := ValidateImage(
|
img, err := ValidateImage(
|
||||||
tt.image,
|
tt.image,
|
||||||
tt.metadata,
|
tt.metadata,
|
||||||
@@ -868,12 +696,7 @@ func TestValidateImage(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, tt.expectedImage, img)
|
assert.Equal(t, tt.expectedImage, img)
|
||||||
} else {
|
} else {
|
||||||
switch err.(type) {
|
assert.ErrorContains(t, err, tt.expectedErr.Error())
|
||||||
case *invalidLabelError:
|
|
||||||
assert.Error(t, err)
|
|
||||||
default:
|
|
||||||
assert.Error(t, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ func (c *Client) listContainerImage() []model.Image {
|
|||||||
Str("ctn_image", imageName).
|
Str("ctn_image", imageName).
|
||||||
Interface("ctn_labels", ctn.Labels).
|
Interface("ctn_labels", ctn.Labels).
|
||||||
Msg("Validate image")
|
Msg("Validate image")
|
||||||
image, err := provider.ValidateImage(imageName, metadata(ctn), ctn.Labels, *c.config.WatchByDefault, *c.imageDefaults)
|
image, err := provider.ValidateImage(imageName, metadata(ctn), ctn.Labels, *c.config.WatchByDefault, c.imageDefaults)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).
|
c.logger.Error().Err(err).
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ type Client struct {
|
|||||||
*provider.Client
|
*provider.Client
|
||||||
config *model.PrdDocker
|
config *model.PrdDocker
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
imageDefaults *model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates new docker provider instance
|
// New creates new docker provider instance
|
||||||
func New(config *model.PrdDocker, imageDefaults *model.Image) *provider.Client {
|
func New(config *model.PrdDocker, imageDefaults *model.ImageDefaults) *provider.Client {
|
||||||
return &provider.Client{
|
return &provider.Client{
|
||||||
Handler: &Client{
|
Handler: &Client{
|
||||||
config: config,
|
config: config,
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ type Client struct {
|
|||||||
*provider.Client
|
*provider.Client
|
||||||
config *model.PrdDockerfile
|
config *model.PrdDockerfile
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
imageDefaults *model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates new dockerfile provider instance
|
// New creates new dockerfile provider instance
|
||||||
func New(config *model.PrdDockerfile, imageDefaults *model.Image) *provider.Client {
|
func New(config *model.PrdDockerfile, imageDefaults *model.ImageDefaults) *provider.Client {
|
||||||
return &provider.Client{
|
return &provider.Client{
|
||||||
Handler: &Client{
|
Handler: &Client{
|
||||||
config: config,
|
config: config,
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ func (c *Client) listExtImage() (list []model.Image) {
|
|||||||
Interface("dfile_comments", fromImage.Comments).
|
Interface("dfile_comments", fromImage.Comments).
|
||||||
Int("dfile_line", fromImage.Line).
|
Int("dfile_line", fromImage.Line).
|
||||||
Msg("Validate image")
|
Msg("Validate image")
|
||||||
image, err := provider.ValidateImage(fromImage.Name, nil, c.extractLabels(fromImage.Comments), true, *c.imageDefaults)
|
image, err := provider.ValidateImage(fromImage.Name, nil, c.extractLabels(fromImage.Comments), true, c.imageDefaults)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).
|
c.logger.Error().Err(err).
|
||||||
Str("dfile_image", fromImage.Name).
|
Str("dfile_image", fromImage.Name).
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ type Client struct {
|
|||||||
*provider.Client
|
*provider.Client
|
||||||
config *model.PrdFile
|
config *model.PrdFile
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
imageDefaults *model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates new file provider instance
|
// New creates new file provider instance
|
||||||
func New(config *model.PrdFile, imageDefaults *model.Image) *provider.Client {
|
func New(config *model.PrdFile, imageDefaults *model.ImageDefaults) *provider.Client {
|
||||||
return &provider.Client{
|
return &provider.Client{
|
||||||
Handler: &Client{
|
Handler: &Client{
|
||||||
config: config,
|
config: config,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultImageDefaults = model.Image{
|
defaultImageDefaults = model.ImageDefaults{
|
||||||
NotifyOn: model.NotifyOnDefaults,
|
NotifyOn: model.NotifyOnDefaults,
|
||||||
SortTags: registry.SortTagReverse,
|
SortTags: registry.SortTagReverse,
|
||||||
}
|
}
|
||||||
@@ -173,7 +173,9 @@ func TestListJobDirectory(t *testing.T) {
|
|||||||
func TestDefaultImageOptions(t *testing.T) {
|
func TestDefaultImageOptions(t *testing.T) {
|
||||||
fc := New(&model.PrdFile{
|
fc := New(&model.PrdFile{
|
||||||
Filename: "./fixtures/dockerhub.yml",
|
Filename: "./fixtures/dockerhub.yml",
|
||||||
}, &model.Image{WatchRepo: utl.NewTrue()})
|
}, &model.ImageDefaults{
|
||||||
|
WatchRepo: utl.NewTrue(),
|
||||||
|
})
|
||||||
|
|
||||||
for _, job := range fc.ListJob() {
|
for _, job := range fc.ListJob() {
|
||||||
assert.True(t, *job.Image.WatchRepo)
|
assert.True(t, *job.Image.WatchRepo)
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ type Client struct {
|
|||||||
*provider.Client
|
*provider.Client
|
||||||
config *model.PrdKubernetes
|
config *model.PrdKubernetes
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
imageDefaults *model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates new kubernetes provider instance
|
// New creates new kubernetes provider instance
|
||||||
func New(config *model.PrdKubernetes, imageDefaults *model.Image) *provider.Client {
|
func New(config *model.PrdKubernetes, imageDefaults *model.ImageDefaults) *provider.Client {
|
||||||
return &provider.Client{
|
return &provider.Client{
|
||||||
Handler: &Client{
|
Handler: &Client{
|
||||||
config: config,
|
config: config,
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ func (c *Client) listPodImage() []model.Image {
|
|||||||
Str("ctn_image", ctn.Image).
|
Str("ctn_image", ctn.Image).
|
||||||
Msg("Validate image")
|
Msg("Validate image")
|
||||||
|
|
||||||
image, err := provider.ValidateImage(ctn.Image, metadata(pod, ctn), pod.Annotations, *c.config.WatchByDefault, *c.imageDefaults)
|
image, err := provider.ValidateImage(ctn.Image, metadata(pod, ctn), pod.Annotations, *c.config.WatchByDefault, c.imageDefaults)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).
|
c.logger.Error().Err(err).
|
||||||
Str("pod_name", pod.Name).
|
Str("pod_name", pod.Name).
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ type Client struct {
|
|||||||
*provider.Client
|
*provider.Client
|
||||||
config *model.PrdNomad
|
config *model.PrdNomad
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
imageDefaults *model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates new nomad provider instance
|
// New creates new nomad provider instance
|
||||||
func New(config *model.PrdNomad, imageDefaults *model.Image) *provider.Client {
|
func New(config *model.PrdNomad, imageDefaults *model.ImageDefaults) *provider.Client {
|
||||||
return &provider.Client{
|
return &provider.Client{
|
||||||
Handler: &Client{
|
Handler: &Client{
|
||||||
config: config,
|
config: config,
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ func (c *Client) listTaskImages() []model.Image {
|
|||||||
c.logger.Error().Err(err).Msg("Cannot merge task metadata")
|
c.logger.Error().Err(err).Msg("Cannot merge task metadata")
|
||||||
}
|
}
|
||||||
|
|
||||||
image, err := provider.ValidateImage(imageName, metadata(job, taskGroup, task), labels, *c.config.WatchByDefault, *c.imageDefaults)
|
image, err := provider.ValidateImage(imageName, metadata(job, taskGroup, task), labels, *c.config.WatchByDefault, c.imageDefaults)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().
|
c.logger.Error().
|
||||||
Err(err).
|
Err(err).
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func (c *Client) listServiceImage() []model.Image {
|
|||||||
Str("ctn_image", svc.Spec.TaskTemplate.ContainerSpec.Image).
|
Str("ctn_image", svc.Spec.TaskTemplate.ContainerSpec.Image).
|
||||||
Msg("Validate image")
|
Msg("Validate image")
|
||||||
|
|
||||||
image, err := provider.ValidateImage(svc.Spec.TaskTemplate.ContainerSpec.Image, metadata(svc), svc.Spec.Labels, *c.config.WatchByDefault, *c.imageDefaults)
|
image, err := provider.ValidateImage(svc.Spec.TaskTemplate.ContainerSpec.Image, metadata(svc), svc.Spec.Labels, *c.config.WatchByDefault, c.imageDefaults)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).
|
c.logger.Error().Err(err).
|
||||||
Str("svc_name", svc.Spec.Name).
|
Str("svc_name", svc.Spec.Name).
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ type Client struct {
|
|||||||
*provider.Client
|
*provider.Client
|
||||||
config *model.PrdSwarm
|
config *model.PrdSwarm
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
imageDefaults *model.Image
|
imageDefaults *model.ImageDefaults
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates new swarm provider instance
|
// New creates new swarm provider instance
|
||||||
func New(config *model.PrdSwarm, imageDefaults *model.Image) *provider.Client {
|
func New(config *model.PrdSwarm, imageDefaults *model.ImageDefaults) *provider.Client {
|
||||||
return &provider.Client{
|
return &provider.Client{
|
||||||
Handler: &Client{
|
Handler: &Client{
|
||||||
config: config,
|
config: config,
|
||||||
|
|||||||
11
test/docker5/diun.yml
Normal file
11
test/docker5/diun.yml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
watch:
|
||||||
|
workers: 20
|
||||||
|
schedule: "0 */6 * * *"
|
||||||
|
imageDefaults:
|
||||||
|
watchRepo: true
|
||||||
|
notifyOn:
|
||||||
|
- new
|
||||||
|
maxTags: 5
|
||||||
|
|
||||||
|
providers:
|
||||||
|
docker: {}
|
||||||
Reference in New Issue
Block a user