Browse code

Added leader election test

Signed-off-by: Drew Erny <drew.erny@docker.com>
(cherry picked from commit 3489e76513b76e6429075dbbcb6acb3341e42293)
Signed-off-by: Tibor Vass <tibor@docker.com>

Drew Erny authored on 2016/07/19 08:31:43
Showing 1 changed files
... ...
@@ -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)