mirror of https://github.com/docker/docs.git
				
				
				
			integration-cli: add test for restarting entire swarm cluster
Signed-off-by: Alexander Morozov <lk4d4@docker.com> (cherry picked from commit ae4137ae3cc6ee479f5e7f86f9859b485473285a) Signed-off-by: Tibor Vass <tibor@docker.com>
This commit is contained in:
		
							parent
							
								
									85bb54b988
								
							
						
					
					
						commit
						eaa8821a23
					
				| 
						 | 
				
			
			@ -5,8 +5,11 @@ package main
 | 
			
		|||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -767,3 +770,108 @@ func setGlobalMode(s *swarm.Service) {
 | 
			
		|||
		Global: &swarm.GlobalService{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkClusterHealth(c *check.C, cl []*SwarmDaemon, managerCount, workerCount int) {
 | 
			
		||||
	var totalMCount, totalWCount int
 | 
			
		||||
	for _, d := range cl {
 | 
			
		||||
		info, err := d.info()
 | 
			
		||||
		c.Assert(err, check.IsNil)
 | 
			
		||||
		if !info.ControlAvailable {
 | 
			
		||||
			totalWCount++
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		var leaderFound bool
 | 
			
		||||
		totalMCount++
 | 
			
		||||
		var mCount, wCount int
 | 
			
		||||
		for _, n := range d.listNodes(c) {
 | 
			
		||||
			c.Assert(n.Status.State, checker.Equals, swarm.NodeStateReady, check.Commentf("state of node %s, reported by %s", n.ID, d.Info.NodeID))
 | 
			
		||||
			c.Assert(n.Spec.Availability, checker.Equals, swarm.NodeAvailabilityActive, check.Commentf("availability of node %s, reported by %s", n.ID, d.Info.NodeID))
 | 
			
		||||
			c.Assert(n.Spec.Membership, checker.Equals, swarm.NodeMembershipAccepted, check.Commentf("membership of node %s, reported by %s", n.ID, d.Info.NodeID))
 | 
			
		||||
			if n.Spec.Role == swarm.NodeRoleManager {
 | 
			
		||||
				c.Assert(n.ManagerStatus, checker.NotNil, check.Commentf("manager status of node %s (manager), reported by %s", n.ID, d.Info.NodeID))
 | 
			
		||||
				if n.ManagerStatus.Leader {
 | 
			
		||||
					leaderFound = true
 | 
			
		||||
				}
 | 
			
		||||
				mCount++
 | 
			
		||||
			} else {
 | 
			
		||||
				c.Assert(n.ManagerStatus, checker.IsNil, check.Commentf("manager status of node %s (worker), reported by %s", n.ID, d.Info.NodeID))
 | 
			
		||||
				wCount++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		c.Assert(leaderFound, checker.True, check.Commentf("lack of leader reported by node %s", info.NodeID))
 | 
			
		||||
		c.Assert(mCount, checker.Equals, managerCount, check.Commentf("managers count reported by node %s", info.NodeID))
 | 
			
		||||
		c.Assert(wCount, checker.Equals, workerCount, check.Commentf("workers count reported by node %s", info.NodeID))
 | 
			
		||||
	}
 | 
			
		||||
	c.Assert(totalMCount, checker.Equals, managerCount)
 | 
			
		||||
	c.Assert(totalWCount, checker.Equals, workerCount)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *DockerSwarmSuite) TestApiSwarmRestartCluster(c *check.C) {
 | 
			
		||||
	mCount, wCount := 5, 1
 | 
			
		||||
 | 
			
		||||
	var nodes []*SwarmDaemon
 | 
			
		||||
	for i := 0; i < mCount; i++ {
 | 
			
		||||
		manager := s.AddDaemon(c, true, true)
 | 
			
		||||
		info, err := manager.info()
 | 
			
		||||
		c.Assert(err, checker.IsNil)
 | 
			
		||||
		c.Assert(info.ControlAvailable, checker.True)
 | 
			
		||||
		c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive)
 | 
			
		||||
		nodes = append(nodes, manager)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < wCount; i++ {
 | 
			
		||||
		worker := s.AddDaemon(c, true, false)
 | 
			
		||||
		info, err := worker.info()
 | 
			
		||||
		c.Assert(err, checker.IsNil)
 | 
			
		||||
		c.Assert(info.ControlAvailable, checker.False)
 | 
			
		||||
		c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive)
 | 
			
		||||
		nodes = append(nodes, worker)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// stop whole cluster
 | 
			
		||||
	{
 | 
			
		||||
		var wg sync.WaitGroup
 | 
			
		||||
		wg.Add(len(nodes))
 | 
			
		||||
		errs := make(chan error, len(nodes))
 | 
			
		||||
 | 
			
		||||
		for _, d := range nodes {
 | 
			
		||||
			go func(daemon *SwarmDaemon) {
 | 
			
		||||
				defer wg.Done()
 | 
			
		||||
				if err := daemon.Stop(); err != nil {
 | 
			
		||||
					errs <- err
 | 
			
		||||
				}
 | 
			
		||||
				if root := os.Getenv("DOCKER_REMAP_ROOT"); root != "" {
 | 
			
		||||
					daemon.root = filepath.Dir(daemon.root)
 | 
			
		||||
				}
 | 
			
		||||
			}(d)
 | 
			
		||||
		}
 | 
			
		||||
		wg.Wait()
 | 
			
		||||
		close(errs)
 | 
			
		||||
		for err := range errs {
 | 
			
		||||
			c.Assert(err, check.IsNil)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// start whole cluster
 | 
			
		||||
	{
 | 
			
		||||
		var wg sync.WaitGroup
 | 
			
		||||
		wg.Add(len(nodes))
 | 
			
		||||
		errs := make(chan error, len(nodes))
 | 
			
		||||
 | 
			
		||||
		for _, d := range nodes {
 | 
			
		||||
			go func(daemon *SwarmDaemon) {
 | 
			
		||||
				defer wg.Done()
 | 
			
		||||
				if err := daemon.Start("--iptables=false"); err != nil {
 | 
			
		||||
					errs <- err
 | 
			
		||||
				}
 | 
			
		||||
			}(d)
 | 
			
		||||
		}
 | 
			
		||||
		wg.Wait()
 | 
			
		||||
		close(errs)
 | 
			
		||||
		for err := range errs {
 | 
			
		||||
			c.Assert(err, check.IsNil)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	checkClusterHealth(c, nodes, mCount, wCount)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue