fix(master): remember the tag's deployed digest after any tag job (#9)
Renames last_auto_digest to last_tag_digest. FinishJob sets it to the pinned digest after any successful job whose to_ref had no digest, so a rollback holds however the update was started.
This commit is contained in:
@@ -4,6 +4,7 @@ package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -160,3 +161,48 @@ func TestFinishJob_WithoutAvailableLeavesItEmpty(t *testing.T) {
|
||||
assert.Nil(t, got.AvailableAt)
|
||||
assert.Equal(t, "r:1@sha256:d", got.DesiredRef)
|
||||
}
|
||||
|
||||
func TestFinishJob_RemembersTheDeployedDigestOfATagJob(t *testing.T) {
|
||||
good := "sha256:" + strings.Repeat("a", 64)
|
||||
old := "sha256:" + strings.Repeat("b", 64)
|
||||
ok := func(ref string) model.JobFinish {
|
||||
return model.JobFinish{Status: model.JobSucceeded, Ref: ref, StartedAt: t0, FinishedAt: t0}
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
trigger model.JobTrigger
|
||||
toRef string
|
||||
finish model.JobFinish
|
||||
want string
|
||||
}{
|
||||
{"webhook tag job", model.TriggerWebhook, "r:2", ok("r:2@" + good), good},
|
||||
{"manual tag job", model.TriggerManual, "r:2", ok("r:2@" + good), good},
|
||||
{"poll tag job", model.TriggerPoll, "r:2", ok("r:2@" + good), good},
|
||||
{"pinned pick leaves it", model.TriggerManual, "r:2@" + old, ok("r:2@" + old), "sha256:before"},
|
||||
{"tagless pick leaves it", model.TriggerManual, "r@" + old, ok("r@" + old), "sha256:before"},
|
||||
{"failed job leaves it", model.TriggerWebhook, "r:2",
|
||||
model.JobFinish{Status: model.JobFailed, Error: "boom", Ref: "r:2@" + good, StartedAt: t0, FinishedAt: t0}, "sha256:before"},
|
||||
{"malformed digest leaves it", model.TriggerWebhook, "r:2", ok("r:2@sha256:d"), "sha256:before"},
|
||||
{"no pinned ref leaves it", model.TriggerWebhook, "r:2", ok(""), "sha256:before"},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
s := openTestStore(t)
|
||||
ctx := context.Background()
|
||||
agent, svc := jobFixture(t, s, "a")
|
||||
require.NoError(t, s.SetLastTagDigest(ctx, svc, "sha256:before"))
|
||||
nj := newJob(svc, agent)
|
||||
nj.ToRef, nj.Trigger = tt.toRef, tt.trigger
|
||||
j, err := s.CreateJob(ctx, nj)
|
||||
require.NoError(t, err)
|
||||
|
||||
done, err := s.FinishJob(ctx, agent, j.ID, tt.finish)
|
||||
require.NoError(t, err)
|
||||
require.True(t, done)
|
||||
|
||||
got, err := s.GetService(ctx, svc)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, tt.want, got.LastTagDigest)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user