Skip to content
This repository was archived by the owner on Oct 13, 2023. It is now read-only.

Commit b262d40

Browse files
authored
Merge pull request #345 from thaJeztah/19.03_backport_swarm_flaky
[19.03 backport] integration-cli: fix swarm tests flakiness
2 parents 6ffb8e2 + c93da8d commit b262d40

File tree

3 files changed

+52
-9
lines changed

3 files changed

+52
-9
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.")

integration-cli/docker_cli_swarm_test.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,9 +1303,21 @@ func (s *DockerSwarmSuite) TestSwarmRotateUnlockKey(c *check.C) {
13031303

13041304
c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
13051305

1306-
outs, err = d.Cmd("node", "ls")
1307-
assert.NilError(c, err)
1308-
c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked")
1306+
retry := 0
1307+
for {
1308+
// an issue sometimes prevents leader to be available right away
1309+
outs, err = d.Cmd("node", "ls")
1310+
if err != nil && retry < 5 {
1311+
if strings.Contains(outs, "swarm does not have a leader") {
1312+
retry++
1313+
time.Sleep(3 * time.Second)
1314+
continue
1315+
}
1316+
}
1317+
assert.NilError(c, err)
1318+
c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked")
1319+
break
1320+
}
13091321

13101322
unlockKey = newUnlockKey
13111323
}
@@ -1383,9 +1395,21 @@ func (s *DockerSwarmSuite) TestSwarmClusterRotateUnlockKey(c *check.C) {
13831395

13841396
c.Assert(getNodeStatus(c, d), checker.Equals, swarm.LocalNodeStateActive)
13851397

1386-
outs, err = d.Cmd("node", "ls")
1387-
c.Assert(err, checker.IsNil, check.Commentf("%s", outs))
1388-
c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked")
1398+
retry := 0
1399+
for {
1400+
// an issue sometimes prevents leader to be available right away
1401+
outs, err = d.Cmd("node", "ls")
1402+
if err != nil && retry < 5 {
1403+
if strings.Contains(outs, "swarm does not have a leader") {
1404+
retry++
1405+
time.Sleep(3 * time.Second)
1406+
continue
1407+
}
1408+
}
1409+
c.Assert(err, checker.IsNil, check.Commentf("%s", outs))
1410+
c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked")
1411+
break
1412+
}
13891413
}
13901414

13911415
unlockKey = newUnlockKey

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)