docker_api_swarm_node_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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.Daemon{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 := d2.SwarmInfo(c)
  44. // forceful removal of d2 should work
  45. d1.RemoveNode(c, d2Info.NodeID, true)
  46. nodes = d1.ListNodes(c)
  47. c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes))
  48. // Restart the node that was removed
  49. d2.RestartNode(c)
  50. // Give some time for the node to rejoin
  51. time.Sleep(1 * time.Second)
  52. // Make sure the node didn't rejoin
  53. nodes = d1.ListNodes(c)
  54. c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes))
  55. }
  56. func (s *DockerSwarmSuite) TestAPISwarmNodeDrainPause(c *check.C) {
  57. d1 := s.AddDaemon(c, true, true)
  58. d2 := s.AddDaemon(c, true, false)
  59. time.Sleep(1 * time.Second) // make sure all daemons are ready to accept tasks
  60. // start a service, expect balanced distribution
  61. instances := 8
  62. id := d1.CreateService(c, simpleTestService, setInstances(instances))
  63. waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0)
  64. waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0)
  65. waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
  66. // drain d2, all containers should move to d1
  67. d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) {
  68. n.Spec.Availability = swarm.NodeAvailabilityDrain
  69. })
  70. waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances)
  71. waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, 0)
  72. // set d2 back to active
  73. d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) {
  74. n.Spec.Availability = swarm.NodeAvailabilityActive
  75. })
  76. instances = 1
  77. d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
  78. waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
  79. instances = 8
  80. d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
  81. // drained node first so we don't get any old containers
  82. waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.GreaterThan, 0)
  83. waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.GreaterThan, 0)
  84. waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.CheckActiveContainerCount, d2.CheckActiveContainerCount), checker.Equals, instances)
  85. d2ContainerCount := len(d2.ActiveContainers(c))
  86. // set d2 to paused, scale service up, only d1 gets new tasks
  87. d1.UpdateNode(c, d2.NodeID(), func(n *swarm.Node) {
  88. n.Spec.Availability = swarm.NodeAvailabilityPause
  89. })
  90. instances = 14
  91. d1.UpdateService(c, d1.GetService(c, id), setInstances(instances))
  92. waitAndAssert(c, defaultReconciliationTimeout, d1.CheckActiveContainerCount, checker.Equals, instances-d2ContainerCount)
  93. waitAndAssert(c, defaultReconciliationTimeout, d2.CheckActiveContainerCount, checker.Equals, d2ContainerCount)
  94. }