101 lines
4.1 KiB
Go
101 lines
4.1 KiB
Go
package store
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func eventTask(id, status string, revision int64) LocalDiscoveredTask {
|
|
return LocalDiscoveredTask{TaskID: id, TenantID: "tenant-a", TenantKey: "tenant-key-a", Status: status, TaskRevision: revision}
|
|
}
|
|
|
|
func TestV04CompleteSnapshotReplacesMembershipWithoutReopeningPause(t *testing.T) {
|
|
st := openLocalDiscoveryTestStore(t)
|
|
now := time.Now().UTC()
|
|
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 1), eventTask("b", "running", 1)}, now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
|
|
t.Fatalf("snapshot allowed admission before control backlog: %v", err)
|
|
}
|
|
if err := st.MarkLocalTaskDiscoveryReadyV04("d-1", now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := st.SetLocalTaskAdmissionBarrier("d-1", "a", "tenant-a", "tenant-key-a", "paused"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.CloseLocalTaskDiscoveryAdmissionV04("d-1"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "paused", 2)}, now.Add(time.Second)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
a, err := st.LocalTaskAssignment("d-1", "a")
|
|
if err != nil || a.AdmissionState != "paused" || a.TaskRevision != 2 {
|
|
t.Fatalf("snapshot reopened paused task: %+v %v", a, err)
|
|
}
|
|
b, err := st.LocalTaskAssignment("d-1", "b")
|
|
if err != nil || !b.Removed || b.AdmissionState != "removed" {
|
|
t.Fatalf("snapshot failed to revoke missing task: %+v %v", b, err)
|
|
}
|
|
if err := st.MarkLocalTaskDiscoveryReadyV04("d-1", now.Add(time.Second)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); err != nil {
|
|
t.Fatalf("completed snapshot+control catch-up not ready: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestV04InvalidSnapshotDoesNotPartiallyCommitOrOpenAdmission(t *testing.T) {
|
|
st := openLocalDiscoveryTestStore(t)
|
|
now := time.Now().UTC()
|
|
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 1)}, now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.CloseLocalTaskDiscoveryAdmissionV04("d-1"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
bad := eventTask("b", "running", 1)
|
|
bad.TenantKey = "changed-binding"
|
|
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 2), bad}, now.Add(time.Second)); err == nil {
|
|
t.Fatal("conflicting tenant binding accepted")
|
|
}
|
|
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
|
|
t.Fatalf("failed snapshot opened admission: %v", err)
|
|
}
|
|
if _, err := st.LocalTaskAssignment("d-1", "b"); err == nil {
|
|
t.Fatal("failed snapshot partially inserted task b")
|
|
}
|
|
a, err := st.LocalTaskAssignment("d-1", "a")
|
|
if err != nil || a.TaskRevision != 1 {
|
|
t.Fatalf("failed snapshot changed a: %+v %v", a, err)
|
|
}
|
|
}
|
|
|
|
func TestV04LiveChangesOnlyManageMembershipNotExistingStatus(t *testing.T) {
|
|
st := openLocalDiscoveryTestStore(t)
|
|
now := time.Now().UTC()
|
|
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 1), eventTask("b", "running", 1)}, now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := st.SetLocalTaskAdmissionBarrier("d-1", "a", "tenant-a", "tenant-key-a", "paused"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.ApplyLocalTaskChanges("d-1", []LocalDiscoveredTask{eventTask("a", "running", 2), eventTask("b", "removed", 2), eventTask("c", "running", 1)}, now.Add(time.Second)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for taskID, want := range map[string]string{"a": "paused", "b": "removed", "c": "running"} {
|
|
row, err := st.LocalTaskAssignment("d-1", taskID)
|
|
if err != nil || row.AdmissionState != want {
|
|
t.Fatalf("task %s state=%+v err=%v", taskID, row, err)
|
|
}
|
|
}
|
|
if err := st.ApplyLocalTaskChanges("d-1", []LocalDiscoveredTask{eventTask("a", "stopped", 3)}, now.Add(2*time.Second)); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
|
|
t.Fatalf("incremental status switched without MQ: %v", err)
|
|
}
|
|
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
|
|
t.Fatalf("status conflict should close admission: %v", err)
|
|
}
|
|
}
|