github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/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 := 8 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 104 waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances) 105 106 instances = 8 107 d1.UpdateService(c, d1.GetService(c, id), setInstances(instances)) 108 109 // drained node first so we don't get any old containers 110 waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0) 111 waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0) 112 waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances) 113 114 d2ContainerCount := len(d2.ActiveContainers(c)) 115 116 // set d2 to paused, scale service up, only d1 gets new tasks 117 d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) { 118 n.Spec.Availability = swarm.NodeAvailabilityPause 119 }) 120 121 instances = 14 122 d1.UpdateService(c, d1.GetService(c, id), setInstances(instances)) 123 124 waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances-d2ContainerCount) 125 waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, d2ContainerCount) 126 127 }