github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/integration-cli/docker_cli_swarm_test.go (about) 1 // +build !windows 2 3 package main 4 5 import ( 6 "io/ioutil" 7 "strings" 8 "time" 9 10 "github.com/docker/docker/api/types/swarm" 11 "github.com/docker/docker/pkg/integration/checker" 12 "github.com/go-check/check" 13 ) 14 15 func (s *DockerSwarmSuite) TestSwarmUpdate(c *check.C) { 16 d := s.AddDaemon(c, true, true) 17 18 getSpec := func() swarm.Spec { 19 sw := d.getSwarm(c) 20 return sw.Spec 21 } 22 23 out, err := d.Cmd("swarm", "update", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s") 24 c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) 25 26 spec := getSpec() 27 c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour) 28 c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, 11*time.Second) 29 30 // setting anything under 30m for cert-expiry is not allowed 31 out, err = d.Cmd("swarm", "update", "--cert-expiry", "15m") 32 c.Assert(err, checker.NotNil) 33 c.Assert(out, checker.Contains, "minimum certificate expiry time") 34 spec = getSpec() 35 c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour) 36 } 37 38 func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) { 39 d := s.AddDaemon(c, false, false) 40 41 getSpec := func() swarm.Spec { 42 sw := d.getSwarm(c) 43 return sw.Spec 44 } 45 46 out, err := d.Cmd("swarm", "init", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s") 47 c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) 48 49 spec := getSpec() 50 c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour) 51 c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, 11*time.Second) 52 53 c.Assert(d.Leave(true), checker.IsNil) 54 time.Sleep(500 * time.Millisecond) // https://github.com/docker/swarmkit/issues/1421 55 out, err = d.Cmd("swarm", "init") 56 c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) 57 58 spec = getSpec() 59 c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 90*24*time.Hour) 60 c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, 5*time.Second) 61 } 62 63 func (s *DockerSwarmSuite) TestSwarmInitIPv6(c *check.C) { 64 testRequires(c, IPv6) 65 d1 := s.AddDaemon(c, false, false) 66 out, err := d1.Cmd("swarm", "init", "--listen-addr", "::1") 67 c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) 68 69 d2 := s.AddDaemon(c, false, false) 70 out, err = d2.Cmd("swarm", "join", "::1") 71 c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) 72 73 out, err = d2.Cmd("info") 74 c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) 75 c.Assert(out, checker.Contains, "Swarm: active") 76 } 77 78 func (s *DockerSwarmSuite) TestSwarmIncompatibleDaemon(c *check.C) { 79 // init swarm mode and stop a daemon 80 d := s.AddDaemon(c, true, true) 81 info, err := d.info() 82 c.Assert(err, checker.IsNil) 83 c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) 84 c.Assert(d.Stop(), checker.IsNil) 85 86 // start a daemon with --cluster-store and --cluster-advertise 87 err = d.Start("--cluster-store=consul://consuladdr:consulport/some/path", "--cluster-advertise=1.1.1.1:2375") 88 c.Assert(err, checker.NotNil) 89 content, _ := ioutil.ReadFile(d.logFile.Name()) 90 c.Assert(string(content), checker.Contains, "--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode") 91 92 // start a daemon with --live-restore 93 err = d.Start("--live-restore") 94 c.Assert(err, checker.NotNil) 95 content, _ = ioutil.ReadFile(d.logFile.Name()) 96 c.Assert(string(content), checker.Contains, "--live-restore daemon configuration is incompatible with swarm mode") 97 // restart for teardown 98 c.Assert(d.Start(), checker.IsNil) 99 } 100 101 // Test case for #24090 102 func (s *DockerSwarmSuite) TestSwarmNodeListHostname(c *check.C) { 103 d := s.AddDaemon(c, true, true) 104 105 // The first line should contain "HOSTNAME" 106 out, err := d.Cmd("node", "ls") 107 c.Assert(err, checker.IsNil) 108 c.Assert(strings.Split(out, "\n")[0], checker.Contains, "HOSTNAME") 109 } 110 111 // Test case for #24270 112 func (s *DockerSwarmSuite) TestSwarmServiceListFilter(c *check.C) { 113 d := s.AddDaemon(c, true, true) 114 115 name1 := "redis-cluster-md5" 116 name2 := "redis-cluster" 117 name3 := "other-cluster" 118 out, err := d.Cmd("service", "create", "--name", name1, "busybox", "top") 119 c.Assert(err, checker.IsNil) 120 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 121 122 out, err = d.Cmd("service", "create", "--name", name2, "busybox", "top") 123 c.Assert(err, checker.IsNil) 124 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 125 126 out, err = d.Cmd("service", "create", "--name", name3, "busybox", "top") 127 c.Assert(err, checker.IsNil) 128 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 129 130 filter1 := "name=redis-cluster-md5" 131 filter2 := "name=redis-cluster" 132 133 // We search checker.Contains with `name+" "` to prevent prefix only. 134 out, err = d.Cmd("service", "ls", "--filter", filter1) 135 c.Assert(err, checker.IsNil) 136 c.Assert(out, checker.Contains, name1+" ") 137 c.Assert(out, checker.Not(checker.Contains), name2+" ") 138 c.Assert(out, checker.Not(checker.Contains), name3+" ") 139 140 out, err = d.Cmd("service", "ls", "--filter", filter2) 141 c.Assert(err, checker.IsNil) 142 c.Assert(out, checker.Contains, name1+" ") 143 c.Assert(out, checker.Contains, name2+" ") 144 c.Assert(out, checker.Not(checker.Contains), name3+" ") 145 146 out, err = d.Cmd("service", "ls") 147 c.Assert(err, checker.IsNil) 148 c.Assert(out, checker.Contains, name1+" ") 149 c.Assert(out, checker.Contains, name2+" ") 150 c.Assert(out, checker.Contains, name3+" ") 151 } 152 153 func (s *DockerSwarmSuite) TestSwarmNodeListFilter(c *check.C) { 154 d := s.AddDaemon(c, true, true) 155 156 out, err := d.Cmd("node", "inspect", "--format", "{{ .Description.Hostname }}", "self") 157 c.Assert(err, checker.IsNil) 158 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 159 name := strings.TrimSpace(out) 160 161 filter := "name=" + name[:4] 162 163 out, err = d.Cmd("node", "ls", "--filter", filter) 164 c.Assert(err, checker.IsNil) 165 c.Assert(out, checker.Contains, name) 166 167 out, err = d.Cmd("node", "ls", "--filter", "name=none") 168 c.Assert(err, checker.IsNil) 169 c.Assert(out, checker.Not(checker.Contains), name) 170 } 171 172 func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) { 173 d := s.AddDaemon(c, true, true) 174 175 name := "redis-cluster-md5" 176 out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top") 177 c.Assert(err, checker.IsNil) 178 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 179 180 // make sure task has been deployed. 181 waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 3) 182 183 filter := "name=redis-cluster" 184 185 out, err = d.Cmd("node", "ps", "--filter", filter, "self") 186 c.Assert(err, checker.IsNil) 187 c.Assert(out, checker.Contains, name+".1") 188 c.Assert(out, checker.Contains, name+".2") 189 c.Assert(out, checker.Contains, name+".3") 190 191 out, err = d.Cmd("node", "ps", "--filter", "name=none", "self") 192 c.Assert(err, checker.IsNil) 193 c.Assert(out, checker.Not(checker.Contains), name+".1") 194 c.Assert(out, checker.Not(checker.Contains), name+".2") 195 c.Assert(out, checker.Not(checker.Contains), name+".3") 196 } 197 198 // Test case for #25375 199 func (s *DockerSwarmSuite) TestSwarmPublishAdd(c *check.C) { 200 d := s.AddDaemon(c, true, true) 201 202 name := "top" 203 out, err := d.Cmd("service", "create", "--name", name, "--label", "x=y", "busybox", "top") 204 c.Assert(err, checker.IsNil) 205 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 206 207 out, err = d.Cmd("service", "update", "--publish-add", "80:80", name) 208 c.Assert(err, checker.IsNil) 209 210 out, err = d.cmdRetryOutOfSequence("service", "update", "--publish-add", "80:80", name) 211 c.Assert(err, checker.IsNil) 212 213 out, err = d.cmdRetryOutOfSequence("service", "update", "--publish-add", "80:80", "--publish-add", "80:20", name) 214 c.Assert(err, checker.NotNil) 215 216 out, err = d.cmdRetryOutOfSequence("service", "update", "--publish-add", "80:20", name) 217 c.Assert(err, checker.IsNil) 218 219 out, err = d.Cmd("service", "inspect", "--format", "{{ .Spec.EndpointSpec.Ports }}", name) 220 c.Assert(err, checker.IsNil) 221 c.Assert(strings.TrimSpace(out), checker.Equals, "[{ tcp 20 80}]") 222 } 223 224 func (s *DockerSwarmSuite) TestSwarmServiceWithGroup(c *check.C) { 225 d := s.AddDaemon(c, true, true) 226 227 name := "top" 228 out, err := d.Cmd("service", "create", "--name", name, "--user", "root:root", "--group-add", "wheel", "--group-add", "audio", "--group-add", "staff", "--group-add", "777", "busybox", "top") 229 c.Assert(err, checker.IsNil) 230 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 231 232 // make sure task has been deployed. 233 waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) 234 235 out, err = d.Cmd("ps", "-q") 236 c.Assert(err, checker.IsNil) 237 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 238 239 container := strings.TrimSpace(out) 240 241 out, err = d.Cmd("exec", container, "id") 242 c.Assert(err, checker.IsNil) 243 c.Assert(strings.TrimSpace(out), checker.Equals, "uid=0(root) gid=0(root) groups=10(wheel),29(audio),50(staff),777") 244 } 245 246 func (s *DockerSwarmSuite) TestSwarmContainerAutoStart(c *check.C) { 247 d := s.AddDaemon(c, true, true) 248 249 out, err := d.Cmd("network", "create", "--attachable", "-d", "overlay", "foo") 250 c.Assert(err, checker.IsNil) 251 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 252 253 out, err = d.Cmd("run", "-id", "--restart=always", "--net=foo", "--name=test", "busybox", "top") 254 c.Assert(err, checker.IsNil) 255 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 256 257 out, err = d.Cmd("ps", "-q") 258 c.Assert(err, checker.IsNil) 259 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 260 261 d.Restart() 262 263 out, err = d.Cmd("ps", "-q") 264 c.Assert(err, checker.IsNil) 265 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 266 } 267 268 func (s *DockerSwarmSuite) TestSwarmRemoveInternalNetwork(c *check.C) { 269 d := s.AddDaemon(c, true, true) 270 271 name := "ingress" 272 out, err := d.Cmd("network", "rm", name) 273 c.Assert(err, checker.NotNil) 274 c.Assert(strings.TrimSpace(out), checker.Contains, name) 275 c.Assert(strings.TrimSpace(out), checker.Contains, "is a pre-defined network and cannot be removed") 276 } 277 278 // Test case for #24108, also the case from: 279 // https://github.com/docker/docker/pull/24620#issuecomment-233715656 280 func (s *DockerSwarmSuite) TestSwarmTaskListFilter(c *check.C) { 281 d := s.AddDaemon(c, true, true) 282 283 name := "redis-cluster-md5" 284 out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top") 285 c.Assert(err, checker.IsNil) 286 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 287 288 filter := "name=redis-cluster" 289 290 out, err = d.Cmd("service", "ps", "--filter", filter, name) 291 c.Assert(err, checker.IsNil) 292 c.Assert(out, checker.Contains, name+".1") 293 c.Assert(out, checker.Contains, name+".2") 294 c.Assert(out, checker.Contains, name+".3") 295 296 out, err = d.Cmd("service", "ps", "--filter", "name="+name+".1", name) 297 c.Assert(err, checker.IsNil) 298 c.Assert(out, checker.Contains, name+".1") 299 c.Assert(out, checker.Not(checker.Contains), name+".2") 300 c.Assert(out, checker.Not(checker.Contains), name+".3") 301 302 out, err = d.Cmd("service", "ps", "--filter", "name=none", name) 303 c.Assert(err, checker.IsNil) 304 c.Assert(out, checker.Not(checker.Contains), name+".1") 305 c.Assert(out, checker.Not(checker.Contains), name+".2") 306 c.Assert(out, checker.Not(checker.Contains), name+".3") 307 308 name = "redis-cluster-sha1" 309 out, err = d.Cmd("service", "create", "--name", name, "--mode=global", "busybox", "top") 310 c.Assert(err, checker.IsNil) 311 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 312 313 filter = "name=redis-cluster" 314 out, err = d.Cmd("service", "ps", "--filter", filter, name) 315 c.Assert(err, checker.IsNil) 316 c.Assert(out, checker.Contains, name) 317 318 out, err = d.Cmd("service", "ps", "--filter", "name="+name, name) 319 c.Assert(err, checker.IsNil) 320 c.Assert(out, checker.Contains, name) 321 322 out, err = d.Cmd("service", "ps", "--filter", "name=none", name) 323 c.Assert(err, checker.IsNil) 324 c.Assert(out, checker.Not(checker.Contains), name) 325 } 326 327 func (s *DockerSwarmSuite) TestPsListContainersFilterIsTask(c *check.C) { 328 d := s.AddDaemon(c, true, true) 329 330 // Create a bare container 331 out, err := d.Cmd("run", "-d", "--name=bare-container", "busybox", "top") 332 c.Assert(err, checker.IsNil) 333 bareID := strings.TrimSpace(out)[:12] 334 // Create a service 335 name := "busybox-top" 336 out, err = d.Cmd("service", "create", "--name", name, "busybox", "top") 337 c.Assert(err, checker.IsNil) 338 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 339 340 // make sure task has been deployed. 341 waitAndAssert(c, defaultReconciliationTimeout, d.checkServiceRunningTasks(c, name), checker.Equals, 1) 342 343 // Filter non-tasks 344 out, err = d.Cmd("ps", "-a", "-q", "--filter=is-task=false") 345 c.Assert(err, checker.IsNil) 346 psOut := strings.TrimSpace(out) 347 c.Assert(psOut, checker.Equals, bareID, check.Commentf("Expected id %s, got %s for is-task label, output %q", bareID, psOut, out)) 348 349 // Filter tasks 350 out, err = d.Cmd("ps", "-a", "-q", "--filter=is-task=true") 351 c.Assert(err, checker.IsNil) 352 lines := strings.Split(strings.Trim(out, "\n "), "\n") 353 c.Assert(lines, checker.HasLen, 1) 354 c.Assert(lines[0], checker.Not(checker.Equals), bareID, check.Commentf("Expected not %s, but got it for is-task label, output %q", bareID, out)) 355 }