Merge pull request #577 from nbendafi-yseop/feature/floating_tag
feat: force tracking semver tagpull/582/head
commit
2781b73cdd
|
@ -100,7 +100,7 @@ func TestCheckDeployment(t *testing.T) {
|
|||
}
|
||||
|
||||
ref, _ := image.Parse(imageA)
|
||||
keyA := getImageIdentifier(ref)
|
||||
keyA := getImageIdentifier(ref, false)
|
||||
if watcher.watched[keyA].digest != frc.digestToReturn {
|
||||
t.Errorf("unexpected digest")
|
||||
}
|
||||
|
@ -115,7 +115,7 @@ func TestCheckDeployment(t *testing.T) {
|
|||
}
|
||||
|
||||
refB, _ := image.Parse(imageB)
|
||||
keyB := getImageIdentifier(refB)
|
||||
keyB := getImageIdentifier(refB, false)
|
||||
if watcher.watched[keyB].digest != frc.digestToReturn {
|
||||
t.Errorf("unexpected digest")
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ func TestCheckECRDeployment(t *testing.T) {
|
|||
t.Fatalf("unexpected list of cron entries: %d", len(entries))
|
||||
}
|
||||
|
||||
keyA := getImageIdentifier(imgA)
|
||||
keyA := getImageIdentifier(imgA, false)
|
||||
|
||||
if len(watcher.watched) != 1 {
|
||||
t.Fatalf("expected to find 1 entry in watcher.watched map, found: %d", len(watcher.watched))
|
||||
|
|
|
@ -130,7 +130,6 @@ func testRunHelper(testCases []runTestCase, availableTags []string, t *testing.T
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
func TestWatchAllTagsJobWith2pointSemver(t *testing.T) {
|
||||
availableTags := []string{"1.3", "2.5", "2.7", "3.8"}
|
||||
testRunHelper([]runTestCase{{"1.3", "3.8", policy.NewSemverPolicy(policy.SemverPolicyTypeMajor, false)}}, availableTags, t)
|
||||
|
|
|
@ -90,10 +90,10 @@ func (w *RepositoryWatcher) Start(ctx context.Context) {
|
|||
}()
|
||||
}
|
||||
|
||||
func getImageIdentifier(ref *image.Reference) string {
|
||||
func getImageIdentifier(ref *image.Reference, keepTag bool) string {
|
||||
_, err := version.GetVersion(ref.Tag())
|
||||
// if failed to parse version, will need to watch digest
|
||||
if err != nil {
|
||||
if err != nil || keepTag == true {
|
||||
return ref.Registry() + "/" + ref.ShortName() + ":" + ref.Tag()
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ func (w *RepositoryWatcher) Unwatch(imageName string) error {
|
|||
}).Error("trigger.poll.RepositoryWatcher.Unwatch: failed to parse image")
|
||||
return err
|
||||
}
|
||||
key := getImageIdentifier(imageRef)
|
||||
key := getImageIdentifier(imageRef, false)
|
||||
_, ok := w.watched[key]
|
||||
if ok {
|
||||
w.cron.DeleteJob(key)
|
||||
|
@ -183,7 +183,8 @@ func (w *RepositoryWatcher) watch(image *types.TrackedImage) (string, error) {
|
|||
return "", fmt.Errorf("invalid cron schedule: %s", err)
|
||||
}
|
||||
|
||||
key := getImageIdentifier(image.Image)
|
||||
keepTag := image.Policy != nil && image.Policy.Name() == "force"
|
||||
key := getImageIdentifier(image.Image, keepTag)
|
||||
|
||||
// checking whether it's already being watched
|
||||
details, ok := w.watched[key]
|
||||
|
@ -248,7 +249,8 @@ func (w *RepositoryWatcher) addJob(ti *types.TrackedImage, schedule string) erro
|
|||
return err
|
||||
}
|
||||
|
||||
key := getImageIdentifier(ti.Image)
|
||||
keepTag := ti.Policy != nil && ti.Policy.Name() == "force"
|
||||
key := getImageIdentifier(ti.Image, keepTag)
|
||||
details := &watchDetails{
|
||||
trackedImage: ti,
|
||||
digest: digest, // current image digest
|
||||
|
@ -259,11 +261,15 @@ func (w *RepositoryWatcher) addJob(ti *types.TrackedImage, schedule string) erro
|
|||
// adding job to internal map
|
||||
w.watched[key] = details
|
||||
|
||||
// checking tag type, for versioned (semver) tags we setup a watch all tags job
|
||||
// and for non-semver types we create a single tag watcher which
|
||||
// checking tag type:
|
||||
// - for versioned (semver) tags:
|
||||
// - we setup a watch all tags job (default)
|
||||
// - if "force" to follow a floating tag, a single tag watcher is
|
||||
// setup, which checks digest
|
||||
// - for non-semver types we create a single tag watcher which
|
||||
// checks digest
|
||||
_, err = version.GetVersion(ti.Image.Tag())
|
||||
if err != nil {
|
||||
if err != nil || keepTag == true {
|
||||
// adding new job
|
||||
job := NewWatchTagJob(w.providers, w.registryClient, details)
|
||||
log.WithFields(log.Fields{
|
||||
|
|
|
@ -124,6 +124,50 @@ func TestWatchTagJob(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestWatchTagJobForce(t *testing.T) {
|
||||
|
||||
img, _ := image.Parse("gcr.io/v2-namespace/hello-world:1.1.1")
|
||||
fp := &fakeProvider{
|
||||
images: []*types.TrackedImage{
|
||||
{
|
||||
Image: img,
|
||||
Trigger: types.TriggerTypePoll,
|
||||
Provider: "fp",
|
||||
PollSchedule: types.KeelPollDefaultSchedule,
|
||||
Policy: policy.NewForcePolicy(true),
|
||||
},
|
||||
},
|
||||
}
|
||||
store, teardown := newTestingUtils()
|
||||
defer teardown()
|
||||
am := approvals.New(&approvals.Opts{
|
||||
Store: store,
|
||||
})
|
||||
|
||||
providers := provider.New([]provider.Provider{fp}, am)
|
||||
|
||||
frc := &fakeRegistryClient{
|
||||
digestToReturn: "sha256:0604af35299dd37ff23937d115d103532948b568a9dd8197d14c256a8ab8b0bb",
|
||||
tagsToReturn: []string{"1.1.2", "1.2.0"},
|
||||
}
|
||||
|
||||
watcher := NewRepositoryWatcher(providers, frc)
|
||||
|
||||
err := watcher.Watch(fp.images...)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("expected to find watching %s", img.Remote())
|
||||
}
|
||||
|
||||
if dig, ok := watcher.watched["gcr.io/v2-namespace/hello-world:1.1.1"]; ok {
|
||||
if dig.latest != "1.1.1" {
|
||||
t.Errorf("unexpected event repository tag: %s", dig.latest)
|
||||
}
|
||||
} else {
|
||||
t.Errorf("hello-world:1.1.1 watcher not found")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWatchTagJobLatest(t *testing.T) {
|
||||
|
||||
fp := &fakeProvider{}
|
||||
|
@ -272,8 +316,7 @@ func TestWatchMultipleTags(t *testing.T) {
|
|||
Trigger: types.TriggerTypePoll,
|
||||
Provider: "fp",
|
||||
PollSchedule: types.KeelPollDefaultSchedule,
|
||||
|
||||
Policy: policy.NewSemverPolicy(policy.SemverPolicyTypeMajor, true),
|
||||
Policy: policy.NewSemverPolicy(policy.SemverPolicyTypeMajor, true),
|
||||
},
|
||||
|
||||
{
|
||||
|
@ -338,14 +381,14 @@ func TestWatchMultipleTags(t *testing.T) {
|
|||
}
|
||||
|
||||
if dig, ok := watcher.watched["gcr.io/v2-namespace/greetings-world:master"]; ok != true {
|
||||
t.Errorf("alpha watcher not found")
|
||||
t.Errorf("master watcher not found")
|
||||
if dig.digest != "sha256:0604af35299dd37ff23937d115d103532948b568a9dd8197d14c256a8ab8b0bb" {
|
||||
t.Errorf("digest not set for alpha")
|
||||
t.Errorf("digest not set for master")
|
||||
}
|
||||
}
|
||||
|
||||
if det, ok := watcher.watched["gcr.io/v2-namespace/greetings-world"]; ok != true {
|
||||
t.Errorf("alpha watcher not found")
|
||||
t.Errorf("watcher not found")
|
||||
if det.latest != "5.0.0" {
|
||||
t.Errorf("expected to find a tag set for multiple tags watch job")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue