github.com/jwhonce/docker@v0.6.7-0.20190327063223-da823cf3a5a3/integration-cli/docker_api_swarm_node_test.go (about)

     1  // +build !windows
     2  
     3  package main
     4  
     5  import (
     6  	"time"
     7  
     8  	"github.com/docker/docker/api/types/swarm"
     9  	"github.com/docker/docker/integration-cli/checker"
    10  	"github.com/docker/docker/integration-cli/daemon"
    11  	"github.com/go-check/check"
    12  )
    13  
    14  func (s *DockerSwarmSuite) TestAPISwarmListNodes(c *check.C) {
    15  	d1 := s.AddDaemon(c, true, true)
    16  	d2 := s.AddDaemon(c, true, false)
    17  	d3 := s.AddDaemon(c, true, false)
    18  
    19  	nodes := d1.ListNodes(c)
    20  	c.Assert(len(nodes), checker.Equals, 3, check.Commentf("nodes: %#v", nodes))
    21  
    22  loop0:
    23  	for _, n := range nodes {
    24  		for _, d := range []*daemon.Daemon{d1, d2, d3} {
    25  			if n.ID == d.NodeID() {
    26  				continue loop0
    27  			}
    28  		}
    29  		c.Errorf("unknown nodeID %v", n.ID)
    30  	}
    31  }
    32  
    33  func (s *DockerSwarmSuite) TestAPISwarmNodeUpdate(c *check.C) {
    34  	d := s.AddDaemon(c, true, true)
    35  
    36  	nodes := d.ListNodes(c)
    37  
    38  	d.UpdateNode(c, nodes[0].ID, func(n *swarm.Node) {
    39  		n.Spec.Availability = swarm.NodeAvailabilityPause
    40  	})
    41  
    42  	n := d.GetNode(c, nodes[0].ID)
    43  	c.Assert(n.Spec.Availability, checker.Equals, swarm.NodeAvailabilityPause)
    44  }
    45  
    46  func (s *DockerSwarmSuite) TestAPISwarmNodeRemove(c *check.C) {
    47  	testRequires(c, Network)
    48  	d1 := s.AddDaemon(c, true, true)
    49  	d2 := s.AddDaemon(c, true, false)
    50  	_ = s.AddDaemon(c, true, false)
    51  
    52  	nodes := d1.ListNodes(c)
    53  	c.Assert(len(nodes), checker.Equals, 3, check.Commentf("nodes: %#v", nodes))
    54  
    55  	// Getting the info so we can take the NodeID
    56  	d2Info := d2.SwarmInfo(c)
    57  
    58  	// forceful removal of d2 should work
    59  	d1.RemoveNode(c, d2Info.NodeID, true)
    60  
    61  	nodes = d1.ListNodes(c)
    62  	c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes))
    63  
    64  	// Restart the node that was removed
    65  	d2.RestartNode(c)
    66  
    67  	// Give some time for the node to rejoin
    68  	time.Sleep(1 * time.Second)
    69  
    70  	// Make sure the node didn't rejoin
    71  	nodes = d1.ListNodes(c)
    72  	c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes))
    73  }
    74  
    75  func (s *DockerSwarmSuite) TestAPISwarmNodeDrainPause(c *check.C) {
    76  	d1 := s.AddDaemon(c, true, true)
    77  	d2 := s.AddDaemon(c, true, false)
    78  
    79  	time.Sleep(1 * time.Second) // make sure all daemons are ready to accept tasks
    80  
    81  	// start a service, expect balanced distribution
    82  	instances := 2
    83  	id := d1.CreateService(c, simpleTestService, setInstances(instances))
    84  
    85  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0)
    86  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0)
    87  	waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
    88  
    89  	// drain d2, all containers should move to d1
    90  	d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) {
    91  		n.Spec.Availability = swarm.NodeAvailabilityDrain
    92  	})
    93  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances)
    94  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, 0)
    95  
    96  	// set d2 back to active
    97  	d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) {
    98  		n.Spec.Availability = swarm.NodeAvailabilityActive
    99  	})
   100  
   101  	instances = 1
   102  	d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
   103  	waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
   104  
   105  	instances = 2
   106  	d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
   107  
   108  	// drained node first so we don't get any old containers
   109  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0)
   110  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0)
   111  	waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
   112  
   113  	d2ContainerCount := len(d2.ActiveContainers(c))
   114  
   115  	// set d2 to paused, scale service up, only d1 gets new tasks
   116  	d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) {
   117  		n.Spec.Availability = swarm.NodeAvailabilityPause
   118  	})
   119  
   120  	instances = 4
   121  	d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
   122  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances-d2ContainerCount)
   123  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, d2ContainerCount)
   124  
   125  }