Skip to content

Commit 3df1095

Browse files
committed
integration-cli: allow temporary errors on leader switch
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 42a0544 commit 3df1095

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

integration-cli/docker_api_swarm_test.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/docker/docker/internal/test/request"
2828
"github.com/docker/swarmkit/ca"
2929
"github.com/go-check/check"
30+
"github.com/pkg/errors"
3031
"gotest.tools/assert"
3132
is "gotest.tools/assert/cmp"
3233
)
@@ -313,13 +314,24 @@ func (s *DockerSwarmSuite) TestAPISwarmLeaderElection(c *check.C) {
313314
leader *daemon.Daemon // keep track of leader
314315
followers []*daemon.Daemon // keep track of followers
315316
)
317+
var lastErr error
316318
checkLeader := func(nodes ...*daemon.Daemon) checkF {
317319
return func(c *check.C) (interface{}, check.CommentInterface) {
318320
// clear these out before each run
319321
leader = nil
320322
followers = nil
321323
for _, d := range nodes {
322-
if d.GetNode(c, d.NodeID()).ManagerStatus.Leader {
324+
n := d.GetNode(c, d.NodeID(), func(err error) bool {
325+
if strings.Contains(errors.Cause(err).Error(), context.DeadlineExceeded.Error()) || strings.Contains(err.Error(), "swarm does not have a leader") {
326+
lastErr = err
327+
return true
328+
}
329+
return false
330+
})
331+
if n == nil {
332+
return false, check.Commentf("failed to get node: %v", lastErr)
333+
}
334+
if n.ManagerStatus.Leader {
323335
leader = d
324336
} else {
325337
followers = append(followers, d)
@@ -391,7 +403,7 @@ func (s *DockerSwarmSuite) TestAPISwarmRaftQuorum(c *check.C) {
391403
defer cli.Close()
392404

393405
// d1 will eventually step down from leader because there is no longer an active quorum, wait for that to happen
394-
waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) {
406+
waitAndAssert(c, defaultReconciliationTimeout*2, func(c *check.C) (interface{}, check.CommentInterface) {
395407
_, err := cli.ServiceCreate(context.Background(), service.Spec, types.ServiceCreateOptions{})
396408
return err.Error(), nil
397409
}, checker.Contains, "Make sure more than half of the managers are online.")

internal/test/daemon/node.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,21 @@ import (
1515
type NodeConstructor func(*swarm.Node)
1616

1717
// GetNode returns a swarm node identified by the specified id
18-
func (d *Daemon) GetNode(t assert.TestingT, id string) *swarm.Node {
18+
func (d *Daemon) GetNode(t assert.TestingT, id string, errCheck ...func(error) bool) *swarm.Node {
1919
if ht, ok := t.(test.HelperT); ok {
2020
ht.Helper()
2121
}
2222
cli := d.NewClientT(t)
2323
defer cli.Close()
2424

2525
node, _, err := cli.NodeInspectWithRaw(context.Background(), id)
26+
if err != nil {
27+
for _, f := range errCheck {
28+
if f(err) {
29+
return nil
30+
}
31+
}
32+
}
2633
assert.NilError(t, err, "[%s] (*Daemon).GetNode: NodeInspectWithRaw(%q) failed", d.id, id)
2734
assert.Check(t, node.ID == id)
2835
return &node

0 commit comments

Comments
 (0)