docker_api_swarm_node_test.go 4.3 KB

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