github.com/docker/Engine@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 }