docker_cli_swarm_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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")
  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. // setting anything under 30m for cert-expiry is not allowed
  28. out, err = d.Cmd("swarm", "update", "--cert-expiry", "15m")
  29. c.Assert(err, checker.NotNil)
  30. c.Assert(out, checker.Contains, "minimum certificate expiry time")
  31. spec = getSpec()
  32. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour)
  33. }
  34. func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) {
  35. d := s.AddDaemon(c, false, false)
  36. getSpec := func() swarm.Spec {
  37. out, err := d.Cmd("swarm", "inspect")
  38. c.Assert(err, checker.IsNil)
  39. var sw []swarm.Swarm
  40. c.Assert(json.Unmarshal([]byte(out), &sw), checker.IsNil)
  41. c.Assert(len(sw), checker.Equals, 1)
  42. return sw[0].Spec
  43. }
  44. out, err := d.Cmd("swarm", "init", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s")
  45. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  46. spec := getSpec()
  47. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour)
  48. c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, uint64(11*time.Second))
  49. c.Assert(d.Leave(true), checker.IsNil)
  50. out, err = d.Cmd("swarm", "init")
  51. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  52. spec = getSpec()
  53. c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 90*24*time.Hour)
  54. c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, uint64(5*time.Second))
  55. }
  56. func (s *DockerSwarmSuite) TestSwarmInitIPv6(c *check.C) {
  57. testRequires(c, IPv6)
  58. d1 := s.AddDaemon(c, false, false)
  59. out, err := d1.Cmd("swarm", "init", "--listen-addr", "::1")
  60. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  61. d2 := s.AddDaemon(c, false, false)
  62. out, err = d2.Cmd("swarm", "join", "::1")
  63. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  64. out, err = d2.Cmd("info")
  65. c.Assert(err, checker.IsNil, check.Commentf("out: %v", out))
  66. c.Assert(out, checker.Contains, "Swarm: active")
  67. }
  68. func (s *DockerSwarmSuite) TestSwarmIncompatibleDaemon(c *check.C) {
  69. // init swarm mode and stop a daemon
  70. d := s.AddDaemon(c, true, true)
  71. info, err := d.info()
  72. c.Assert(err, checker.IsNil)
  73. c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive)
  74. c.Assert(d.Stop(), checker.IsNil)
  75. // start a daemon with --cluster-store and --cluster-advertise
  76. err = d.Start("--cluster-store=consul://consuladdr:consulport/some/path", "--cluster-advertise=1.1.1.1:2375")
  77. c.Assert(err, checker.NotNil)
  78. content, _ := ioutil.ReadFile(d.logFile.Name())
  79. c.Assert(string(content), checker.Contains, "--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode")
  80. // start a daemon with --live-restore
  81. err = d.Start("--live-restore")
  82. c.Assert(err, checker.NotNil)
  83. content, _ = ioutil.ReadFile(d.logFile.Name())
  84. c.Assert(string(content), checker.Contains, "--live-restore daemon configuration is incompatible with swarm mode")
  85. // restart for teardown
  86. c.Assert(d.Start(), checker.IsNil)
  87. }
  88. // Test case for #24090
  89. func (s *DockerSwarmSuite) TestSwarmNodeListHostname(c *check.C) {
  90. d := s.AddDaemon(c, true, true)
  91. // The first line should contain "HOSTNAME"
  92. out, err := d.Cmd("node", "ls")
  93. c.Assert(err, checker.IsNil)
  94. c.Assert(strings.Split(out, "\n")[0], checker.Contains, "HOSTNAME")
  95. }
  96. // Test case for #24270
  97. func (s *DockerSwarmSuite) TestSwarmServiceListFilter(c *check.C) {
  98. d := s.AddDaemon(c, true, true)
  99. name1 := "redis-cluster-md5"
  100. name2 := "redis-cluster"
  101. name3 := "other-cluster"
  102. out, err := d.Cmd("service", "create", "--name", name1, "busybox", "top")
  103. c.Assert(err, checker.IsNil)
  104. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  105. out, err = d.Cmd("service", "create", "--name", name2, "busybox", "top")
  106. c.Assert(err, checker.IsNil)
  107. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  108. out, err = d.Cmd("service", "create", "--name", name3, "busybox", "top")
  109. c.Assert(err, checker.IsNil)
  110. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  111. filter1 := "name=redis-cluster-md5"
  112. filter2 := "name=redis-cluster"
  113. // We search checker.Contains with `name+" "` to prevent prefix only.
  114. out, err = d.Cmd("service", "ls", "--filter", filter1)
  115. c.Assert(err, checker.IsNil)
  116. c.Assert(out, checker.Contains, name1+" ")
  117. c.Assert(out, checker.Not(checker.Contains), name2+" ")
  118. c.Assert(out, checker.Not(checker.Contains), name3+" ")
  119. out, err = d.Cmd("service", "ls", "--filter", filter2)
  120. c.Assert(err, checker.IsNil)
  121. c.Assert(out, checker.Contains, name1+" ")
  122. c.Assert(out, checker.Contains, name2+" ")
  123. c.Assert(out, checker.Not(checker.Contains), name3+" ")
  124. out, err = d.Cmd("service", "ls")
  125. c.Assert(err, checker.IsNil)
  126. c.Assert(out, checker.Contains, name1+" ")
  127. c.Assert(out, checker.Contains, name2+" ")
  128. c.Assert(out, checker.Contains, name3+" ")
  129. }
  130. func (s *DockerSwarmSuite) TestSwarmNodeListFilter(c *check.C) {
  131. d := s.AddDaemon(c, true, true)
  132. out, err := d.Cmd("node", "inspect", "--format", "{{ .Description.Hostname }}", "self")
  133. c.Assert(err, checker.IsNil)
  134. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  135. name := strings.TrimSpace(out)
  136. filter := "name=" + name[:4]
  137. out, err = d.Cmd("node", "ls", "--filter", filter)
  138. c.Assert(err, checker.IsNil)
  139. c.Assert(out, checker.Contains, name)
  140. out, err = d.Cmd("node", "ls", "--filter", "name=none")
  141. c.Assert(err, checker.IsNil)
  142. c.Assert(out, checker.Not(checker.Contains), name)
  143. }
  144. func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) {
  145. d := s.AddDaemon(c, true, true)
  146. name := "redis-cluster-md5"
  147. out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top")
  148. c.Assert(err, checker.IsNil)
  149. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  150. filter := "name=redis-cluster"
  151. out, err = d.Cmd("node", "tasks", "--filter", filter, "self")
  152. c.Assert(err, checker.IsNil)
  153. c.Assert(out, checker.Contains, name+".1")
  154. c.Assert(out, checker.Contains, name+".2")
  155. c.Assert(out, checker.Contains, name+".3")
  156. out, err = d.Cmd("node", "tasks", "--filter", "name=none", "self")
  157. c.Assert(err, checker.IsNil)
  158. c.Assert(out, checker.Not(checker.Contains), name+".1")
  159. c.Assert(out, checker.Not(checker.Contains), name+".2")
  160. c.Assert(out, checker.Not(checker.Contains), name+".3")
  161. }