docker_cli_swarm_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. }