Signed-off-by: Drew Erny <drew.erny@docker.com>
| ... | ... |
@@ -471,6 +471,57 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaderProxy(c *check.C) {
|
| 471 | 471 |
} |
| 472 | 472 |
} |
| 473 | 473 |
|
| 474 |
+func (s *DockerSwarmSuite) TestApiSwarmLeaderElection(c *check.C) {
|
|
| 475 |
+ // Create 3 nodes |
|
| 476 |
+ d1 := s.AddDaemon(c, true, true) |
|
| 477 |
+ d2 := s.AddDaemon(c, true, true) |
|
| 478 |
+ d3 := s.AddDaemon(c, true, true) |
|
| 479 |
+ |
|
| 480 |
+ // assert that the first node we made is the leader, and the other two are followers |
|
| 481 |
+ c.Assert(d1.getNode(c, d1.NodeID).ManagerStatus.Leader, checker.True) |
|
| 482 |
+ c.Assert(d1.getNode(c, d2.NodeID).ManagerStatus.Leader, checker.False) |
|
| 483 |
+ c.Assert(d1.getNode(c, d3.NodeID).ManagerStatus.Leader, checker.False) |
|
| 484 |
+ |
|
| 485 |
+ leader := d1 |
|
| 486 |
+ |
|
| 487 |
+ // stop the leader |
|
| 488 |
+ leader.Stop() |
|
| 489 |
+ |
|
| 490 |
+ // wait for an election to occur |
|
| 491 |
+ var newleader *SwarmDaemon |
|
| 492 |
+ |
|
| 493 |
+ for _, d := range []*SwarmDaemon{d2, d3} {
|
|
| 494 |
+ if d.getNode(c, d.NodeID).ManagerStatus.Leader {
|
|
| 495 |
+ newleader = d |
|
| 496 |
+ break |
|
| 497 |
+ } |
|
| 498 |
+ } |
|
| 499 |
+ |
|
| 500 |
+ // assert that we have a new leader |
|
| 501 |
+ c.Assert(newleader, checker.NotNil) |
|
| 502 |
+ |
|
| 503 |
+ // add the old leader back |
|
| 504 |
+ leader.Start() |
|
| 505 |
+ |
|
| 506 |
+ // clear leader and reinit the followers list |
|
| 507 |
+ followers := make([]*SwarmDaemon, 0, 3) |
|
| 508 |
+ |
|
| 509 |
+ // pick out the leader and the followers again |
|
| 510 |
+ for _, d := range []*SwarmDaemon{d1, d2, d3} {
|
|
| 511 |
+ if d1.getNode(c, d.NodeID).ManagerStatus.Leader {
|
|
| 512 |
+ leader = d |
|
| 513 |
+ } else {
|
|
| 514 |
+ followers = append(followers, d) |
|
| 515 |
+ } |
|
| 516 |
+ } |
|
| 517 |
+ |
|
| 518 |
+ // verify that we still only have 1 leader and 2 followers |
|
| 519 |
+ c.Assert(leader, checker.NotNil) |
|
| 520 |
+ c.Assert(followers, checker.HasLen, 2) |
|
| 521 |
+ // and that after we added d1 back, the leader hasn't changed |
|
| 522 |
+ c.Assert(leader.NodeID, checker.Equals, newleader.NodeID) |
|
| 523 |
+} |
|
| 524 |
+ |
|
| 474 | 525 |
func (s *DockerSwarmSuite) TestApiSwarmRaftQuorum(c *check.C) {
|
| 475 | 526 |
testRequires(c, Network) |
| 476 | 527 |
d1 := s.AddDaemon(c, true, true) |