Browse code

Added leader election test

Signed-off-by: Drew Erny <drew.erny@docker.com>

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