github.com/skanehira/moby@v17.12.1-ce-rc2+incompatible/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.Swarm{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, err := d2.SwarmInfo()
    57  	c.Assert(err, checker.IsNil)
    58  
    59  	// forceful removal of d2 should work
    60  	d1.RemoveNode(c, d2Info.NodeID, true)
    61  
    62  	nodes = d1.ListNodes(c)
    63  	c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes))
    64  
    65  	// Restart the node that was removed
    66  	d2.Restart(c)
    67  
    68  	// Give some time for the node to rejoin
    69  	time.Sleep(1 * time.Second)
    70  
    71  	// Make sure the node didn't rejoin
    72  	nodes = d1.ListNodes(c)
    73  	c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes))
    74  }
    75  
    76  func (s *DockerSwarmSuite) TestAPISwarmNodeDrainPause(c *check.C) {
    77  	d1 := s.AddDaemon(c, true, true)
    78  	d2 := s.AddDaemon(c, true, false)
    79  
    80  	time.Sleep(1 * time.Second) // make sure all daemons are ready to accept tasks
    81  
    82  	// start a service, expect balanced distribution
    83  	instances := 8
    84  	id := d1.CreateService(c, simpleTestService, setInstances(instances))
    85  
    86  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0)
    87  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0)
    88  	waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
    89  
    90  	// drain d2, all containers should move to d1
    91  	d1.UpdateNode(c, d2.NodeID, func(n *swarm.Node) {
    92  		n.Spec.Availability = swarm.NodeAvailabilityDrain
    93  	})
    94  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances)
    95  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, 0)
    96  
    97  	// set d2 back to active
    98  	d1.UpdateNode(c, d2.NodeID, func(n *swarm.Node) {
    99  		n.Spec.Availability = swarm.NodeAvailabilityActive
   100  	})
   101  
   102  	instances = 1
   103  	d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
   104  
   105  	waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
   106  
   107  	instances = 8
   108  	d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
   109  
   110  	// drained node first so we don't get any old containers
   111  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0)
   112  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0)
   113  	waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
   114  
   115  	d2ContainerCount := len(d2.ActiveContainers())
   116  
   117  	// set d2 to paused, scale service up, only d1 gets new tasks
   118  	d1.UpdateNode(c, d2.NodeID, func(n *swarm.Node) {
   119  		n.Spec.Availability = swarm.NodeAvailabilityPause
   120  	})
   121  
   122  	instances = 14
   123  	d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
   124  
   125  	waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances-d2ContainerCount)
   126  	waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, d2ContainerCount)
   127  
   128  }