mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
testing: migrate nomad/state off testify (#25909)
We've been gradually migrating from `testify` to `shoenig/test` on a test-by-test basis. While working on a large refactoring in the state store, I found this to create a lot of diffs incidental to the refactoring. In this changeset, I've used a prototype collection of semgrep fix rules to autofix most of the uses of testify in the `nomad/state` package. Then I went in manually and fixed any resulting problems, as well as a few minor test bugs that `shoenig/test` catches and `testify` does not because of its API. I've also added a semgrep rule for marking a package as "testify clean", so that we don't accidentally add it back to any package we manage to remove it from going forward. While I'm here, I've removed most of the uses of `reflect.DeepEqual` in the tests as well as cleaned up some older idioms that Go has nicer syntax for now.
This commit is contained in:
@@ -20,3 +20,12 @@ rules:
|
||||
paths:
|
||||
include:
|
||||
- "*.go"
|
||||
|
||||
- id: "disallow-new-testify-imports"
|
||||
pattern: import "github.com/stretchr/testify"
|
||||
message: "Do not import testify in packages where it has been removed"
|
||||
languages: [go]
|
||||
severity: "ERROR"
|
||||
paths:
|
||||
include:
|
||||
- "nomad/state/*_test.go"
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/stream"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentEventFromChanges(t *testing.T) {
|
||||
@@ -30,8 +30,8 @@ func TestDeploymentEventFromChanges(t *testing.T) {
|
||||
d := mock.Deployment()
|
||||
d.JobID = j.ID
|
||||
|
||||
require.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
require.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
must.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
must.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
|
||||
setupTx.Txn.Commit()
|
||||
|
||||
@@ -47,19 +47,18 @@ func TestDeploymentEventFromChanges(t *testing.T) {
|
||||
// Exlude Job and assert its added
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateDeploymentStatus(msgType, 100, req))
|
||||
must.NoError(t, s.UpdateDeploymentStatus(msgType, 100, req))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 2)
|
||||
must.Len(t, 2, events)
|
||||
|
||||
got := events[0]
|
||||
require.Equal(t, uint64(100), got.Index)
|
||||
require.Equal(t, d.ID, got.Key)
|
||||
must.Eq(t, uint64(100), got.Index)
|
||||
must.Eq(t, d.ID, got.Key)
|
||||
|
||||
de := got.Payload.(*structs.DeploymentEvent)
|
||||
require.Equal(t, structs.DeploymentStatusPaused, de.Deployment.Status)
|
||||
require.Contains(t, got.FilterKeys, j.ID)
|
||||
|
||||
must.Eq(t, structs.DeploymentStatusPaused, de.Deployment.Status)
|
||||
must.SliceContains(t, got.FilterKeys, j.ID)
|
||||
}
|
||||
|
||||
func WaitForEvents(t *testing.T, s *StateStore, index uint64, minEvents int, timeout time.Duration) []structs.Event {
|
||||
@@ -71,7 +70,7 @@ func WaitForEvents(t *testing.T, s *StateStore, index uint64, minEvents int, tim
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-time.After(timeout):
|
||||
require.Fail(t, "timeout waiting for events")
|
||||
t.Fatal("timeout waiting for events")
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -82,16 +81,16 @@ func WaitForEvents(t *testing.T, s *StateStore, index uint64, minEvents int, tim
|
||||
return got
|
||||
}
|
||||
maxAttempts--
|
||||
if maxAttempts == 0 {
|
||||
require.Failf(t, "reached max attempts waiting for desired event count", "count %d got: %+v", len(got), got)
|
||||
}
|
||||
must.NotEq(t, 0, maxAttempts, must.Sprintf(
|
||||
"reached max attempts waiting for desired event count: count %d got: %+v",
|
||||
len(got), got))
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
}
|
||||
}
|
||||
|
||||
func EventsForIndex(t *testing.T, s *StateStore, index uint64) []structs.Event {
|
||||
pub, err := s.EventBroker()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
sub, err := pub.Subscribe(&stream.SubscribeRequest{
|
||||
Topics: map[structs.Topic][]string{
|
||||
@@ -106,12 +105,12 @@ func EventsForIndex(t *testing.T, s *StateStore, index uint64) []structs.Event {
|
||||
}
|
||||
defer sub.Unsubscribe()
|
||||
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var events []structs.Event
|
||||
for {
|
||||
e, err := sub.NextNoBlock()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
if e == nil {
|
||||
break
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TestEventFromChange_SingleEventPerTable ensures that only a single event is
|
||||
@@ -42,8 +41,8 @@ func TestEventFromChange_SingleEventPerTable(t *testing.T) {
|
||||
}
|
||||
|
||||
out := eventsFromChanges(s.db.ReadTxn(), changes)
|
||||
require.Len(t, out.Events, 1)
|
||||
require.Equal(t, out.Events[0].Type, structs.TypeJobRegistered)
|
||||
must.Len(t, 1, out.Events)
|
||||
must.Eq(t, out.Events[0].Type, structs.TypeJobRegistered)
|
||||
}
|
||||
|
||||
func TestEventFromChange_ACLTokenSecretID(t *testing.T) {
|
||||
@@ -52,7 +51,7 @@ func TestEventFromChange_ACLTokenSecretID(t *testing.T) {
|
||||
defer s.StopEventBroker()
|
||||
|
||||
token := mock.ACLToken()
|
||||
require.NotEmpty(t, token.SecretID)
|
||||
must.NotEq(t, "", token.SecretID)
|
||||
|
||||
// Create
|
||||
changes := Changes{
|
||||
@@ -68,15 +67,15 @@ func TestEventFromChange_ACLTokenSecretID(t *testing.T) {
|
||||
}
|
||||
|
||||
out := eventsFromChanges(s.db.ReadTxn(), changes)
|
||||
require.Len(t, out.Events, 1)
|
||||
must.Len(t, 1, out.Events)
|
||||
// Ensure original value not altered
|
||||
require.NotEmpty(t, token.SecretID)
|
||||
must.NotEq(t, "", token.SecretID)
|
||||
|
||||
aclTokenEvent, ok := out.Events[0].Payload.(*structs.ACLTokenEvent)
|
||||
require.True(t, ok)
|
||||
require.Empty(t, aclTokenEvent.ACLToken.SecretID)
|
||||
must.True(t, ok)
|
||||
must.Eq(t, "", aclTokenEvent.ACLToken.SecretID)
|
||||
|
||||
require.Equal(t, token.SecretID, aclTokenEvent.SecretID())
|
||||
must.Eq(t, token.SecretID, aclTokenEvent.SecretID())
|
||||
|
||||
// Delete
|
||||
changes = Changes{
|
||||
@@ -92,11 +91,11 @@ func TestEventFromChange_ACLTokenSecretID(t *testing.T) {
|
||||
}
|
||||
|
||||
out2 := eventsFromChanges(s.db.ReadTxn(), changes)
|
||||
require.Len(t, out2.Events, 1)
|
||||
must.Len(t, 1, out2.Events)
|
||||
|
||||
tokenEvent2, ok := out2.Events[0].Payload.(*structs.ACLTokenEvent)
|
||||
require.True(t, ok)
|
||||
require.Empty(t, tokenEvent2.ACLToken.SecretID)
|
||||
must.True(t, ok)
|
||||
must.Eq(t, "", tokenEvent2.ACLToken.SecretID)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_DeploymentUpdate(t *testing.T) {
|
||||
@@ -114,8 +113,8 @@ func TestEventsFromChanges_DeploymentUpdate(t *testing.T) {
|
||||
d := mock.Deployment()
|
||||
d.JobID = j.ID
|
||||
|
||||
require.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
require.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
must.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
must.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
|
||||
setupTx.Txn.Commit()
|
||||
|
||||
@@ -131,18 +130,18 @@ func TestEventsFromChanges_DeploymentUpdate(t *testing.T) {
|
||||
// Exlude Job and assert its added
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateDeploymentStatus(msgType, 100, req))
|
||||
must.NoError(t, s.UpdateDeploymentStatus(msgType, 100, req))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 2)
|
||||
must.Len(t, 2, events)
|
||||
|
||||
got := events[0]
|
||||
require.Equal(t, uint64(100), got.Index)
|
||||
require.Equal(t, d.ID, got.Key)
|
||||
must.Eq(t, uint64(100), got.Index)
|
||||
must.Eq(t, d.ID, got.Key)
|
||||
|
||||
de := got.Payload.(*structs.DeploymentEvent)
|
||||
require.Equal(t, structs.DeploymentStatusPaused, de.Deployment.Status)
|
||||
require.Contains(t, got.FilterKeys, j.ID)
|
||||
must.Eq(t, structs.DeploymentStatusPaused, de.Deployment.Status)
|
||||
must.SliceContains(t, got.FilterKeys, j.ID)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
|
||||
@@ -158,7 +157,7 @@ func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
|
||||
tg2 := tg1.Copy()
|
||||
tg2.Name = "foo"
|
||||
j.TaskGroups = append(j.TaskGroups, tg2)
|
||||
require.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
must.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
|
||||
d := mock.Deployment()
|
||||
d.StatusDescription = structs.DeploymentStatusDescriptionRunningNeedsPromotion
|
||||
@@ -173,7 +172,7 @@ func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
|
||||
DesiredCanaries: 1,
|
||||
},
|
||||
}
|
||||
require.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
must.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
|
||||
// create set of allocs
|
||||
c1 := mock.Alloc()
|
||||
@@ -192,7 +191,7 @@ func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
|
||||
Healthy: pointer.Of(true),
|
||||
}
|
||||
|
||||
require.NoError(t, s.upsertAllocsImpl(10, []*structs.Allocation{c1, c2}, setupTx))
|
||||
must.NoError(t, s.upsertAllocsImpl(10, []*structs.Allocation{c1, c2}, setupTx))
|
||||
|
||||
// commit setup transaction
|
||||
setupTx.Txn.Commit()
|
||||
@@ -208,18 +207,18 @@ func TestEventsFromChanges_DeploymentPromotion(t *testing.T) {
|
||||
Eval: e,
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateDeploymentPromotion(msgType, 100, req))
|
||||
must.NoError(t, s.UpdateDeploymentPromotion(msgType, 100, req))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 4)
|
||||
must.Len(t, 4, events)
|
||||
|
||||
got := events[0]
|
||||
require.Equal(t, uint64(100), got.Index)
|
||||
require.Equal(t, d.ID, got.Key)
|
||||
must.Eq(t, uint64(100), got.Index)
|
||||
must.Eq(t, d.ID, got.Key)
|
||||
|
||||
de := got.Payload.(*structs.DeploymentEvent)
|
||||
require.Equal(t, structs.DeploymentStatusRunning, de.Deployment.Status)
|
||||
require.Equal(t, structs.TypeDeploymentPromotion, got.Type)
|
||||
must.Eq(t, structs.DeploymentStatusRunning, de.Deployment.Status)
|
||||
must.Eq(t, structs.TypeDeploymentPromotion, got.Type)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
|
||||
@@ -235,7 +234,7 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
|
||||
tg2 := tg1.Copy()
|
||||
tg2.Name = "foo"
|
||||
j.TaskGroups = append(j.TaskGroups, tg2)
|
||||
require.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
must.NoError(t, s.upsertJobImpl(10, nil, j, false, setupTx))
|
||||
|
||||
d := mock.Deployment()
|
||||
d.StatusDescription = structs.DeploymentStatusDescriptionRunningNeedsPromotion
|
||||
@@ -250,7 +249,7 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
|
||||
DesiredCanaries: 1,
|
||||
},
|
||||
}
|
||||
require.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
must.NoError(t, s.upsertDeploymentImpl(10, d, setupTx))
|
||||
|
||||
// create set of allocs
|
||||
c1 := mock.Alloc()
|
||||
@@ -269,7 +268,7 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
|
||||
Healthy: pointer.Of(true),
|
||||
}
|
||||
|
||||
require.NoError(t, s.upsertAllocsImpl(10, []*structs.Allocation{c1, c2}, setupTx))
|
||||
must.NoError(t, s.upsertAllocsImpl(10, []*structs.Allocation{c1, c2}, setupTx))
|
||||
|
||||
// Commit setup
|
||||
setupTx.Commit()
|
||||
@@ -287,10 +286,10 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateDeploymentAllocHealth(msgType, 100, req))
|
||||
must.NoError(t, s.UpdateDeploymentAllocHealth(msgType, 100, req))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 3)
|
||||
must.Len(t, 3, events)
|
||||
|
||||
var allocEvents []structs.Event
|
||||
var deploymentEvent []structs.Event
|
||||
@@ -302,19 +301,19 @@ func TestEventsFromChanges_DeploymentAllocHealthRequestType(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
require.Len(t, allocEvents, 2)
|
||||
must.Len(t, 2, allocEvents)
|
||||
for _, e := range allocEvents {
|
||||
require.Equal(t, 100, int(e.Index))
|
||||
require.Equal(t, structs.TypeDeploymentAllocHealth, e.Type)
|
||||
require.Equal(t, structs.TopicAllocation, e.Topic)
|
||||
must.Eq(t, 100, int(e.Index))
|
||||
must.Eq(t, structs.TypeDeploymentAllocHealth, e.Type)
|
||||
must.Eq(t, structs.TopicAllocation, e.Topic)
|
||||
}
|
||||
|
||||
require.Len(t, deploymentEvent, 1)
|
||||
must.Len(t, 1, deploymentEvent)
|
||||
for _, e := range deploymentEvent {
|
||||
require.Equal(t, 100, int(e.Index))
|
||||
require.Equal(t, structs.TypeDeploymentAllocHealth, e.Type)
|
||||
require.Equal(t, structs.TopicDeployment, e.Topic)
|
||||
require.Equal(t, d.ID, e.Key)
|
||||
must.Eq(t, 100, int(e.Index))
|
||||
must.Eq(t, structs.TypeDeploymentAllocHealth, e.Type)
|
||||
must.Eq(t, structs.TopicDeployment, e.Topic)
|
||||
must.Eq(t, d.ID, e.Key)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,8 +326,8 @@ func TestEventsFromChanges_UpsertNodeEventsType(t *testing.T) {
|
||||
n1 := mock.Node()
|
||||
n2 := mock.Node()
|
||||
|
||||
require.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
require.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 12, n2))
|
||||
must.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
must.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 12, n2))
|
||||
|
||||
msgType := structs.UpsertNodeEventsType
|
||||
req := &structs.EmitNodeEventsRequest{
|
||||
@@ -346,15 +345,15 @@ func TestEventsFromChanges_UpsertNodeEventsType(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpsertNodeEvents(msgType, 100, req.NodeEvents))
|
||||
must.NoError(t, s.UpsertNodeEvents(msgType, 100, req.NodeEvents))
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 2)
|
||||
must.Len(t, 2, events)
|
||||
|
||||
for _, e := range events {
|
||||
require.Equal(t, structs.TopicNode, e.Topic)
|
||||
require.Equal(t, structs.TypeNodeEvent, e.Type)
|
||||
must.Eq(t, structs.TopicNode, e.Topic)
|
||||
must.Eq(t, structs.TypeNodeEvent, e.Type)
|
||||
event := e.Payload.(*structs.NodeStreamEvent)
|
||||
require.Equal(t, "update", event.Node.Events[len(event.Node.Events)-1].Message)
|
||||
must.Eq(t, "update", event.Node.Events[len(event.Node.Events)-1].Message)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -367,7 +366,7 @@ func TestEventsFromChanges_NodeUpdateStatusRequest(t *testing.T) {
|
||||
// setup
|
||||
n1 := mock.Node()
|
||||
|
||||
require.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
must.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
|
||||
updated := time.Now()
|
||||
msgType := structs.NodeUpdateStatusRequestType
|
||||
@@ -378,16 +377,16 @@ func TestEventsFromChanges_NodeUpdateStatusRequest(t *testing.T) {
|
||||
NodeEvent: &structs.NodeEvent{Message: "down"},
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateNodeStatus(msgType, 100, req.NodeID, req.Status, req.UpdatedAt, req.NodeEvent))
|
||||
must.NoError(t, s.UpdateNodeStatus(msgType, 100, req.NodeID, req.Status, req.UpdatedAt, req.NodeEvent))
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 1)
|
||||
must.Len(t, 1, events)
|
||||
|
||||
e := events[0]
|
||||
require.Equal(t, structs.TopicNode, e.Topic)
|
||||
require.Equal(t, structs.TypeNodeEvent, e.Type)
|
||||
must.Eq(t, structs.TopicNode, e.Topic)
|
||||
must.Eq(t, structs.TypeNodeEvent, e.Type)
|
||||
event := e.Payload.(*structs.NodeStreamEvent)
|
||||
require.Equal(t, "down", event.Node.Events[len(event.Node.Events)-1].Message)
|
||||
require.Equal(t, structs.NodeStatusDown, event.Node.Status)
|
||||
must.Eq(t, "down", event.Node.Events[len(event.Node.Events)-1].Message)
|
||||
must.Eq(t, structs.NodeStatusDown, event.Node.Status)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_NodePoolUpsertRequestType(t *testing.T) {
|
||||
@@ -454,7 +453,7 @@ func TestEventsFromChanges_EvalUpdateRequestType(t *testing.T) {
|
||||
// setup
|
||||
e1 := mock.Eval()
|
||||
|
||||
require.NoError(t, s.UpsertEvals(structs.MsgTypeTestSetup, 10, []*structs.Evaluation{e1}))
|
||||
must.NoError(t, s.UpsertEvals(structs.MsgTypeTestSetup, 10, []*structs.Evaluation{e1}))
|
||||
|
||||
e2 := mock.Eval()
|
||||
e2.ID = e1.ID
|
||||
@@ -466,18 +465,18 @@ func TestEventsFromChanges_EvalUpdateRequestType(t *testing.T) {
|
||||
Evals: []*structs.Evaluation{e2},
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpsertEvals(msgType, 100, req.Evals))
|
||||
must.NoError(t, s.UpsertEvals(msgType, 100, req.Evals))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 1)
|
||||
must.Len(t, 1, events)
|
||||
|
||||
e := events[0]
|
||||
require.Equal(t, structs.TopicEvaluation, e.Topic)
|
||||
require.Equal(t, structs.TypeEvalUpdated, e.Type)
|
||||
require.Contains(t, e.FilterKeys, e2.JobID)
|
||||
require.Contains(t, e.FilterKeys, e2.DeploymentID)
|
||||
must.Eq(t, structs.TopicEvaluation, e.Topic)
|
||||
must.Eq(t, structs.TypeEvalUpdated, e.Type)
|
||||
must.SliceContains(t, e.FilterKeys, e2.JobID)
|
||||
must.SliceContains(t, e.FilterKeys, e2.DeploymentID)
|
||||
event := e.Payload.(*structs.EvaluationEvent)
|
||||
require.Equal(t, "blocked", event.Evaluation.Status)
|
||||
must.Eq(t, "blocked", event.Evaluation.Status)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_ApplyPlanResultsRequestType(t *testing.T) {
|
||||
@@ -496,13 +495,13 @@ func TestEventsFromChanges_ApplyPlanResultsRequestType(t *testing.T) {
|
||||
alloc.DeploymentID = d.ID
|
||||
alloc2.DeploymentID = d.ID
|
||||
|
||||
require.NoError(t, s.UpsertJob(structs.MsgTypeTestSetup, 9, nil, job))
|
||||
must.NoError(t, s.UpsertJob(structs.MsgTypeTestSetup, 9, nil, job))
|
||||
|
||||
eval := mock.Eval()
|
||||
eval.JobID = job.ID
|
||||
|
||||
// Create an eval
|
||||
require.NoError(t, s.UpsertEvals(structs.MsgTypeTestSetup, 10, []*structs.Evaluation{eval}))
|
||||
must.NoError(t, s.UpsertEvals(structs.MsgTypeTestSetup, 10, []*structs.Evaluation{eval}))
|
||||
|
||||
msgType := structs.ApplyPlanResultsRequestType
|
||||
req := &structs.ApplyPlanResultsRequest{
|
||||
@@ -514,10 +513,10 @@ func TestEventsFromChanges_ApplyPlanResultsRequestType(t *testing.T) {
|
||||
EvalID: eval.ID,
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpsertPlanResults(msgType, 100, req))
|
||||
must.NoError(t, s.UpsertPlanResults(msgType, 100, req))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 5)
|
||||
must.Len(t, 5, events)
|
||||
|
||||
var allocs []structs.Event
|
||||
var evals []structs.Event
|
||||
@@ -533,12 +532,12 @@ func TestEventsFromChanges_ApplyPlanResultsRequestType(t *testing.T) {
|
||||
} else if e.Topic == structs.TopicDeployment {
|
||||
deploys = append(deploys, e)
|
||||
}
|
||||
require.Equal(t, structs.TypePlanResult, e.Type)
|
||||
must.Eq(t, structs.TypePlanResult, e.Type)
|
||||
}
|
||||
require.Len(t, allocs, 2)
|
||||
require.Len(t, evals, 1)
|
||||
require.Len(t, jobs, 1)
|
||||
require.Len(t, deploys, 1)
|
||||
must.Len(t, 2, allocs)
|
||||
must.Len(t, 1, evals)
|
||||
must.Len(t, 1, jobs)
|
||||
must.Len(t, 1, deploys)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_BatchNodeUpdateDrainRequestType(t *testing.T) {
|
||||
@@ -550,8 +549,8 @@ func TestEventsFromChanges_BatchNodeUpdateDrainRequestType(t *testing.T) {
|
||||
n1 := mock.Node()
|
||||
n2 := mock.Node()
|
||||
|
||||
require.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
require.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 11, n2))
|
||||
must.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
must.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 11, n2))
|
||||
|
||||
updated := time.Now()
|
||||
msgType := structs.BatchNodeUpdateDrainRequestType
|
||||
@@ -582,17 +581,17 @@ func TestEventsFromChanges_BatchNodeUpdateDrainRequestType(t *testing.T) {
|
||||
UpdatedAt: updated.UnixNano(),
|
||||
}
|
||||
|
||||
require.NoError(t, s.BatchUpdateNodeDrain(msgType, 100, req.UpdatedAt, req.Updates, req.NodeEvents))
|
||||
must.NoError(t, s.BatchUpdateNodeDrain(msgType, 100, req.UpdatedAt, req.Updates, req.NodeEvents))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 2)
|
||||
must.Len(t, 2, events)
|
||||
|
||||
for _, e := range events {
|
||||
require.Equal(t, 100, int(e.Index))
|
||||
require.Equal(t, structs.TypeNodeDrain, e.Type)
|
||||
require.Equal(t, structs.TopicNode, e.Topic)
|
||||
must.Eq(t, 100, int(e.Index))
|
||||
must.Eq(t, structs.TypeNodeDrain, e.Type)
|
||||
must.Eq(t, structs.TopicNode, e.Topic)
|
||||
ne := e.Payload.(*structs.NodeStreamEvent)
|
||||
require.Equal(t, event.Message, ne.Node.Events[len(ne.Node.Events)-1].Message)
|
||||
must.Eq(t, event.Message, ne.Node.Events[len(ne.Node.Events)-1].Message)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,7 +603,7 @@ func TestEventsFromChanges_NodeUpdateEligibilityRequestType(t *testing.T) {
|
||||
// setup
|
||||
n1 := mock.Node()
|
||||
|
||||
require.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
must.NoError(t, s.UpsertNode(structs.MsgTypeTestSetup, 10, n1))
|
||||
|
||||
msgType := structs.NodeUpdateEligibilityRequestType
|
||||
|
||||
@@ -621,18 +620,18 @@ func TestEventsFromChanges_NodeUpdateEligibilityRequestType(t *testing.T) {
|
||||
UpdatedAt: time.Now().UnixNano(),
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateNodeEligibility(msgType, 100, req.NodeID, req.Eligibility, req.UpdatedAt, req.NodeEvent))
|
||||
must.NoError(t, s.UpdateNodeEligibility(msgType, 100, req.NodeID, req.Eligibility, req.UpdatedAt, req.NodeEvent))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 1)
|
||||
must.Len(t, 1, events)
|
||||
|
||||
for _, e := range events {
|
||||
require.Equal(t, 100, int(e.Index))
|
||||
require.Equal(t, structs.TypeNodeDrain, e.Type)
|
||||
require.Equal(t, structs.TopicNode, e.Topic)
|
||||
must.Eq(t, 100, int(e.Index))
|
||||
must.Eq(t, structs.TypeNodeDrain, e.Type)
|
||||
must.Eq(t, structs.TopicNode, e.Topic)
|
||||
ne := e.Payload.(*structs.NodeStreamEvent)
|
||||
require.Equal(t, event.Message, ne.Node.Events[len(ne.Node.Events)-1].Message)
|
||||
require.Equal(t, structs.NodeSchedulingIneligible, ne.Node.SchedulingEligibility)
|
||||
must.Eq(t, event.Message, ne.Node.Events[len(ne.Node.Events)-1].Message)
|
||||
must.Eq(t, structs.NodeSchedulingIneligible, ne.Node.SchedulingEligibility)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -643,8 +642,8 @@ func TestEventsFromChanges_AllocUpdateDesiredTransitionRequestType(t *testing.T)
|
||||
|
||||
alloc := mock.Alloc()
|
||||
|
||||
require.Nil(t, s.UpsertJob(structs.MsgTypeTestSetup, 10, nil, alloc.Job))
|
||||
require.Nil(t, s.UpsertAllocs(structs.MsgTypeTestSetup, 11, []*structs.Allocation{alloc}))
|
||||
must.Nil(t, s.UpsertJob(structs.MsgTypeTestSetup, 10, nil, alloc.Job))
|
||||
must.Nil(t, s.UpsertAllocs(structs.MsgTypeTestSetup, 11, []*structs.Allocation{alloc}))
|
||||
|
||||
msgType := structs.AllocUpdateDesiredTransitionRequestType
|
||||
|
||||
@@ -667,10 +666,10 @@ func TestEventsFromChanges_AllocUpdateDesiredTransitionRequestType(t *testing.T)
|
||||
Evals: evals,
|
||||
}
|
||||
|
||||
require.NoError(t, s.UpdateAllocsDesiredTransitions(msgType, 100, req.Allocs, req.Evals))
|
||||
must.NoError(t, s.UpdateAllocsDesiredTransitions(msgType, 100, req.Allocs, req.Evals))
|
||||
|
||||
events := WaitForEvents(t, s, 100, 1, 1*time.Second)
|
||||
require.Len(t, events, 2)
|
||||
must.Len(t, 2, events)
|
||||
|
||||
var allocs []structs.Event
|
||||
var evalEvents []structs.Event
|
||||
@@ -680,14 +679,14 @@ func TestEventsFromChanges_AllocUpdateDesiredTransitionRequestType(t *testing.T)
|
||||
} else if e.Topic == structs.TopicAllocation {
|
||||
allocs = append(allocs, e)
|
||||
} else {
|
||||
require.Fail(t, "unexpected event type")
|
||||
t.Fatal("unexpected event type")
|
||||
}
|
||||
|
||||
require.Equal(t, structs.TypeAllocationUpdateDesiredStatus, e.Type)
|
||||
must.Eq(t, structs.TypeAllocationUpdateDesiredStatus, e.Type)
|
||||
}
|
||||
|
||||
require.Len(t, allocs, 1)
|
||||
require.Len(t, evalEvents, 1)
|
||||
must.Len(t, 1, allocs)
|
||||
must.Len(t, 1, evalEvents)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_JobBatchDeregisterRequestType(t *testing.T) {
|
||||
@@ -724,9 +723,9 @@ func TestEventsFromChanges_WithDeletion(t *testing.T) {
|
||||
}
|
||||
|
||||
event := eventsFromChanges(nil, changes)
|
||||
require.NotNil(t, event)
|
||||
must.NotNil(t, event)
|
||||
|
||||
require.Len(t, event.Events, 2)
|
||||
must.Len(t, 2, event.Events)
|
||||
}
|
||||
|
||||
func TestEventsFromChanges_WithNodeDeregistration(t *testing.T) {
|
||||
@@ -750,22 +749,22 @@ func TestEventsFromChanges_WithNodeDeregistration(t *testing.T) {
|
||||
}
|
||||
|
||||
actual := eventsFromChanges(nil, changes)
|
||||
require.NotNil(t, actual)
|
||||
must.NotNil(t, actual)
|
||||
|
||||
require.Len(t, actual.Events, 1)
|
||||
must.Len(t, 1, actual.Events)
|
||||
|
||||
event := actual.Events[0]
|
||||
|
||||
require.Equal(t, structs.TypeNodeDeregistration, event.Type)
|
||||
require.Equal(t, uint64(1), event.Index)
|
||||
require.Equal(t, structs.TopicNode, event.Topic)
|
||||
require.Equal(t, "some-id", event.Key)
|
||||
must.Eq(t, structs.TypeNodeDeregistration, event.Type)
|
||||
must.Eq(t, uint64(1), event.Index)
|
||||
must.Eq(t, structs.TopicNode, event.Topic)
|
||||
must.Eq(t, "some-id", event.Key)
|
||||
|
||||
require.Len(t, event.FilterKeys, 0)
|
||||
must.Len(t, 0, event.FilterKeys)
|
||||
|
||||
nodeEvent, ok := event.Payload.(*structs.NodeStreamEvent)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, *before, *nodeEvent.Node)
|
||||
must.True(t, ok)
|
||||
must.Eq(t, *before, *nodeEvent.Node)
|
||||
}
|
||||
|
||||
func TestNodeEventsFromChanges(t *testing.T) {
|
||||
@@ -838,7 +837,7 @@ func TestNodeEventsFromChanges(t *testing.T) {
|
||||
WantTopic: structs.TopicNode,
|
||||
Name: "batch node deregistered",
|
||||
Setup: func(s *StateStore, tx *txn) error {
|
||||
require.NoError(t, upsertNodeTxn(tx, tx.Index, testNode()))
|
||||
must.NoError(t, upsertNodeTxn(tx, tx.Index, testNode()))
|
||||
return upsertNodeTxn(tx, tx.Index, testNode(nodeIDTwo))
|
||||
},
|
||||
Mutate: func(s *StateStore, tx *txn) error {
|
||||
@@ -870,7 +869,7 @@ func TestNodeEventsFromChanges(t *testing.T) {
|
||||
WantTopic: structs.TopicNode,
|
||||
Name: "batch node events upserted",
|
||||
Setup: func(s *StateStore, tx *txn) error {
|
||||
require.NoError(t, upsertNodeTxn(tx, tx.Index, testNode()))
|
||||
must.NoError(t, upsertNodeTxn(tx, tx.Index, testNode()))
|
||||
return upsertNodeTxn(tx, tx.Index, testNode(nodeIDTwo))
|
||||
},
|
||||
Mutate: func(s *StateStore, tx *txn) error {
|
||||
@@ -892,7 +891,7 @@ func TestNodeEventsFromChanges(t *testing.T) {
|
||||
},
|
||||
}
|
||||
}
|
||||
require.NoError(t, s.upsertNodeEvents(tx.Index, testNodeID(), eventFn(testNodeID()), tx))
|
||||
must.NoError(t, s.upsertNodeEvents(tx.Index, testNodeID(), eventFn(testNodeID()), tx))
|
||||
return s.upsertNodeEvents(tx.Index, testNodeIDTwo(), eventFn(testNodeIDTwo()), tx)
|
||||
},
|
||||
WantEvents: []structs.Event{
|
||||
@@ -926,26 +925,26 @@ func TestNodeEventsFromChanges(t *testing.T) {
|
||||
if tc.Setup != nil {
|
||||
// Bypass publish mechanism for setup
|
||||
setupTx := s.db.WriteTxn(10)
|
||||
require.NoError(t, tc.Setup(s, setupTx))
|
||||
must.NoError(t, tc.Setup(s, setupTx))
|
||||
setupTx.Txn.Commit()
|
||||
}
|
||||
|
||||
tx := s.db.WriteTxnMsgT(tc.MsgType, 100)
|
||||
require.NoError(t, tc.Mutate(s, tx))
|
||||
must.NoError(t, tc.Mutate(s, tx))
|
||||
|
||||
changes := Changes{Changes: tx.Changes(), Index: 100, MsgType: tc.MsgType}
|
||||
got := eventsFromChanges(tx, changes)
|
||||
|
||||
require.NotNil(t, got)
|
||||
must.NotNil(t, got)
|
||||
|
||||
require.Equal(t, len(tc.WantEvents), len(got.Events))
|
||||
must.Eq(t, len(tc.WantEvents), len(got.Events))
|
||||
for idx, g := range got.Events {
|
||||
// assert equality of shared fields
|
||||
|
||||
want := tc.WantEvents[idx]
|
||||
require.Equal(t, want.Index, g.Index)
|
||||
require.Equal(t, want.Key, g.Key)
|
||||
require.Equal(t, want.Topic, g.Topic)
|
||||
must.Eq(t, want.Index, g.Index)
|
||||
must.Eq(t, want.Key, g.Key)
|
||||
must.Eq(t, want.Topic, g.Topic)
|
||||
|
||||
switch tc.MsgType {
|
||||
case structs.NodeRegisterRequestType:
|
||||
@@ -953,9 +952,9 @@ func TestNodeEventsFromChanges(t *testing.T) {
|
||||
case structs.NodeDeregisterRequestType:
|
||||
requireNodeDeregistrationEventEqual(t, tc.WantEvents[idx], g)
|
||||
case structs.UpsertNodeEventsType:
|
||||
requireNodeEventEqual(t, tc.WantEvents[idx], g)
|
||||
requireNodeEventCount(t, 3, g)
|
||||
default:
|
||||
require.Fail(t, "unhandled message type")
|
||||
t.Fatal("unhandled message type")
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -976,8 +975,8 @@ func TestNodeDrainEventFromChanges(t *testing.T) {
|
||||
alloc1.NodeID = node.ID
|
||||
alloc2.NodeID = node.ID
|
||||
|
||||
require.NoError(t, upsertNodeTxn(setupTx, 10, node))
|
||||
require.NoError(t, s.upsertAllocsImpl(100, []*structs.Allocation{alloc1, alloc2}, setupTx))
|
||||
must.NoError(t, upsertNodeTxn(setupTx, 10, node))
|
||||
must.NoError(t, s.upsertAllocsImpl(100, []*structs.Allocation{alloc1, alloc2}, setupTx))
|
||||
setupTx.Txn.Commit()
|
||||
|
||||
// changes
|
||||
@@ -994,21 +993,21 @@ func TestNodeDrainEventFromChanges(t *testing.T) {
|
||||
updatedAt := time.Now()
|
||||
event := &structs.NodeEvent{}
|
||||
|
||||
require.NoError(t, s.updateNodeDrainImpl(tx, 100, node.ID, strat, markEligible, updatedAt.UnixNano(), event, nil, "", false))
|
||||
must.NoError(t, s.updateNodeDrainImpl(tx, 100, node.ID, strat, markEligible, updatedAt.UnixNano(), event, nil, "", false))
|
||||
changes := Changes{Changes: tx.Changes(), Index: 100, MsgType: structs.NodeUpdateDrainRequestType}
|
||||
got := eventsFromChanges(tx, changes)
|
||||
|
||||
require.Len(t, got.Events, 1)
|
||||
must.Len(t, 1, got.Events)
|
||||
|
||||
require.Equal(t, structs.TopicNode, got.Events[0].Topic)
|
||||
require.Equal(t, structs.TypeNodeDrain, got.Events[0].Type)
|
||||
require.Equal(t, uint64(100), got.Events[0].Index)
|
||||
must.Eq(t, structs.TopicNode, got.Events[0].Topic)
|
||||
must.Eq(t, structs.TypeNodeDrain, got.Events[0].Type)
|
||||
must.Eq(t, uint64(100), got.Events[0].Index)
|
||||
|
||||
nodeEvent, ok := got.Events[0].Payload.(*structs.NodeStreamEvent)
|
||||
require.True(t, ok)
|
||||
must.True(t, ok)
|
||||
|
||||
require.Equal(t, structs.NodeSchedulingIneligible, nodeEvent.Node.SchedulingEligibility)
|
||||
require.Equal(t, strat, nodeEvent.Node.DrainStrategy)
|
||||
must.Eq(t, structs.NodeSchedulingIneligible, nodeEvent.Node.SchedulingEligibility)
|
||||
must.Eq(t, strat, nodeEvent.Node.DrainStrategy)
|
||||
}
|
||||
|
||||
func Test_eventsFromChanges_ServiceRegistration(t *testing.T) {
|
||||
@@ -1022,8 +1021,8 @@ func Test_eventsFromChanges_ServiceRegistration(t *testing.T) {
|
||||
// Upsert a service registration.
|
||||
writeTxn := testState.db.WriteTxn(10)
|
||||
updated, err := testState.upsertServiceRegistrationTxn(10, writeTxn, service)
|
||||
require.True(t, updated)
|
||||
require.NoError(t, err)
|
||||
must.True(t, updated)
|
||||
must.NoError(t, err)
|
||||
writeTxn.Txn.Commit()
|
||||
|
||||
// Pull the events from the stream.
|
||||
@@ -1031,17 +1030,17 @@ func Test_eventsFromChanges_ServiceRegistration(t *testing.T) {
|
||||
receivedChange := eventsFromChanges(writeTxn, registerChange)
|
||||
|
||||
// Check the event, and it's payload are what we are expecting.
|
||||
require.Len(t, receivedChange.Events, 1)
|
||||
require.Equal(t, structs.TopicService, receivedChange.Events[0].Topic)
|
||||
require.Equal(t, structs.TypeServiceRegistration, receivedChange.Events[0].Type)
|
||||
require.Equal(t, uint64(10), receivedChange.Events[0].Index)
|
||||
must.Len(t, 1, receivedChange.Events)
|
||||
must.Eq(t, structs.TopicService, receivedChange.Events[0].Topic)
|
||||
must.Eq(t, structs.TypeServiceRegistration, receivedChange.Events[0].Type)
|
||||
must.Eq(t, uint64(10), receivedChange.Events[0].Index)
|
||||
|
||||
eventPayload := receivedChange.Events[0].Payload.(*structs.ServiceRegistrationStreamEvent)
|
||||
require.Equal(t, service, eventPayload.Service)
|
||||
must.Eq(t, service, eventPayload.Service)
|
||||
|
||||
// Delete the previously upserted service registration.
|
||||
deleteTxn := testState.db.WriteTxn(20)
|
||||
require.NoError(t, testState.deleteServiceRegistrationByIDTxn(uint64(20), deleteTxn, service.Namespace, service.ID))
|
||||
must.NoError(t, testState.deleteServiceRegistrationByIDTxn(uint64(20), deleteTxn, service.Namespace, service.ID))
|
||||
writeTxn.Txn.Commit()
|
||||
|
||||
// Pull the events from the stream.
|
||||
@@ -1049,13 +1048,13 @@ func Test_eventsFromChanges_ServiceRegistration(t *testing.T) {
|
||||
receivedDeleteChange := eventsFromChanges(deleteTxn, deregisterChange)
|
||||
|
||||
// Check the event, and it's payload are what we are expecting.
|
||||
require.Len(t, receivedDeleteChange.Events, 1)
|
||||
require.Equal(t, structs.TopicService, receivedDeleteChange.Events[0].Topic)
|
||||
require.Equal(t, structs.TypeServiceDeregistration, receivedDeleteChange.Events[0].Type)
|
||||
require.Equal(t, uint64(20), receivedDeleteChange.Events[0].Index)
|
||||
must.Len(t, 1, receivedDeleteChange.Events)
|
||||
must.Eq(t, structs.TopicService, receivedDeleteChange.Events[0].Topic)
|
||||
must.Eq(t, structs.TypeServiceDeregistration, receivedDeleteChange.Events[0].Type)
|
||||
must.Eq(t, uint64(20), receivedDeleteChange.Events[0].Index)
|
||||
|
||||
eventPayload = receivedChange.Events[0].Payload.(*structs.ServiceRegistrationStreamEvent)
|
||||
require.Equal(t, service, eventPayload.Service)
|
||||
must.Eq(t, service, eventPayload.Service)
|
||||
}
|
||||
|
||||
func Test_eventsFromChanges_ACLRole(t *testing.T) {
|
||||
@@ -1070,8 +1069,8 @@ func Test_eventsFromChanges_ACLRole(t *testing.T) {
|
||||
// linked policies exist.
|
||||
writeTxn := testState.db.WriteTxn(10)
|
||||
updated, err := testState.upsertACLRoleTxn(10, writeTxn, aclRole, true)
|
||||
require.True(t, updated)
|
||||
require.NoError(t, err)
|
||||
must.True(t, updated)
|
||||
must.NoError(t, err)
|
||||
writeTxn.Txn.Commit()
|
||||
|
||||
// Pull the events from the stream.
|
||||
@@ -1079,20 +1078,20 @@ func Test_eventsFromChanges_ACLRole(t *testing.T) {
|
||||
receivedChange := eventsFromChanges(writeTxn, upsertChange)
|
||||
|
||||
// Check the event, and it's payload are what we are expecting.
|
||||
require.Len(t, receivedChange.Events, 1)
|
||||
require.Equal(t, structs.TopicACLRole, receivedChange.Events[0].Topic)
|
||||
require.Equal(t, aclRole.ID, receivedChange.Events[0].Key)
|
||||
require.Equal(t, aclRole.Name, receivedChange.Events[0].FilterKeys[0])
|
||||
require.Equal(t, structs.TypeACLRoleUpserted, receivedChange.Events[0].Type)
|
||||
require.Equal(t, uint64(10), receivedChange.Events[0].Index)
|
||||
must.Len(t, 1, receivedChange.Events)
|
||||
must.Eq(t, structs.TopicACLRole, receivedChange.Events[0].Topic)
|
||||
must.Eq(t, aclRole.ID, receivedChange.Events[0].Key)
|
||||
must.Eq(t, aclRole.Name, receivedChange.Events[0].FilterKeys[0])
|
||||
must.Eq(t, structs.TypeACLRoleUpserted, receivedChange.Events[0].Type)
|
||||
must.Eq(t, uint64(10), receivedChange.Events[0].Index)
|
||||
|
||||
eventPayload := receivedChange.Events[0].Payload.(*structs.ACLRoleStreamEvent)
|
||||
require.Equal(t, aclRole, eventPayload.ACLRole)
|
||||
must.Eq(t, aclRole, eventPayload.ACLRole)
|
||||
|
||||
// Delete the previously upserted ACL role.
|
||||
deleteTxn := testState.db.WriteTxn(20)
|
||||
require.NoError(t, testState.deleteACLRoleByIDTxn(deleteTxn, aclRole.ID))
|
||||
require.NoError(t, deleteTxn.Insert(tableIndex, &IndexEntry{TableACLRoles, 20}))
|
||||
must.NoError(t, testState.deleteACLRoleByIDTxn(deleteTxn, aclRole.ID))
|
||||
must.NoError(t, deleteTxn.Insert(tableIndex, &IndexEntry{TableACLRoles, 20}))
|
||||
deleteTxn.Txn.Commit()
|
||||
|
||||
// Pull the events from the stream.
|
||||
@@ -1100,15 +1099,15 @@ func Test_eventsFromChanges_ACLRole(t *testing.T) {
|
||||
receivedDeleteChange := eventsFromChanges(deleteTxn, deleteChange)
|
||||
|
||||
// Check the event, and it's payload are what we are expecting.
|
||||
require.Len(t, receivedDeleteChange.Events, 1)
|
||||
require.Equal(t, structs.TopicACLRole, receivedDeleteChange.Events[0].Topic)
|
||||
require.Equal(t, aclRole.ID, receivedDeleteChange.Events[0].Key)
|
||||
require.Equal(t, aclRole.Name, receivedDeleteChange.Events[0].FilterKeys[0])
|
||||
require.Equal(t, structs.TypeACLRoleDeleted, receivedDeleteChange.Events[0].Type)
|
||||
require.Equal(t, uint64(20), receivedDeleteChange.Events[0].Index)
|
||||
must.Len(t, 1, receivedDeleteChange.Events)
|
||||
must.Eq(t, structs.TopicACLRole, receivedDeleteChange.Events[0].Topic)
|
||||
must.Eq(t, aclRole.ID, receivedDeleteChange.Events[0].Key)
|
||||
must.Eq(t, aclRole.Name, receivedDeleteChange.Events[0].FilterKeys[0])
|
||||
must.Eq(t, structs.TypeACLRoleDeleted, receivedDeleteChange.Events[0].Type)
|
||||
must.Eq(t, uint64(20), receivedDeleteChange.Events[0].Index)
|
||||
|
||||
eventPayload = receivedChange.Events[0].Payload.(*structs.ACLRoleStreamEvent)
|
||||
require.Equal(t, aclRole, eventPayload.ACLRole)
|
||||
must.Eq(t, aclRole, eventPayload.ACLRole)
|
||||
}
|
||||
|
||||
func Test_eventsFromChanges_ACLAuthMethod(t *testing.T) {
|
||||
@@ -1342,9 +1341,9 @@ func requireNodeRegistrationEventEqual(t *testing.T, want, got structs.Event) {
|
||||
gotPayload := got.Payload.(*structs.NodeStreamEvent)
|
||||
|
||||
// Check payload equality for the fields that we can easily control
|
||||
require.Equal(t, wantPayload.Node.Status, gotPayload.Node.Status)
|
||||
require.Equal(t, wantPayload.Node.ID, gotPayload.Node.ID)
|
||||
require.NotEqual(t, wantPayload.Node.Events, gotPayload.Node.Events)
|
||||
must.Eq(t, wantPayload.Node.Status, gotPayload.Node.Status)
|
||||
must.Eq(t, wantPayload.Node.ID, gotPayload.Node.ID)
|
||||
must.NotEq(t, wantPayload.Node.Events, gotPayload.Node.Events)
|
||||
}
|
||||
|
||||
func requireNodeDeregistrationEventEqual(t *testing.T, want, got structs.Event) {
|
||||
@@ -1353,14 +1352,13 @@ func requireNodeDeregistrationEventEqual(t *testing.T, want, got structs.Event)
|
||||
wantPayload := want.Payload.(*structs.NodeStreamEvent)
|
||||
gotPayload := got.Payload.(*structs.NodeStreamEvent)
|
||||
|
||||
require.Equal(t, wantPayload.Node.ID, gotPayload.Node.ID)
|
||||
require.NotEqual(t, wantPayload.Node.Events, gotPayload.Node.Events)
|
||||
must.Eq(t, wantPayload.Node.ID, gotPayload.Node.ID)
|
||||
must.NotEq(t, wantPayload.Node.Events, gotPayload.Node.Events)
|
||||
}
|
||||
|
||||
func requireNodeEventEqual(t *testing.T, want, got structs.Event) {
|
||||
func requireNodeEventCount(t *testing.T, want int, got structs.Event) {
|
||||
gotPayload := got.Payload.(*structs.NodeStreamEvent)
|
||||
|
||||
require.Len(t, gotPayload.Node.Events, 3)
|
||||
must.Len(t, want, gotPayload.Node.Events)
|
||||
}
|
||||
|
||||
type nodeOpts func(n *structs.Node)
|
||||
|
||||
@@ -7,12 +7,12 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func Test_IndexBuilder_Time(t *testing.T) {
|
||||
builder := &IndexBuilder{}
|
||||
testTime := time.Date(1987, time.April, 13, 8, 3, 0, 0, time.UTC)
|
||||
builder.Time(testTime)
|
||||
require.Equal(t, []byte{0, 0, 0, 0, 32, 128, 155, 180}, builder.Bytes())
|
||||
must.Eq(t, []byte{0, 0, 0, 0, 32, 128, 155, 180}, builder.Bytes())
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func Test_IndexFromTimeQuery(t *testing.T) {
|
||||
@@ -41,8 +41,8 @@ func Test_IndexFromTimeQuery(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
actualOutput, actualError := IndexFromTimeQuery(tc.inputArg)
|
||||
require.Equal(t, tc.expectedOutputError, actualError)
|
||||
require.Equal(t, tc.expectedOutputBytes, actualOutput)
|
||||
must.Eq(t, tc.expectedOutputError, actualError)
|
||||
must.Eq(t, tc.expectedOutputBytes, actualOutput)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestStateStoreSchema(t *testing.T) {
|
||||
@@ -28,8 +27,6 @@ func TestStateStoreSchema(t *testing.T) {
|
||||
func TestState_singleRecord(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
|
||||
require := require.New(t)
|
||||
|
||||
const (
|
||||
singletonTable = "cluster_meta"
|
||||
singletonIDIdx = "id"
|
||||
@@ -40,7 +37,7 @@ func TestState_singleRecord(t *testing.T) {
|
||||
singletonTable: clusterMetaTableSchema(),
|
||||
},
|
||||
})
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// numRecords in table counts all the items in the table, which is expected
|
||||
// to always be 1 since that's the point of the singletonRecord Indexer.
|
||||
@@ -49,7 +46,7 @@ func TestState_singleRecord(t *testing.T) {
|
||||
defer txn.Abort()
|
||||
|
||||
iter, err := txn.Get(singletonTable, singletonIDIdx)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
num := 0
|
||||
for item := iter.Next(); item != nil; item = iter.Next() {
|
||||
@@ -64,7 +61,7 @@ func TestState_singleRecord(t *testing.T) {
|
||||
setSingleton := func(s string) {
|
||||
txn := db.Txn(true)
|
||||
err := txn.Insert(singletonTable, s)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
txn.Commit()
|
||||
}
|
||||
|
||||
@@ -75,9 +72,9 @@ func TestState_singleRecord(t *testing.T) {
|
||||
txn := db.Txn(false)
|
||||
defer txn.Abort()
|
||||
record, err := txn.First(singletonTable, singletonIDIdx)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
s, ok := record.(string)
|
||||
require.True(ok)
|
||||
must.True(t, ok)
|
||||
return s
|
||||
}
|
||||
|
||||
@@ -85,16 +82,16 @@ func TestState_singleRecord(t *testing.T) {
|
||||
// a single "singleton" record existing in the table.
|
||||
|
||||
setSingleton("one")
|
||||
require.Equal(1, numRecordsInTable())
|
||||
require.Equal("one", first())
|
||||
must.Eq(t, 1, numRecordsInTable())
|
||||
must.Eq(t, "one", first())
|
||||
|
||||
setSingleton("two")
|
||||
require.Equal(1, numRecordsInTable())
|
||||
require.Equal("two", first())
|
||||
must.Eq(t, 1, numRecordsInTable())
|
||||
must.Eq(t, "two", first())
|
||||
|
||||
setSingleton("three")
|
||||
require.Equal(1, numRecordsInTable())
|
||||
require.Equal("three", first())
|
||||
must.Eq(t, 1, numRecordsInTable())
|
||||
must.Eq(t, "three", first())
|
||||
}
|
||||
|
||||
func Test_jobIsGCable(t *testing.T) {
|
||||
@@ -270,8 +267,6 @@ func Test_jobIsGCable(t *testing.T) {
|
||||
func TestState_ScalingPolicyTargetFieldIndex_FromObject(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
|
||||
require := require.New(t)
|
||||
|
||||
policy := mock.ScalingPolicy()
|
||||
policy.Target["TestField"] = "test"
|
||||
|
||||
@@ -281,49 +276,49 @@ func TestState_ScalingPolicyTargetFieldIndex_FromObject(t *testing.T) {
|
||||
|
||||
// Check if box indexers can find the test field
|
||||
ok, val, err := indexersAllowMissingTrue.FromObject(policy)
|
||||
require.True(ok)
|
||||
require.NoError(err)
|
||||
require.Equal("test\x00", string(val))
|
||||
must.True(t, ok)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "test\x00", string(val))
|
||||
|
||||
ok, val, err = indexersAllowMissingFalse.FromObject(policy)
|
||||
require.True(ok)
|
||||
require.NoError(err)
|
||||
require.Equal("test\x00", string(val))
|
||||
must.True(t, ok)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "test\x00", string(val))
|
||||
|
||||
// Check for empty field
|
||||
policy.Target["TestField"] = ""
|
||||
|
||||
ok, val, err = indexersAllowMissingTrue.FromObject(policy)
|
||||
require.True(ok)
|
||||
require.NoError(err)
|
||||
require.Equal("\x00", string(val))
|
||||
must.True(t, ok)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "\x00", string(val))
|
||||
|
||||
ok, val, err = indexersAllowMissingFalse.FromObject(policy)
|
||||
require.True(ok)
|
||||
require.NoError(err)
|
||||
require.Equal("\x00", string(val))
|
||||
must.True(t, ok)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "\x00", string(val))
|
||||
|
||||
// Check for missing field
|
||||
delete(policy.Target, "TestField")
|
||||
|
||||
ok, val, err = indexersAllowMissingTrue.FromObject(policy)
|
||||
require.True(ok)
|
||||
require.NoError(err)
|
||||
require.Equal("\x00", string(val))
|
||||
must.True(t, ok)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "\x00", string(val))
|
||||
|
||||
ok, val, err = indexersAllowMissingFalse.FromObject(policy)
|
||||
require.False(ok)
|
||||
require.NoError(err)
|
||||
require.Equal("", string(val))
|
||||
must.False(t, ok)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "", string(val))
|
||||
|
||||
// Check for invalid input
|
||||
ok, val, err = indexersAllowMissingTrue.FromObject("not-a-scaling-policy")
|
||||
require.False(ok)
|
||||
require.Error(err)
|
||||
require.Equal("", string(val))
|
||||
must.False(t, ok)
|
||||
must.Error(t, err)
|
||||
must.Eq(t, "", string(val))
|
||||
|
||||
ok, val, err = indexersAllowMissingFalse.FromObject("not-a-scaling-policy")
|
||||
require.False(ok)
|
||||
require.Error(err)
|
||||
require.Equal("", string(val))
|
||||
must.False(t, ok)
|
||||
must.Error(t, err)
|
||||
must.Eq(t, "", string(val))
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestStateStore_ACLTokensByExpired(t *testing.T) {
|
||||
@@ -46,17 +45,17 @@ func TestStateStore_ACLTokensByExpired(t *testing.T) {
|
||||
// the state.
|
||||
err := testState.UpsertACLTokens(structs.MsgTypeTestSetup, 10, []*structs.ACLToken{
|
||||
neverExpireLocalToken, neverExpireGlobalToken})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
iter, err := testState.ACLTokensByExpired(true)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
tokens := fromIteratorFunc(iter)
|
||||
require.Len(t, tokens, 0)
|
||||
must.Len(t, 0, tokens)
|
||||
|
||||
iter, err = testState.ACLTokensByExpired(false)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
tokens = fromIteratorFunc(iter)
|
||||
require.Len(t, tokens, 0)
|
||||
must.Len(t, 0, tokens)
|
||||
|
||||
// Generate, upsert, and test an expired local token. This token expired
|
||||
// long ago and therefore before all others coming in the tests. It should
|
||||
@@ -65,13 +64,13 @@ func TestStateStore_ACLTokensByExpired(t *testing.T) {
|
||||
expiredLocalToken.ExpirationTime = pointer.Of(expiryTimeThreshold.Add(-48 * time.Hour))
|
||||
|
||||
err = testState.UpsertACLTokens(structs.MsgTypeTestSetup, 20, []*structs.ACLToken{expiredLocalToken})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
iter, err = testState.ACLTokensByExpired(false)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
tokens = fromIteratorFunc(iter)
|
||||
require.Len(t, tokens, 1)
|
||||
require.Equal(t, expiredLocalToken.AccessorID, tokens[0].AccessorID)
|
||||
must.Len(t, 1, tokens)
|
||||
must.Eq(t, expiredLocalToken.AccessorID, tokens[0].AccessorID)
|
||||
|
||||
// Generate, upsert, and test an expired global token. This token expired
|
||||
// long ago and therefore before all others coming in the tests. It should
|
||||
@@ -81,13 +80,13 @@ func TestStateStore_ACLTokensByExpired(t *testing.T) {
|
||||
expiredGlobalToken.ExpirationTime = pointer.Of(expiryTimeThreshold.Add(-48 * time.Hour))
|
||||
|
||||
err = testState.UpsertACLTokens(structs.MsgTypeTestSetup, 30, []*structs.ACLToken{expiredGlobalToken})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
iter, err = testState.ACLTokensByExpired(true)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
tokens = fromIteratorFunc(iter)
|
||||
require.Len(t, tokens, 1)
|
||||
require.Equal(t, expiredGlobalToken.AccessorID, tokens[0].AccessorID)
|
||||
must.Len(t, 1, tokens)
|
||||
must.Eq(t, expiredGlobalToken.AccessorID, tokens[0].AccessorID)
|
||||
|
||||
// This test function allows us to run the same test for local and global
|
||||
// tokens.
|
||||
@@ -113,16 +112,16 @@ func TestStateStore_ACLTokensByExpired(t *testing.T) {
|
||||
}
|
||||
|
||||
err = testState.UpsertACLTokens(structs.MsgTypeTestSetup, 40, mixedTokens)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Check the full listing works as expected as the first 11 elements
|
||||
// should all be our expired tokens. Ensure our oldest expired token is
|
||||
// first in the list.
|
||||
iter, err = testState.ACLTokensByExpired(global)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
tokens = fromIteratorFunc(iter)
|
||||
require.ElementsMatch(t, expiredTokens, tokens[:11])
|
||||
require.Equal(t, tokens[0], oldToken)
|
||||
must.SliceContainsAll(t, expiredTokens, tokens[:11])
|
||||
must.Eq(t, tokens[0], oldToken)
|
||||
}
|
||||
|
||||
testFn(expiredLocalToken, false)
|
||||
@@ -150,7 +149,7 @@ func Test_expiresIndexName(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
actualOutput := expiresIndexName(tc.globalInput)
|
||||
require.Equal(t, tc.expectedOutput, actualOutput)
|
||||
must.Eq(t, tc.expectedOutput, actualOutput)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -164,7 +163,7 @@ func TestStateStore_UpsertACLRoles(t *testing.T) {
|
||||
// exist.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole()}
|
||||
err := testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false)
|
||||
require.ErrorContains(t, err, "policy not found")
|
||||
must.ErrorContains(t, err, "policy not found")
|
||||
|
||||
// Create the policies our ACL roles wants to link to and then try the
|
||||
// upsert again.
|
||||
@@ -173,20 +172,20 @@ func TestStateStore_UpsertACLRoles(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
initialIndex, err := testState.Index(TableACLRoles)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 20, initialIndex)
|
||||
|
||||
// List all the ACL roles in the table, so we can perform a number of tests
|
||||
// on the return array.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetACLRoles(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Count how many table entries we have, to ensure it is the expected
|
||||
// number.
|
||||
@@ -200,13 +199,13 @@ func TestStateStore_UpsertACLRoles(t *testing.T) {
|
||||
must.Eq(t, 20, aclRole.CreateIndex)
|
||||
must.Eq(t, 20, aclRole.ModifyIndex)
|
||||
}
|
||||
require.Equal(t, 1, count, "incorrect number of ACL roles found")
|
||||
must.Eq(t, 1, count, must.Sprint("incorrect number of ACL roles found"))
|
||||
|
||||
// Try writing the same ACL roles to state which should not result in an
|
||||
// update to the table index.
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 30, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 30, mockedACLRoles, false))
|
||||
reInsertActualIndex, err := testState.Index(TableACLRoles)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 20, reInsertActualIndex)
|
||||
|
||||
// Make a change to one of the ACL roles and ensure this update is accepted
|
||||
@@ -214,17 +213,17 @@ func TestStateStore_UpsertACLRoles(t *testing.T) {
|
||||
updatedMockedACLRole := mockedACLRoles[0].Copy()
|
||||
updatedMockedACLRole.Policies = []*structs.ACLRolePolicyLink{{Name: "mocked-test-policy-1"}}
|
||||
updatedMockedACLRole.SetHash()
|
||||
require.NoError(t, testState.UpsertACLRoles(
|
||||
must.NoError(t, testState.UpsertACLRoles(
|
||||
structs.MsgTypeTestSetup, 30, []*structs.ACLRole{updatedMockedACLRole}, false))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
updatedIndex, err := testState.Index(TableACLRoles)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 30, updatedIndex)
|
||||
|
||||
// List the ACL roles in state.
|
||||
iter, err = testState.GetACLRoles(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Count how many table entries we have, to ensure it is the expected
|
||||
// number.
|
||||
@@ -238,17 +237,17 @@ func TestStateStore_UpsertACLRoles(t *testing.T) {
|
||||
must.Eq(t, 20, aclRole.CreateIndex)
|
||||
must.Eq(t, 30, aclRole.ModifyIndex)
|
||||
}
|
||||
require.Equal(t, 1, count, "incorrect number of ACL roles found")
|
||||
must.Eq(t, 1, count, must.Sprint("incorrect number of ACL roles found"))
|
||||
|
||||
// Now try inserting an ACL role using the missing policies' argument to
|
||||
// simulate replication.
|
||||
replicatedACLRole := mock.ACLRole()
|
||||
replicatedACLRole.Policies = []*structs.ACLRolePolicyLink{{Name: "nope"}}
|
||||
require.NoError(t, testState.UpsertACLRoles(
|
||||
must.NoError(t, testState.UpsertACLRoles(
|
||||
structs.MsgTypeTestSetup, 40, []*structs.ACLRole{replicatedACLRole}, true))
|
||||
|
||||
replicatedACLRoleResp, err := testState.GetACLRoleByName(ws, replicatedACLRole.Name)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, replicatedACLRole.Hash, replicatedACLRoleResp.Hash)
|
||||
|
||||
// Try adding a new ACL role, which has a name clash with an existing
|
||||
@@ -258,7 +257,7 @@ func TestStateStore_UpsertACLRoles(t *testing.T) {
|
||||
|
||||
err = testState.UpsertACLRoles(structs.MsgTypeTestSetup, 50,
|
||||
[]*structs.ACLRole{dupRoleName}, false)
|
||||
require.ErrorContains(t, err, fmt.Sprintf("ACL role with name %s already exists", dupRoleName.Name))
|
||||
must.ErrorContains(t, err, fmt.Sprintf("ACL role with name %s already exists", dupRoleName.Name))
|
||||
}
|
||||
|
||||
func TestStateStore_ValidateACLRolePolicyLinks(t *testing.T) {
|
||||
@@ -270,23 +269,23 @@ func TestStateStore_ValidateACLRolePolicyLinks(t *testing.T) {
|
||||
|
||||
// This should error as no policies exist within state.
|
||||
err := testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false)
|
||||
require.ErrorContains(t, err, "ACL policy not found")
|
||||
must.ErrorContains(t, err, "ACL policy not found")
|
||||
|
||||
// Upsert one ACL policy and retry the role which should still fail.
|
||||
policy1 := mock.ACLPolicy()
|
||||
policy1.Name = "mocked-test-policy-1"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1}))
|
||||
must.NoError(t, testState.UpsertACLPolicies(structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1}))
|
||||
err = testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false)
|
||||
require.ErrorContains(t, err, "ACL policy not found")
|
||||
must.ErrorContains(t, err, "ACL policy not found")
|
||||
|
||||
// Upsert the second ACL policy. The ACL role should now upsert into state
|
||||
// without error.
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(structs.MsgTypeTestSetup, 20, []*structs.ACLPolicy{policy2}))
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 30, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLPolicies(structs.MsgTypeTestSetup, 20, []*structs.ACLPolicy{policy2}))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 30, mockedACLRoles, false))
|
||||
}
|
||||
|
||||
func TestStateStore_DeleteACLRolesByID(t *testing.T) {
|
||||
@@ -299,37 +298,37 @@ func TestStateStore_DeleteACLRolesByID(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
|
||||
// Try and delete a role using a name that doesn't exist. This should
|
||||
// return an error and not change the index for the table.
|
||||
err := testState.DeleteACLRolesByID(structs.MsgTypeTestSetup, 20, []string{"not-a-role"})
|
||||
require.ErrorContains(t, err, "ACL role not found")
|
||||
must.ErrorContains(t, err, "ACL role not found")
|
||||
|
||||
tableIndex, err := testState.Index(TableACLRoles)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 10, tableIndex)
|
||||
|
||||
// Delete one of the previously upserted ACL roles. This should succeed
|
||||
// and modify the table index.
|
||||
err = testState.DeleteACLRolesByID(structs.MsgTypeTestSetup, 20, []string{mockedACLRoles[0].ID})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
tableIndex, err = testState.Index(TableACLRoles)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 20, tableIndex)
|
||||
|
||||
// List the ACL roles and ensure we now only have one present and that it
|
||||
// is the one we expect.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetACLRoles(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var aclRoles []*structs.ACLRole
|
||||
|
||||
@@ -337,28 +336,28 @@ func TestStateStore_DeleteACLRolesByID(t *testing.T) {
|
||||
aclRoles = append(aclRoles, raw.(*structs.ACLRole))
|
||||
}
|
||||
|
||||
require.Len(t, aclRoles, 1, "incorrect number of ACL roles found")
|
||||
require.True(t, aclRoles[0].Equal(mockedACLRoles[1]))
|
||||
must.Len(t, 1, aclRoles, must.Sprint("incorrect number of ACL roles found"))
|
||||
must.True(t, aclRoles[0].Equal(mockedACLRoles[1]))
|
||||
|
||||
// Delete the final remaining ACL role. This should succeed and modify the
|
||||
// table index.
|
||||
err = testState.DeleteACLRolesByID(structs.MsgTypeTestSetup, 30, []string{mockedACLRoles[1].ID})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
tableIndex, err = testState.Index(TableACLRoles)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 30, tableIndex)
|
||||
|
||||
// List the ACL roles and ensure we have zero entries.
|
||||
iter, err = testState.GetACLRoles(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
aclRoles = []*structs.ACLRole{}
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
aclRoles = append(aclRoles, raw.(*structs.ACLRole))
|
||||
}
|
||||
require.Len(t, aclRoles, 0, "incorrect number of ACL roles found")
|
||||
must.Len(t, 0, aclRoles, must.Sprint("incorrect number of ACL roles found"))
|
||||
}
|
||||
|
||||
func TestStateStore_GetACLRoles(t *testing.T) {
|
||||
@@ -371,18 +370,18 @@ func TestStateStore_GetACLRoles(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
|
||||
// List the ACL roles and ensure they are exactly as we expect.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetACLRoles(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var aclRoles []*structs.ACLRole
|
||||
|
||||
@@ -396,7 +395,7 @@ func TestStateStore_GetACLRoles(t *testing.T) {
|
||||
expected[i].ModifyIndex = 10
|
||||
}
|
||||
|
||||
require.ElementsMatch(t, aclRoles, expected)
|
||||
must.SliceContainsAll(t, aclRoles, expected)
|
||||
}
|
||||
|
||||
func TestStateStore_GetACLRoleByID(t *testing.T) {
|
||||
@@ -409,29 +408,29 @@ func TestStateStore_GetACLRoleByID(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Try reading an ACL role that does not exist.
|
||||
aclRole, err := testState.GetACLRoleByID(ws, "not-a-role")
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, aclRole)
|
||||
must.NoError(t, err)
|
||||
must.Nil(t, aclRole)
|
||||
|
||||
// Read the two ACL roles that we should find.
|
||||
aclRole, err = testState.GetACLRoleByID(ws, mockedACLRoles[0].ID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, mockedACLRoles[0], aclRole)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, mockedACLRoles[0], aclRole)
|
||||
|
||||
aclRole, err = testState.GetACLRoleByID(ws, mockedACLRoles[1].ID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, mockedACLRoles[1], aclRole)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, mockedACLRoles[1], aclRole)
|
||||
}
|
||||
|
||||
func TestStateStore_GetACLRoleByName(t *testing.T) {
|
||||
@@ -444,29 +443,29 @@ func TestStateStore_GetACLRoleByName(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Try reading an ACL role that does not exist.
|
||||
aclRole, err := testState.GetACLRoleByName(ws, "not-a-role")
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, aclRole)
|
||||
must.NoError(t, err)
|
||||
must.Nil(t, aclRole)
|
||||
|
||||
// Read the two ACL roles that we should find.
|
||||
aclRole, err = testState.GetACLRoleByName(ws, mockedACLRoles[0].Name)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, mockedACLRoles[0], aclRole)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, mockedACLRoles[0], aclRole)
|
||||
|
||||
aclRole, err = testState.GetACLRoleByName(ws, mockedACLRoles[1].Name)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, mockedACLRoles[1], aclRole)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, mockedACLRoles[1], aclRole)
|
||||
}
|
||||
|
||||
func TestStateStore_GetACLRoleByIDPrefix(t *testing.T) {
|
||||
@@ -479,7 +478,7 @@ func TestStateStore_GetACLRoleByIDPrefix(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
@@ -488,29 +487,29 @@ func TestStateStore_GetACLRoleByIDPrefix(t *testing.T) {
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
mockedACLRoles[0].ID = "test-prefix-" + uuid.Generate()
|
||||
mockedACLRoles[1].ID = "test-prefix-" + uuid.Generate()
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 10, mockedACLRoles, false))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Try using a prefix that doesn't match any entries.
|
||||
iter, err := testState.GetACLRoleByIDPrefix(ws, "nope")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var aclRoles []*structs.ACLRole
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
aclRoles = append(aclRoles, raw.(*structs.ACLRole))
|
||||
}
|
||||
require.Len(t, aclRoles, 0)
|
||||
must.Len(t, 0, aclRoles)
|
||||
|
||||
// Use a prefix which should match two entries in state.
|
||||
iter, err = testState.GetACLRoleByIDPrefix(ws, "test-prefix-")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
aclRoles = []*structs.ACLRole{}
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
aclRoles = append(aclRoles, raw.(*structs.ACLRole))
|
||||
}
|
||||
require.Len(t, aclRoles, 2)
|
||||
must.Len(t, 2, aclRoles)
|
||||
}
|
||||
|
||||
func TestStateStore_fixTokenRoleLinks(t *testing.T) {
|
||||
@@ -531,26 +530,26 @@ func TestStateStore_fixTokenRoleLinks(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
|
||||
// Create an ACL token linking to the ACL role.
|
||||
token1 := mock.ACLToken()
|
||||
token1.Roles = []*structs.ACLTokenRoleLink{{ID: mockedACLRoles[0].ID}}
|
||||
require.NoError(t, testState.UpsertACLTokens(
|
||||
must.NoError(t, testState.UpsertACLTokens(
|
||||
structs.MsgTypeTestSetup, 20, []*structs.ACLToken{token1}))
|
||||
|
||||
// Perform the fix and check the returned token contains the
|
||||
// correct roles.
|
||||
readTxn := testState.db.ReadTxn()
|
||||
outputToken, err := testState.fixTokenRoleLinks(readTxn, token1)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, outputToken.Roles, []*structs.ACLTokenRoleLink{{
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, outputToken.Roles, []*structs.ACLTokenRoleLink{{
|
||||
Name: mockedACLRoles[0].Name, ID: mockedACLRoles[0].ID,
|
||||
}})
|
||||
},
|
||||
@@ -566,31 +565,31 @@ func TestStateStore_fixTokenRoleLinks(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
|
||||
// Create an ACL token linking to the ACL roles.
|
||||
token1 := mock.ACLToken()
|
||||
token1.Roles = []*structs.ACLTokenRoleLink{{ID: mockedACLRoles[0].ID}, {ID: mockedACLRoles[1].ID}}
|
||||
require.NoError(t, testState.UpsertACLTokens(
|
||||
must.NoError(t, testState.UpsertACLTokens(
|
||||
structs.MsgTypeTestSetup, 30, []*structs.ACLToken{token1}))
|
||||
|
||||
// Now delete one of the ACL roles from state.
|
||||
require.NoError(t, testState.DeleteACLRolesByID(
|
||||
must.NoError(t, testState.DeleteACLRolesByID(
|
||||
structs.MsgTypeTestSetup, 40, []string{mockedACLRoles[0].ID}))
|
||||
|
||||
// Perform the fix and check the returned token contains the
|
||||
// correct roles.
|
||||
readTxn := testState.db.ReadTxn()
|
||||
outputToken, err := testState.fixTokenRoleLinks(readTxn, token1)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, outputToken.Roles, 1)
|
||||
require.Equal(t, outputToken.Roles, []*structs.ACLTokenRoleLink{{
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 1, outputToken.Roles)
|
||||
must.Eq(t, outputToken.Roles, []*structs.ACLTokenRoleLink{{
|
||||
Name: mockedACLRoles[1].Name, ID: mockedACLRoles[1].ID,
|
||||
}})
|
||||
},
|
||||
@@ -606,31 +605,31 @@ func TestStateStore_fixTokenRoleLinks(t *testing.T) {
|
||||
policy2 := mock.ACLPolicy()
|
||||
policy2.Name = "mocked-test-policy-2"
|
||||
|
||||
require.NoError(t, testState.UpsertACLPolicies(
|
||||
must.NoError(t, testState.UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{policy1, policy2}))
|
||||
|
||||
// Generate a some mocked ACL roles for testing and upsert these straight
|
||||
// into state.
|
||||
mockedACLRoles := []*structs.ACLRole{mock.ACLRole(), mock.ACLRole()}
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 20, mockedACLRoles, false))
|
||||
|
||||
// Create an ACL token linking to the ACL roles.
|
||||
token1 := mock.ACLToken()
|
||||
token1.Roles = []*structs.ACLTokenRoleLink{{ID: mockedACLRoles[0].ID}, {ID: mockedACLRoles[1].ID}}
|
||||
require.NoError(t, testState.UpsertACLTokens(
|
||||
must.NoError(t, testState.UpsertACLTokens(
|
||||
structs.MsgTypeTestSetup, 30, []*structs.ACLToken{token1}))
|
||||
|
||||
// Now change the name of one of the ACL roles.
|
||||
mockedACLRoles[0].Name = "badger-badger-badger"
|
||||
require.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 40, mockedACLRoles, false))
|
||||
must.NoError(t, testState.UpsertACLRoles(structs.MsgTypeTestSetup, 40, mockedACLRoles, false))
|
||||
|
||||
// Perform the fix and check the returned token contains the
|
||||
// correct roles.
|
||||
readTxn := testState.db.ReadTxn()
|
||||
outputToken, err := testState.fixTokenRoleLinks(readTxn, token1)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, outputToken.Roles, 2)
|
||||
require.ElementsMatch(t, outputToken.Roles, []*structs.ACLTokenRoleLink{
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 2, outputToken.Roles)
|
||||
must.SliceContainsAll(t, outputToken.Roles, []*structs.ACLTokenRoleLink{
|
||||
{Name: mockedACLRoles[0].Name, ID: mockedACLRoles[0].ID},
|
||||
{Name: mockedACLRoles[1].Name, ID: mockedACLRoles[1].ID},
|
||||
})
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
@@ -26,18 +26,18 @@ func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
|
||||
// Perform the initial upsert of service registrations.
|
||||
err := testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, insertIndex, services)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
initialIndex, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, insertIndex, initialIndex)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, insertIndex, initialIndex)
|
||||
|
||||
// List all the service registrations in the table, so we can perform a
|
||||
// number of tests on the return array.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Count how many table entries we have, to ensure it is the expected
|
||||
// number.
|
||||
@@ -48,20 +48,22 @@ func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
|
||||
// Ensure the create and modify indexes are populated correctly.
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, insertIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, insertIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
must.Eq(t, insertIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, insertIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
}
|
||||
require.Equal(t, 2, count, "incorrect number of service registrations found")
|
||||
must.Eq(t, 2, count, must.Sprint("incorrect number of service registrations found"))
|
||||
|
||||
// SubTest Marker: This section attempts to upsert the exact same service
|
||||
// registrations without any modification. In this case, the index table
|
||||
// should not be updated, indicating no write actually happened due to
|
||||
// equality checking.
|
||||
reInsertIndex := uint64(30)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, reInsertIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, reInsertIndex, services))
|
||||
reInsertActualIndex, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, insertIndex, reInsertActualIndex, "index should not have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, insertIndex, reInsertActualIndex, must.Sprint("index should not have changed"))
|
||||
|
||||
// SubTest Marker: This section modifies a single one of the previously
|
||||
// inserted service registrations and performs an upsert. This ensures the
|
||||
@@ -72,16 +74,16 @@ func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
services1Update := []*structs.ServiceRegistration{service1Update}
|
||||
|
||||
update1Index := uint64(40)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, update1Index, services1Update))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, update1Index, services1Update))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
updateActualIndex, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, update1Index, updateActualIndex, "index should have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, update1Index, updateActualIndex, must.Sprint("index should have changed"))
|
||||
|
||||
// Get the service registrations from the table.
|
||||
iter, err = testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Iterate all the stored registrations and assert they are as expected.
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
@@ -98,8 +100,10 @@ func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
t.Errorf("unknown service registration found: %s", serviceReg.ID)
|
||||
continue
|
||||
}
|
||||
require.Equal(t, insertIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, expectedModifyIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
must.Eq(t, insertIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, expectedModifyIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
}
|
||||
|
||||
// SubTest Marker: Here we modify the second registration but send an
|
||||
@@ -109,16 +113,16 @@ func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
services2Update := []*structs.ServiceRegistration{service1Update, service2Update}
|
||||
|
||||
update2Index := uint64(50)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, update2Index, services2Update))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, update2Index, services2Update))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
update2ActualIndex, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, update2Index, update2ActualIndex, "index should have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, update2Index, update2ActualIndex, must.Sprint("index should have changed"))
|
||||
|
||||
// Get the service registrations from the table.
|
||||
iter, err = testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Iterate all the stored registrations and assert they are as expected.
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
@@ -140,9 +144,12 @@ func TestStateStore_UpsertServiceRegistrations(t *testing.T) {
|
||||
t.Errorf("unknown service registration found: %s", serviceReg.ID)
|
||||
continue
|
||||
}
|
||||
require.Equal(t, insertIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, expectedModifyIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
require.True(t, expectedServiceReg.Equal(serviceReg))
|
||||
|
||||
must.Eq(t, insertIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, expectedModifyIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
must.True(t, expectedServiceReg.Equal(serviceReg))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,31 +166,31 @@ func TestStateStore_DeleteServiceRegistrationByID(t *testing.T) {
|
||||
initialIndex := uint64(10)
|
||||
err := testState.DeleteServiceRegistrationByID(
|
||||
structs.MsgTypeTestSetup, initialIndex, services[0].Namespace, services[0].ID)
|
||||
require.EqualError(t, err, "service registration not found")
|
||||
must.EqError(t, err, "service registration not found")
|
||||
|
||||
actualInitialIndex, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint64(0), actualInitialIndex, "index should not have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, uint64(0), actualInitialIndex, must.Sprint("index should not have changed"))
|
||||
|
||||
// SubTest Marker: This section upserts two registrations, deletes one,
|
||||
// then ensure the remaining is left as expected.
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
// Perform the delete.
|
||||
delete1Index := uint64(20)
|
||||
require.NoError(t, testState.DeleteServiceRegistrationByID(
|
||||
must.NoError(t, testState.DeleteServiceRegistrationByID(
|
||||
structs.MsgTypeTestSetup, delete1Index, services[0].Namespace, services[0].ID))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
actualDelete1Index, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, delete1Index, actualDelete1Index, "index should have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, delete1Index, actualDelete1Index, must.Sprint("index should have changed"))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Get the service registrations from the table.
|
||||
iter, err := testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var delete1Count int
|
||||
|
||||
@@ -192,22 +199,22 @@ func TestStateStore_DeleteServiceRegistrationByID(t *testing.T) {
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
delete1Count++
|
||||
}
|
||||
require.Equal(t, 1, delete1Count, "unexpected number of registrations in table")
|
||||
must.Eq(t, 1, delete1Count, must.Sprint("unexpected number of registrations in table"))
|
||||
|
||||
// SubTest Marker: Delete the remaining registration and ensure all indexes
|
||||
// are updated as expected and the table is empty.
|
||||
delete2Index := uint64(30)
|
||||
require.NoError(t, testState.DeleteServiceRegistrationByID(
|
||||
must.NoError(t, testState.DeleteServiceRegistrationByID(
|
||||
structs.MsgTypeTestSetup, delete2Index, services[1].Namespace, services[1].ID))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
actualDelete2Index, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, delete2Index, actualDelete2Index, "index should have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, delete2Index, actualDelete2Index, must.Sprint("index should have changed"))
|
||||
|
||||
// Get the service registrations from the table.
|
||||
iter, err = testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var delete2Count int
|
||||
|
||||
@@ -216,7 +223,7 @@ func TestStateStore_DeleteServiceRegistrationByID(t *testing.T) {
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
delete2Count++
|
||||
}
|
||||
require.Equal(t, 0, delete2Count, "unexpected number of registrations in table")
|
||||
must.Eq(t, 0, delete2Count, must.Sprint("unexpected number of registrations in table"))
|
||||
}
|
||||
|
||||
func TestStateStore_DeleteServiceRegistrationByNodeID(t *testing.T) {
|
||||
@@ -230,32 +237,31 @@ func TestStateStore_DeleteServiceRegistrationByNodeID(t *testing.T) {
|
||||
// by a nodeID that does not exist. This is easy to perform here as the
|
||||
// state is empty.
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t,
|
||||
testState.DeleteServiceRegistrationByNodeID(structs.MsgTypeTestSetup, initialIndex, services[0].NodeID))
|
||||
must.NoError(t, testState.DeleteServiceRegistrationByNodeID(structs.MsgTypeTestSetup, initialIndex, services[0].NodeID))
|
||||
|
||||
actualInitialIndex, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint64(0), actualInitialIndex, "index should not have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, uint64(0), actualInitialIndex, must.Sprint("index should not have changed"))
|
||||
|
||||
// SubTest Marker: This section upserts two registrations then deletes one
|
||||
// by using the nodeID.
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
// Perform the delete.
|
||||
delete1Index := uint64(20)
|
||||
require.NoError(t, testState.DeleteServiceRegistrationByNodeID(
|
||||
must.NoError(t, testState.DeleteServiceRegistrationByNodeID(
|
||||
structs.MsgTypeTestSetup, delete1Index, services[0].NodeID))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
actualDelete1Index, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, delete1Index, actualDelete1Index, "index should have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, delete1Index, actualDelete1Index, must.Sprint("index should have changed"))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Get the service registrations from the table.
|
||||
iter, err := testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var delete1Count int
|
||||
|
||||
@@ -264,7 +270,7 @@ func TestStateStore_DeleteServiceRegistrationByNodeID(t *testing.T) {
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
delete1Count++
|
||||
}
|
||||
require.Equal(t, 1, delete1Count, "unexpected number of registrations in table")
|
||||
must.Eq(t, 1, delete1Count, must.Sprint("unexpected number of registrations in table"))
|
||||
|
||||
// SubTest Marker: Add multiple service registrations for a single nodeID
|
||||
// then delete these via the nodeID.
|
||||
@@ -289,21 +295,20 @@ func TestStateStore_DeleteServiceRegistrationByNodeID(t *testing.T) {
|
||||
|
||||
// Upsert the new service registrations.
|
||||
delete2UpsertIndex := uint64(30)
|
||||
require.NoError(t,
|
||||
testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, delete2UpsertIndex, delete2NodeServices))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, delete2UpsertIndex, delete2NodeServices))
|
||||
|
||||
delete2Index := uint64(40)
|
||||
require.NoError(t, testState.DeleteServiceRegistrationByNodeID(
|
||||
must.NoError(t, testState.DeleteServiceRegistrationByNodeID(
|
||||
structs.MsgTypeTestSetup, delete2Index, delete2NodeID))
|
||||
|
||||
// Check that the index for the table was modified as expected.
|
||||
actualDelete2Index, err := testState.Index(TableServiceRegistrations)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, delete2Index, actualDelete2Index, "index should have changed")
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, delete2Index, actualDelete2Index, must.Sprint("index should have changed"))
|
||||
|
||||
// Get the service registrations from the table.
|
||||
iter, err = testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var delete2Count int
|
||||
|
||||
@@ -312,7 +317,7 @@ func TestStateStore_DeleteServiceRegistrationByNodeID(t *testing.T) {
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
delete2Count++
|
||||
}
|
||||
require.Equal(t, 0, delete2Count, "unexpected number of registrations in table")
|
||||
must.Eq(t, 0, delete2Count, must.Sprint("unexpected number of registrations in table"))
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrations(t *testing.T) {
|
||||
@@ -322,12 +327,12 @@ func TestStateStore_GetServiceRegistrations(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
// Read the service registrations and check the objects.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetServiceRegistrations(ws)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count int
|
||||
|
||||
@@ -335,19 +340,22 @@ func TestStateStore_GetServiceRegistrations(t *testing.T) {
|
||||
count++
|
||||
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, initialIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, initialIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
|
||||
must.Eq(t, initialIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, initialIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
|
||||
switch serviceReg.ID {
|
||||
case services[0].ID:
|
||||
require.Equal(t, services[0], serviceReg)
|
||||
must.Eq(t, services[0], serviceReg)
|
||||
case services[1].ID:
|
||||
require.Equal(t, services[1], serviceReg)
|
||||
must.Eq(t, services[1], serviceReg)
|
||||
default:
|
||||
t.Errorf("unknown service registration found: %s", serviceReg.ID)
|
||||
}
|
||||
}
|
||||
require.Equal(t, 2, count)
|
||||
must.Eq(t, 2, count)
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrationsByNamespace(t *testing.T) {
|
||||
@@ -357,50 +365,54 @@ func TestStateStore_GetServiceRegistrationsByNamespace(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
// Look up services using the namespace of the first service.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetServiceRegistrationsByNamespace(ws, services[0].Namespace)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count1 int
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count1++
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, initialIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, initialIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
require.Equal(t, services[0].Namespace, serviceReg.Namespace)
|
||||
must.Eq(t, initialIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, initialIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
must.Eq(t, services[0].Namespace, serviceReg.Namespace)
|
||||
}
|
||||
require.Equal(t, 1, count1)
|
||||
must.Eq(t, 1, count1)
|
||||
|
||||
// Look up services using the namespace of the second service.
|
||||
iter, err = testState.GetServiceRegistrationsByNamespace(ws, services[1].Namespace)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count2 int
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count2++
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, initialIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, initialIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
require.Equal(t, services[1].Namespace, serviceReg.Namespace)
|
||||
must.Eq(t, initialIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, initialIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
must.Eq(t, services[1].Namespace, serviceReg.Namespace)
|
||||
}
|
||||
require.Equal(t, 1, count2)
|
||||
must.Eq(t, 1, count2)
|
||||
|
||||
// Look up services using a namespace that shouldn't contain any
|
||||
// registrations.
|
||||
iter, err = testState.GetServiceRegistrationsByNamespace(ws, "pony-club")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count3 int
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count3++
|
||||
}
|
||||
require.Equal(t, 0, count3)
|
||||
must.Eq(t, 0, count3)
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrationByName(t *testing.T) {
|
||||
@@ -410,34 +422,34 @@ func TestStateStore_GetServiceRegistrationByName(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
// Try reading a service by a name that shouldn't exist.
|
||||
ws := memdb.NewWatchSet()
|
||||
iter, err := testState.GetServiceRegistrationByName(ws, "default", "pony-glitter-api")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count1 int
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count1++
|
||||
}
|
||||
require.Equal(t, 0, count1)
|
||||
must.Eq(t, 0, count1)
|
||||
|
||||
// Read one of the known service registrations.
|
||||
expectedReg := services[1].Copy()
|
||||
|
||||
iter, err = testState.GetServiceRegistrationByName(ws, expectedReg.Namespace, expectedReg.ServiceName)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count2 int
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count2++
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, expectedReg.ServiceName, serviceReg.ServiceName)
|
||||
require.Equal(t, expectedReg.Namespace, serviceReg.Namespace)
|
||||
must.Eq(t, expectedReg.ServiceName, serviceReg.ServiceName)
|
||||
must.Eq(t, expectedReg.Namespace, serviceReg.Namespace)
|
||||
}
|
||||
require.Equal(t, 1, count2)
|
||||
must.Eq(t, 1, count2)
|
||||
|
||||
// Create a bunch of additional services whose name and namespace match
|
||||
// that of expectedReg.
|
||||
@@ -460,20 +472,20 @@ func TestStateStore_GetServiceRegistrationByName(t *testing.T) {
|
||||
}
|
||||
|
||||
updateIndex := uint64(20)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, updateIndex, newServices))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, updateIndex, newServices))
|
||||
|
||||
iter, err = testState.GetServiceRegistrationByName(ws, expectedReg.Namespace, expectedReg.ServiceName)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count3 int
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count3++
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, expectedReg.ServiceName, serviceReg.ServiceName)
|
||||
require.Equal(t, expectedReg.Namespace, serviceReg.Namespace)
|
||||
must.Eq(t, expectedReg.ServiceName, serviceReg.ServiceName)
|
||||
must.Eq(t, expectedReg.Namespace, serviceReg.Namespace)
|
||||
}
|
||||
require.Equal(t, 5, count3)
|
||||
must.Eq(t, 5, count3)
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrationByID(t *testing.T) {
|
||||
@@ -483,23 +495,23 @@ func TestStateStore_GetServiceRegistrationByID(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Try reading a service by an ID that shouldn't exist.
|
||||
serviceReg, err := testState.GetServiceRegistrationByID(ws, "default", "pony-glitter-sparkles")
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, serviceReg)
|
||||
must.NoError(t, err)
|
||||
must.Nil(t, serviceReg)
|
||||
|
||||
// Read the two services that we should find.
|
||||
serviceReg, err = testState.GetServiceRegistrationByID(ws, services[0].Namespace, services[0].ID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, services[0], serviceReg)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, services[0], serviceReg)
|
||||
|
||||
serviceReg, err = testState.GetServiceRegistrationByID(ws, services[1].Namespace, services[1].ID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, services[1], serviceReg)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, services[1], serviceReg)
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrationsByAllocID(t *testing.T) {
|
||||
@@ -509,43 +521,43 @@ func TestStateStore_GetServiceRegistrationsByAllocID(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Try reading services by an allocation that doesn't have any
|
||||
// registrations.
|
||||
iter, err := testState.GetServiceRegistrationsByAllocID(ws, "4eed3c6d-6bf1-60d6-040a-e347accae6c4")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count1 int
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count1++
|
||||
}
|
||||
require.Equal(t, 0, count1)
|
||||
must.Eq(t, 0, count1)
|
||||
|
||||
// Read the two allocations that we should find.
|
||||
iter, err = testState.GetServiceRegistrationsByAllocID(ws, services[0].AllocID)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count2 int
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count2++
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, services[0].AllocID, serviceReg.AllocID)
|
||||
must.Eq(t, services[0].AllocID, serviceReg.AllocID)
|
||||
}
|
||||
require.Equal(t, 1, count2)
|
||||
must.Eq(t, 1, count2)
|
||||
|
||||
iter, err = testState.GetServiceRegistrationsByAllocID(ws, services[1].AllocID)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count3 int
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count3++
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, services[1].AllocID, serviceReg.AllocID)
|
||||
must.Eq(t, services[1].AllocID, serviceReg.AllocID)
|
||||
}
|
||||
require.Equal(t, 1, count3)
|
||||
must.Eq(t, 1, count3)
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrationsByJobID(t *testing.T) {
|
||||
@@ -555,47 +567,51 @@ func TestStateStore_GetServiceRegistrationsByJobID(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Perform a query against a job that shouldn't have any registrations.
|
||||
iter, err := testState.GetServiceRegistrationsByJobID(ws, "default", "tamagotchi")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var count1 int
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
count1++
|
||||
}
|
||||
require.Equal(t, 0, count1)
|
||||
must.Eq(t, 0, count1)
|
||||
|
||||
// Look up services using the namespace and jobID of the first service.
|
||||
iter, err = testState.GetServiceRegistrationsByJobID(ws, services[0].Namespace, services[0].JobID)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var outputList1 []*structs.ServiceRegistration
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, initialIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, initialIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
must.Eq(t, initialIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, initialIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
outputList1 = append(outputList1, serviceReg)
|
||||
}
|
||||
require.ElementsMatch(t, outputList1, []*structs.ServiceRegistration{services[0]})
|
||||
must.SliceContainsAll(t, outputList1, []*structs.ServiceRegistration{services[0]})
|
||||
|
||||
// Look up services using the namespace and jobID of the second service.
|
||||
iter, err = testState.GetServiceRegistrationsByJobID(ws, services[1].Namespace, services[1].JobID)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var outputList2 []*structs.ServiceRegistration
|
||||
|
||||
for raw := iter.Next(); raw != nil; raw = iter.Next() {
|
||||
serviceReg := raw.(*structs.ServiceRegistration)
|
||||
require.Equal(t, initialIndex, serviceReg.CreateIndex, "incorrect create index", serviceReg.ID)
|
||||
require.Equal(t, initialIndex, serviceReg.ModifyIndex, "incorrect modify index", serviceReg.ID)
|
||||
must.Eq(t, initialIndex, serviceReg.CreateIndex,
|
||||
must.Sprintf("incorrect create index for %s", serviceReg.ID))
|
||||
must.Eq(t, initialIndex, serviceReg.ModifyIndex,
|
||||
must.Sprintf("incorrect modify index for %s", serviceReg.ID))
|
||||
outputList2 = append(outputList2, serviceReg)
|
||||
}
|
||||
require.ElementsMatch(t, outputList2, []*structs.ServiceRegistration{services[1]})
|
||||
must.SliceContainsAll(t, outputList2, []*structs.ServiceRegistration{services[1]})
|
||||
}
|
||||
|
||||
func TestStateStore_GetServiceRegistrationsByNodeID(t *testing.T) {
|
||||
@@ -605,21 +621,21 @@ func TestStateStore_GetServiceRegistrationsByNodeID(t *testing.T) {
|
||||
// Generate some test services and upsert them.
|
||||
services := mock.ServiceRegistrations()
|
||||
initialIndex := uint64(10)
|
||||
require.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
must.NoError(t, testState.UpsertServiceRegistrations(structs.MsgTypeTestSetup, initialIndex, services))
|
||||
|
||||
ws := memdb.NewWatchSet()
|
||||
|
||||
// Perform a query against a node that shouldn't have any registrations.
|
||||
serviceRegs, err := testState.GetServiceRegistrationsByNodeID(ws, "4eed3c6d-6bf1-60d6-040a-e347accae6c4")
|
||||
require.NoError(t, err)
|
||||
require.Len(t, serviceRegs, 0)
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 0, serviceRegs)
|
||||
|
||||
// Read the two nodes that we should find entries for.
|
||||
serviceRegs, err = testState.GetServiceRegistrationsByNodeID(ws, services[0].NodeID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, serviceRegs, 1)
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 1, serviceRegs)
|
||||
|
||||
serviceRegs, err = testState.GetServiceRegistrationsByNodeID(ws, services[1].NodeID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, serviceRegs, 1)
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 1, serviceRegs)
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user