Browse code

integration-cli: add test for restarting entire swarm cluster

Signed-off-by: Alexander Morozov <lk4d4@docker.com>

Alexander Morozov authored on 2016/07/09 06:54:18
Showing 1 changed files
... ...
@@ -4,8 +4,11 @@ package main
4 4
 
5 5
 import (
6 6
 	"net/http"
7
+	"os"
8
+	"path/filepath"
7 9
 	"strconv"
8 10
 	"strings"
11
+	"sync"
9 12
 	"syscall"
10 13
 	"time"
11 14
 
... ...
@@ -774,3 +777,108 @@ func setGlobalMode(s *swarm.Service) {
774 774
 		Global: &swarm.GlobalService{},
775 775
 	}
776 776
 }
777
+
778
+func checkClusterHealth(c *check.C, cl []*SwarmDaemon, managerCount, workerCount int) {
779
+	var totalMCount, totalWCount int
780
+	for _, d := range cl {
781
+		info, err := d.info()
782
+		c.Assert(err, check.IsNil)
783
+		if !info.ControlAvailable {
784
+			totalWCount++
785
+			continue
786
+		}
787
+		var leaderFound bool
788
+		totalMCount++
789
+		var mCount, wCount int
790
+		for _, n := range d.listNodes(c) {
791
+			c.Assert(n.Status.State, checker.Equals, swarm.NodeStateReady, check.Commentf("state of node %s, reported by %s", n.ID, d.Info.NodeID))
792
+			c.Assert(n.Spec.Availability, checker.Equals, swarm.NodeAvailabilityActive, check.Commentf("availability of node %s, reported by %s", n.ID, d.Info.NodeID))
793
+			c.Assert(n.Spec.Membership, checker.Equals, swarm.NodeMembershipAccepted, check.Commentf("membership of node %s, reported by %s", n.ID, d.Info.NodeID))
794
+			if n.Spec.Role == swarm.NodeRoleManager {
795
+				c.Assert(n.ManagerStatus, checker.NotNil, check.Commentf("manager status of node %s (manager), reported by %s", n.ID, d.Info.NodeID))
796
+				if n.ManagerStatus.Leader {
797
+					leaderFound = true
798
+				}
799
+				mCount++
800
+			} else {
801
+				c.Assert(n.ManagerStatus, checker.IsNil, check.Commentf("manager status of node %s (worker), reported by %s", n.ID, d.Info.NodeID))
802
+				wCount++
803
+			}
804
+		}
805
+		c.Assert(leaderFound, checker.True, check.Commentf("lack of leader reported by node %s", info.NodeID))
806
+		c.Assert(mCount, checker.Equals, managerCount, check.Commentf("managers count reported by node %s", info.NodeID))
807
+		c.Assert(wCount, checker.Equals, workerCount, check.Commentf("workers count reported by node %s", info.NodeID))
808
+	}
809
+	c.Assert(totalMCount, checker.Equals, managerCount)
810
+	c.Assert(totalWCount, checker.Equals, workerCount)
811
+}
812
+
813
+func (s *DockerSwarmSuite) TestApiSwarmRestartCluster(c *check.C) {
814
+	mCount, wCount := 5, 1
815
+
816
+	var nodes []*SwarmDaemon
817
+	for i := 0; i < mCount; i++ {
818
+		manager := s.AddDaemon(c, true, true)
819
+		info, err := manager.info()
820
+		c.Assert(err, checker.IsNil)
821
+		c.Assert(info.ControlAvailable, checker.True)
822
+		c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive)
823
+		nodes = append(nodes, manager)
824
+	}
825
+
826
+	for i := 0; i < wCount; i++ {
827
+		worker := s.AddDaemon(c, true, false)
828
+		info, err := worker.info()
829
+		c.Assert(err, checker.IsNil)
830
+		c.Assert(info.ControlAvailable, checker.False)
831
+		c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive)
832
+		nodes = append(nodes, worker)
833
+	}
834
+
835
+	// stop whole cluster
836
+	{
837
+		var wg sync.WaitGroup
838
+		wg.Add(len(nodes))
839
+		errs := make(chan error, len(nodes))
840
+
841
+		for _, d := range nodes {
842
+			go func(daemon *SwarmDaemon) {
843
+				defer wg.Done()
844
+				if err := daemon.Stop(); err != nil {
845
+					errs <- err
846
+				}
847
+				if root := os.Getenv("DOCKER_REMAP_ROOT"); root != "" {
848
+					daemon.root = filepath.Dir(daemon.root)
849
+				}
850
+			}(d)
851
+		}
852
+		wg.Wait()
853
+		close(errs)
854
+		for err := range errs {
855
+			c.Assert(err, check.IsNil)
856
+		}
857
+	}
858
+
859
+	// start whole cluster
860
+	{
861
+		var wg sync.WaitGroup
862
+		wg.Add(len(nodes))
863
+		errs := make(chan error, len(nodes))
864
+
865
+		for _, d := range nodes {
866
+			go func(daemon *SwarmDaemon) {
867
+				defer wg.Done()
868
+				if err := daemon.Start("--iptables=false"); err != nil {
869
+					errs <- err
870
+				}
871
+			}(d)
872
+		}
873
+		wg.Wait()
874
+		close(errs)
875
+		for err := range errs {
876
+			c.Assert(err, check.IsNil)
877
+		}
878
+	}
879
+
880
+	checkClusterHealth(c, nodes, mCount, wCount)
881
+}