Signed-off-by: Drew Erny <drew.erny@docker.com>
(cherry picked from commit 3489e76513b76e6429075dbbcb6acb3341e42293)
Signed-off-by: Tibor Vass <tibor@docker.com>
| ... | ... |
@@ -492,6 +492,57 @@ func (s *DockerSwarmSuite) TestApiSwarmServicesStateReporting(c *check.C) {
|
| 492 | 492 |
} |
| 493 | 493 |
} |
| 494 | 494 |
|
| 495 |
+func (s *DockerSwarmSuite) TestApiSwarmLeaderElection(c *check.C) {
|
|
| 496 |
+ // Create 3 nodes |
|
| 497 |
+ d1 := s.AddDaemon(c, true, true) |
|
| 498 |
+ d2 := s.AddDaemon(c, true, true) |
|
| 499 |
+ d3 := s.AddDaemon(c, true, true) |
|
| 500 |
+ |
|
| 501 |
+ // assert that the first node we made is the leader, and the other two are followers |
|
| 502 |
+ c.Assert(d1.getNode(c, d1.NodeID).ManagerStatus.Leader, checker.True) |
|
| 503 |
+ c.Assert(d1.getNode(c, d2.NodeID).ManagerStatus.Leader, checker.False) |
|
| 504 |
+ c.Assert(d1.getNode(c, d3.NodeID).ManagerStatus.Leader, checker.False) |
|
| 505 |
+ |
|
| 506 |
+ leader := d1 |
|
| 507 |
+ |
|
| 508 |
+ // stop the leader |
|
| 509 |
+ leader.Stop() |
|
| 510 |
+ |
|
| 511 |
+ // wait for an election to occur |
|
| 512 |
+ var newleader *SwarmDaemon |
|
| 513 |
+ |
|
| 514 |
+ for _, d := range []*SwarmDaemon{d2, d3} {
|
|
| 515 |
+ if d.getNode(c, d.NodeID).ManagerStatus.Leader {
|
|
| 516 |
+ newleader = d |
|
| 517 |
+ break |
|
| 518 |
+ } |
|
| 519 |
+ } |
|
| 520 |
+ |
|
| 521 |
+ // assert that we have a new leader |
|
| 522 |
+ c.Assert(newleader, checker.NotNil) |
|
| 523 |
+ |
|
| 524 |
+ // add the old leader back |
|
| 525 |
+ leader.Start() |
|
| 526 |
+ |
|
| 527 |
+ // clear leader and reinit the followers list |
|
| 528 |
+ followers := make([]*SwarmDaemon, 0, 3) |
|
| 529 |
+ |
|
| 530 |
+ // pick out the leader and the followers again |
|
| 531 |
+ for _, d := range []*SwarmDaemon{d1, d2, d3} {
|
|
| 532 |
+ if d1.getNode(c, d.NodeID).ManagerStatus.Leader {
|
|
| 533 |
+ leader = d |
|
| 534 |
+ } else {
|
|
| 535 |
+ followers = append(followers, d) |
|
| 536 |
+ } |
|
| 537 |
+ } |
|
| 538 |
+ |
|
| 539 |
+ // verify that we still only have 1 leader and 2 followers |
|
| 540 |
+ c.Assert(leader, checker.NotNil) |
|
| 541 |
+ c.Assert(followers, checker.HasLen, 2) |
|
| 542 |
+ // and that after we added d1 back, the leader hasn't changed |
|
| 543 |
+ c.Assert(leader.NodeID, checker.Equals, newleader.NodeID) |
|
| 544 |
+} |
|
| 545 |
+ |
|
| 495 | 546 |
func (s *DockerSwarmSuite) TestApiSwarmRaftQuorum(c *check.C) {
|
| 496 | 547 |
testRequires(c, Network) |
| 497 | 548 |
d1 := s.AddDaemon(c, true, true) |