Merge pull request #577 from nbendafi-yseop/feature/floating_tag

feat: force tracking semver tag
pull/582/head
Karolis 2021-02-22 12:54:09 +00:00 committed by GitHub
commit 2781b73cdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 65 additions and 17 deletions

View File

@ -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))

View File

@ -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)

View File

@ -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{

View File

@ -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")
}