@@ -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." )
0 commit comments