docker_cli_swarm_test.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. // +build !windows
  2. package main
  3. import (
  4. "encoding/json"
  5. "io/ioutil"
  6. "strings"
  7. "time"
  8. "github.com/docker/docker/pkg/integration/checker"
  9. "github.com/docker/engine-api/types/swarm"
  10. "github.com/go-check/check"
  11. )
  12. func (s *DockerSwarmSuite) TestSwarmUpdate(c *check.C) {
  13. d := s.AddDaemon(c, true, true)
  14. getSpec := func() swarm.Spec {
  15. out, err := d.Cmd("swarm", "inspect")
  16. c.Assert(err, checker.IsNil)
  17. var sw []swarm.Swarm
  18. c.Assert(json.Unmarshal([]byte(out), &sw), checker.IsNil)
  19. c.Assert(len(sw), checker.Equals, 1)
  20. return sw[0].Spec
  21. }
  22. out, err := d.Cmd("swarm", "update", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s", "--auto-accept", "manager", "--auto-accept", "worker", "--secret", "foo")
  23. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  24. spec := getSpec()
  25. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour)
  26. c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, uint64(11*time.Second))
  27. c.Assert(spec.AcceptancePolicy.Policies, checker.HasLen, 2)
  28. for _, p := range spec.AcceptancePolicy.Policies {
  29. c.Assert(p.Autoaccept, checker.Equals, true)
  30. c.Assert(p.Secret, checker.NotNil)
  31. c.Assert(*p.Secret, checker.Not(checker.Equals), "")
  32. }
  33. out, err = d.Cmd("swarm", "update", "--auto-accept", "none")
  34. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  35. spec = getSpec()
  36. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour)
  37. c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, uint64(11*time.Second))
  38. c.Assert(spec.AcceptancePolicy.Policies, checker.HasLen, 2)
  39. for _, p := range spec.AcceptancePolicy.Policies {
  40. c.Assert(p.Autoaccept, checker.Equals, false)
  41. // secret is still set
  42. c.Assert(p.Secret, checker.NotNil)
  43. c.Assert(*p.Secret, checker.Not(checker.Equals), "")
  44. }
  45. out, err = d.Cmd("swarm", "update", "--auto-accept", "manager", "--secret", "")
  46. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  47. spec = getSpec()
  48. c.Assert(spec.AcceptancePolicy.Policies, checker.HasLen, 2)
  49. for _, p := range spec.AcceptancePolicy.Policies {
  50. c.Assert(p.Autoaccept, checker.Equals, p.Role == swarm.NodeRoleManager)
  51. // secret has been removed
  52. c.Assert(p.Secret, checker.IsNil)
  53. }
  54. // setting anything under 30m for cert-expiry is not allowed
  55. out, err = d.Cmd("swarm", "update", "--cert-expiry", "15m")
  56. c.Assert(err, checker.NotNil)
  57. c.Assert(out, checker.Contains, "minimum certificate expiry time")
  58. spec = getSpec()
  59. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour)
  60. }
  61. func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) {
  62. d := s.AddDaemon(c, false, false)
  63. getSpec := func() swarm.Spec {
  64. out, err := d.Cmd("swarm", "inspect")
  65. c.Assert(err, checker.IsNil)
  66. var sw []swarm.Swarm
  67. c.Assert(json.Unmarshal([]byte(out), &sw), checker.IsNil)
  68. c.Assert(len(sw), checker.Equals, 1)
  69. return sw[0].Spec
  70. }
  71. out, err := d.Cmd("swarm", "init", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s", "--auto-accept", "manager", "--auto-accept", "worker", "--secret", "foo")
  72. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  73. spec := getSpec()
  74. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour)
  75. c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, uint64(11*time.Second))
  76. c.Assert(spec.AcceptancePolicy.Policies, checker.HasLen, 2)
  77. for _, p := range spec.AcceptancePolicy.Policies {
  78. c.Assert(p.Autoaccept, checker.Equals, true)
  79. c.Assert(p.Secret, checker.NotNil)
  80. c.Assert(*p.Secret, checker.Not(checker.Equals), "")
  81. }
  82. c.Assert(d.Leave(true), checker.IsNil)
  83. out, err = d.Cmd("swarm", "init", "--auto-accept", "none", "--secret", "")
  84. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  85. spec = getSpec()
  86. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 90*24*time.Hour)
  87. c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, uint64(5*time.Second))
  88. c.Assert(spec.AcceptancePolicy.Policies, checker.HasLen, 2)
  89. for _, p := range spec.AcceptancePolicy.Policies {
  90. c.Assert(p.Autoaccept, checker.Equals, false)
  91. c.Assert(p.Secret, checker.IsNil)
  92. }
  93. }
  94. func (s *DockerSwarmSuite) TestSwarmInitIPv6(c *check.C) {
  95. testRequires(c, IPv6)
  96. d1 := s.AddDaemon(c, false, false)
  97. out, err := d1.Cmd("swarm", "init", "--listen-addr", "::1")
  98. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  99. d2 := s.AddDaemon(c, false, false)
  100. out, err = d2.Cmd("swarm", "join", "::1")
  101. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  102. out, err = d2.Cmd("info")
  103. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  104. c.Assert(out, checker.Contains, "Swarm: active")
  105. }
  106. func (s *DockerSwarmSuite) TestSwarmIncompatibleDaemon(c *check.C) {
  107. // init swarm mode and stop a daemon
  108. d := s.AddDaemon(c, true, true)
  109. info, err := d.info()
  110. c.Assert(err, checker.IsNil)
  111. c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive)
  112. c.Assert(d.Stop(), checker.IsNil)
  113. // start a daemon with --cluster-store and --cluster-advertise
  114. err = d.Start("--cluster-store=consul://consuladdr:consulport/some/path", "--cluster-advertise=1.1.1.1:2375")
  115. c.Assert(err, checker.NotNil)
  116. content, _ := ioutil.ReadFile(d.logFile.Name())
  117. c.Assert(string(content), checker.Contains, "--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode")
  118. // start a daemon with --live-restore
  119. err = d.Start("--live-restore")
  120. c.Assert(err, checker.NotNil)
  121. content, _ = ioutil.ReadFile(d.logFile.Name())
  122. c.Assert(string(content), checker.Contains, "--live-restore daemon configuration is incompatible with swarm mode")
  123. // restart for teardown
  124. c.Assert(d.Start(), checker.IsNil)
  125. }
  126. // Test case for #24090
  127. func (s *DockerSwarmSuite) TestSwarmNodeListHostname(c *check.C) {
  128. d := s.AddDaemon(c, true, true)
  129. // The first line should contain "HOSTNAME"
  130. out, err := d.Cmd("node", "ls")
  131. c.Assert(err, checker.IsNil)
  132. c.Assert(strings.Split(out, "\n")[0], checker.Contains, "HOSTNAME")
  133. }
  134. // Test case for #24270
  135. func (s *DockerSwarmSuite) TestSwarmServiceListFilter(c *check.C) {
  136. d := s.AddDaemon(c, true, true)
  137. name1 := "redis-cluster-md5"
  138. name2 := "redis-cluster"
  139. name3 := "other-cluster"
  140. out, err := d.Cmd("service", "create", "--name", name1, "busybox", "top")
  141. c.Assert(err, checker.IsNil)
  142. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  143. out, err = d.Cmd("service", "create", "--name", name2, "busybox", "top")
  144. c.Assert(err, checker.IsNil)
  145. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  146. out, err = d.Cmd("service", "create", "--name", name3, "busybox", "top")
  147. c.Assert(err, checker.IsNil)
  148. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  149. filter1 := "name=redis-cluster-md5"
  150. filter2 := "name=redis-cluster"
  151. // We search checker.Contains with `name+" "` to prevent prefix only.
  152. out, err = d.Cmd("service", "ls", "--filter", filter1)
  153. c.Assert(err, checker.IsNil)
  154. c.Assert(out, checker.Contains, name1+" ")
  155. c.Assert(out, checker.Not(checker.Contains), name2+" ")
  156. c.Assert(out, checker.Not(checker.Contains), name3+" ")
  157. out, err = d.Cmd("service", "ls", "--filter", filter2)
  158. c.Assert(err, checker.IsNil)
  159. c.Assert(out, checker.Contains, name1+" ")
  160. c.Assert(out, checker.Contains, name2+" ")
  161. c.Assert(out, checker.Not(checker.Contains), name3+" ")
  162. out, err = d.Cmd("service", "ls")
  163. c.Assert(err, checker.IsNil)
  164. c.Assert(out, checker.Contains, name1+" ")
  165. c.Assert(out, checker.Contains, name2+" ")
  166. c.Assert(out, checker.Contains, name3+" ")
  167. }
  168. func (s *DockerSwarmSuite) TestSwarmNodeListFilter(c *check.C) {
  169. d := s.AddDaemon(c, true, true)
  170. out, err := d.Cmd("node", "inspect", "--format", "{{ .Description.Hostname }}", "self")
  171. c.Assert(err, checker.IsNil)
  172. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  173. name := strings.TrimSpace(out)
  174. filter := "name=" + name[:4]
  175. out, err = d.Cmd("node", "ls", "--filter", filter)
  176. c.Assert(err, checker.IsNil)
  177. c.Assert(out, checker.Contains, name)
  178. out, err = d.Cmd("node", "ls", "--filter", "name=none")
  179. c.Assert(err, checker.IsNil)
  180. c.Assert(out, checker.Not(checker.Contains), name)
  181. }
  182. func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) {
  183. d := s.AddDaemon(c, true, true)
  184. name := "redis-cluster-md5"
  185. out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top")
  186. c.Assert(err, checker.IsNil)
  187. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  188. filter := "name=redis-cluster"
  189. out, err = d.Cmd("node", "tasks", "--filter", filter, "self")
  190. c.Assert(err, checker.IsNil)
  191. c.Assert(out, checker.Contains, name+".1")
  192. c.Assert(out, checker.Contains, name+".2")
  193. c.Assert(out, checker.Contains, name+".3")
  194. out, err = d.Cmd("node", "tasks", "--filter", "name=none", "self")
  195. c.Assert(err, checker.IsNil)
  196. c.Assert(out, checker.Not(checker.Contains), name+".1")
  197. c.Assert(out, checker.Not(checker.Contains), name+".2")
  198. c.Assert(out, checker.Not(checker.Contains), name+".3")
  199. }