Signed-off-by: Shishir Mahajan <shishir.mahajan@redhat.com>
Signed-off-by: Tibor Vass <tibor@docker.com>
| ... | ... |
@@ -79,7 +79,7 @@ func (s *DockerSuite) TestBuildShCmdJSONEntrypoint(c *check.C) {
|
| 79 | 79 |
out, _ := dockerCmd(c, "run", "--rm", name) |
| 80 | 80 |
|
| 81 | 81 |
if strings.TrimSpace(out) != "/bin/sh -c echo test" {
|
| 82 |
- c.Fatal("CMD did not contain /bin/sh -c")
|
|
| 82 |
+ c.Fatalf("CMD did not contain /bin/sh -c : %s", out)
|
|
| 83 | 83 |
} |
| 84 | 84 |
|
| 85 | 85 |
} |
| ... | ... |
@@ -324,6 +324,100 @@ func (s *DockerDaemonSuite) TestDaemonLogLevelWrong(c *check.C) {
|
| 324 | 324 |
c.Assert(s.d.Start("--log-level=bogus"), check.NotNil, check.Commentf("Daemon shouldn't start with wrong log level"))
|
| 325 | 325 |
} |
| 326 | 326 |
|
| 327 |
+func (s *DockerSuite) TestDaemonStartWithBackwardCompatibility(c *check.C) {
|
|
| 328 |
+ |
|
| 329 |
+ var validCommandArgs = [][]string{
|
|
| 330 |
+ {"--selinux-enabled", "-l", "info"},
|
|
| 331 |
+ {"--insecure-registry", "daemon"},
|
|
| 332 |
+ } |
|
| 333 |
+ |
|
| 334 |
+ var invalidCommandArgs = [][]string{
|
|
| 335 |
+ {"--selinux-enabled", "--storage-opt"},
|
|
| 336 |
+ {"-D", "-b"},
|
|
| 337 |
+ {"--config", "/tmp"},
|
|
| 338 |
+ } |
|
| 339 |
+ |
|
| 340 |
+ for _, args := range validCommandArgs {
|
|
| 341 |
+ d := NewDaemon(c) |
|
| 342 |
+ d.Command = "--daemon" |
|
| 343 |
+ if err := d.Start(args...); err != nil {
|
|
| 344 |
+ c.Fatalf("Daemon should have started successfully with --daemon %v: %v", args, err)
|
|
| 345 |
+ } |
|
| 346 |
+ d.Stop() |
|
| 347 |
+ } |
|
| 348 |
+ |
|
| 349 |
+ for _, args := range invalidCommandArgs {
|
|
| 350 |
+ d := NewDaemon(c) |
|
| 351 |
+ if err := d.Start(args...); err == nil {
|
|
| 352 |
+ d.Stop() |
|
| 353 |
+ c.Fatalf("Daemon should have failed to start with %v", args)
|
|
| 354 |
+ } |
|
| 355 |
+ } |
|
| 356 |
+} |
|
| 357 |
+ |
|
| 358 |
+func (s *DockerSuite) TestDaemonStartWithDaemonCommand(c *check.C) {
|
|
| 359 |
+ |
|
| 360 |
+ type kind int |
|
| 361 |
+ |
|
| 362 |
+ const ( |
|
| 363 |
+ common kind = iota |
|
| 364 |
+ daemon |
|
| 365 |
+ ) |
|
| 366 |
+ |
|
| 367 |
+ var flags = []map[kind][]string{
|
|
| 368 |
+ {common: {"-l", "info"}, daemon: {"--selinux-enabled"}},
|
|
| 369 |
+ {common: {"-D"}, daemon: {"--selinux-enabled", "-r"}},
|
|
| 370 |
+ {common: {"-D"}, daemon: {"--restart"}},
|
|
| 371 |
+ {common: {"--debug"}, daemon: {"--log-driver=json-file", "--log-opt=max-size=1k"}},
|
|
| 372 |
+ } |
|
| 373 |
+ |
|
| 374 |
+ var invalidGlobalFlags = [][]string{
|
|
| 375 |
+ //Invalid because you cannot pass daemon flags as global flags. |
|
| 376 |
+ {"--selinux-enabled", "-l", "info"},
|
|
| 377 |
+ {"-D", "-r"},
|
|
| 378 |
+ {"--config", "/tmp"},
|
|
| 379 |
+ } |
|
| 380 |
+ |
|
| 381 |
+ // `docker daemon -l info --selinux-enabled` |
|
| 382 |
+ // should NOT error out |
|
| 383 |
+ for _, f := range flags {
|
|
| 384 |
+ d := NewDaemon(c) |
|
| 385 |
+ args := append(f[common], f[daemon]...) |
|
| 386 |
+ if err := d.Start(args...); err != nil {
|
|
| 387 |
+ c.Fatalf("Daemon should have started successfully with %v: %v", args, err)
|
|
| 388 |
+ } |
|
| 389 |
+ d.Stop() |
|
| 390 |
+ } |
|
| 391 |
+ |
|
| 392 |
+ // `docker -l info daemon --selinux-enabled` |
|
| 393 |
+ // should error out |
|
| 394 |
+ for _, f := range flags {
|
|
| 395 |
+ d := NewDaemon(c) |
|
| 396 |
+ d.GlobalFlags = f[common] |
|
| 397 |
+ if err := d.Start(f[daemon]...); err == nil {
|
|
| 398 |
+ d.Stop() |
|
| 399 |
+ c.Fatalf("Daemon should have failed to start with docker %v daemon %v", d.GlobalFlags, f[daemon])
|
|
| 400 |
+ } |
|
| 401 |
+ } |
|
| 402 |
+ |
|
| 403 |
+ for _, f := range invalidGlobalFlags {
|
|
| 404 |
+ cmd := exec.Command(dockerBinary, append(f, "daemon")...) |
|
| 405 |
+ errch := make(chan error) |
|
| 406 |
+ var err error |
|
| 407 |
+ go func() {
|
|
| 408 |
+ errch <- cmd.Run() |
|
| 409 |
+ }() |
|
| 410 |
+ select {
|
|
| 411 |
+ case <-time.After(time.Second): |
|
| 412 |
+ cmd.Process.Kill() |
|
| 413 |
+ case err = <-errch: |
|
| 414 |
+ } |
|
| 415 |
+ if err == nil {
|
|
| 416 |
+ c.Fatalf("Daemon should have failed to start with docker %v daemon", f)
|
|
| 417 |
+ } |
|
| 418 |
+ } |
|
| 419 |
+} |
|
| 420 |
+ |
|
| 327 | 421 |
func (s *DockerDaemonSuite) TestDaemonLogLevelDebug(c *check.C) {
|
| 328 | 422 |
if err := s.d.Start("--log-level=debug"); err != nil {
|
| 329 | 423 |
c.Fatal(err) |
| ... | ... |
@@ -382,7 +476,7 @@ func (s *DockerDaemonSuite) TestDaemonAllocatesListeningPort(c *check.C) {
|
| 382 | 382 |
{"localhost", "127.0.0.1", "1235"},
|
| 383 | 383 |
} |
| 384 | 384 |
|
| 385 |
- cmdArgs := []string{}
|
|
| 385 |
+ cmdArgs := make([]string, 0, len(listeningPorts)*2) |
|
| 386 | 386 |
for _, hostDirective := range listeningPorts {
|
| 387 | 387 |
cmdArgs = append(cmdArgs, "--host", fmt.Sprintf("tcp://%s:%s", hostDirective[0], hostDirective[2]))
|
| 388 | 388 |
} |
| ... | ... |
@@ -798,8 +892,7 @@ func (s *DockerDaemonSuite) TestDaemonLinksIpTablesRulesWhenLinkAndUnlink(c *che |
| 798 | 798 |
c.Assert(err, check.IsNil, check.Commentf(out)) |
| 799 | 799 |
defer deleteInterface(c, bridgeName) |
| 800 | 800 |
|
| 801 |
- args := []string{"--bridge", bridgeName, "--icc=false"}
|
|
| 802 |
- err = s.d.StartWithBusybox(args...) |
|
| 801 |
+ err = s.d.StartWithBusybox("--bridge", bridgeName, "--icc=false")
|
|
| 803 | 802 |
c.Assert(err, check.IsNil) |
| 804 | 803 |
defer s.d.Restart() |
| 805 | 804 |
|
| ... | ... |
@@ -1210,7 +1303,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartKillWait(c *check.C) {
|
| 1210 | 1210 |
// TestHttpsInfo connects via two-way authenticated HTTPS to the info endpoint |
| 1211 | 1211 |
func (s *DockerDaemonSuite) TestHttpsInfo(c *check.C) {
|
| 1212 | 1212 |
const ( |
| 1213 |
- testDaemonHTTPSAddr = "localhost:4271" |
|
| 1213 |
+ testDaemonHTTPSAddr = "tcp://localhost:4271" |
|
| 1214 | 1214 |
) |
| 1215 | 1215 |
|
| 1216 | 1216 |
if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem",
|
| ... | ... |
@@ -1218,9 +1311,7 @@ func (s *DockerDaemonSuite) TestHttpsInfo(c *check.C) {
|
| 1218 | 1218 |
c.Fatalf("Could not start daemon with busybox: %v", err)
|
| 1219 | 1219 |
} |
| 1220 | 1220 |
|
| 1221 |
- //force tcp protocol |
|
| 1222 |
- host := fmt.Sprintf("tcp://%s", testDaemonHTTPSAddr)
|
|
| 1223 |
- daemonArgs := []string{"--host", host, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-cert.pem", "--tlskey", "fixtures/https/client-key.pem"}
|
|
| 1221 |
+ daemonArgs := []string{"--host", testDaemonHTTPSAddr, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-cert.pem", "--tlskey", "fixtures/https/client-key.pem"}
|
|
| 1224 | 1222 |
out, err := s.d.CmdWithArgs(daemonArgs, "info") |
| 1225 | 1223 |
if err != nil {
|
| 1226 | 1224 |
c.Fatalf("Error Occurred: %s and output: %s", err, out)
|
| ... | ... |
@@ -1232,16 +1323,15 @@ func (s *DockerDaemonSuite) TestHttpsInfo(c *check.C) {
|
| 1232 | 1232 |
func (s *DockerDaemonSuite) TestHttpsInfoRogueCert(c *check.C) {
|
| 1233 | 1233 |
const ( |
| 1234 | 1234 |
errBadCertificate = "remote error: bad certificate" |
| 1235 |
- testDaemonHTTPSAddr = "localhost:4271" |
|
| 1235 |
+ testDaemonHTTPSAddr = "tcp://localhost:4271" |
|
| 1236 | 1236 |
) |
| 1237 |
+ |
|
| 1237 | 1238 |
if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem",
|
| 1238 | 1239 |
"--tlskey", "fixtures/https/server-key.pem", "-H", testDaemonHTTPSAddr); err != nil {
|
| 1239 | 1240 |
c.Fatalf("Could not start daemon with busybox: %v", err)
|
| 1240 | 1241 |
} |
| 1241 | 1242 |
|
| 1242 |
- //force tcp protocol |
|
| 1243 |
- host := fmt.Sprintf("tcp://%s", testDaemonHTTPSAddr)
|
|
| 1244 |
- daemonArgs := []string{"--host", host, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
|
|
| 1243 |
+ daemonArgs := []string{"--host", testDaemonHTTPSAddr, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
|
|
| 1245 | 1244 |
out, err := s.d.CmdWithArgs(daemonArgs, "info") |
| 1246 | 1245 |
if err == nil || !strings.Contains(out, errBadCertificate) {
|
| 1247 | 1246 |
c.Fatalf("Expected err: %s, got instead: %s and output: %s", errBadCertificate, err, out)
|
| ... | ... |
@@ -1253,16 +1343,14 @@ func (s *DockerDaemonSuite) TestHttpsInfoRogueCert(c *check.C) {
|
| 1253 | 1253 |
func (s *DockerDaemonSuite) TestHttpsInfoRogueServerCert(c *check.C) {
|
| 1254 | 1254 |
const ( |
| 1255 | 1255 |
errCaUnknown = "x509: certificate signed by unknown authority" |
| 1256 |
- testDaemonRogueHTTPSAddr = "localhost:4272" |
|
| 1256 |
+ testDaemonRogueHTTPSAddr = "tcp://localhost:4272" |
|
| 1257 | 1257 |
) |
| 1258 | 1258 |
if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-rogue-cert.pem",
|
| 1259 | 1259 |
"--tlskey", "fixtures/https/server-rogue-key.pem", "-H", testDaemonRogueHTTPSAddr); err != nil {
|
| 1260 | 1260 |
c.Fatalf("Could not start daemon with busybox: %v", err)
|
| 1261 | 1261 |
} |
| 1262 | 1262 |
|
| 1263 |
- //force tcp protocol |
|
| 1264 |
- host := fmt.Sprintf("tcp://%s", testDaemonRogueHTTPSAddr)
|
|
| 1265 |
- daemonArgs := []string{"--host", host, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
|
|
| 1263 |
+ daemonArgs := []string{"--host", testDaemonRogueHTTPSAddr, "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/client-rogue-cert.pem", "--tlskey", "fixtures/https/client-rogue-key.pem"}
|
|
| 1266 | 1264 |
out, err := s.d.CmdWithArgs(daemonArgs, "info") |
| 1267 | 1265 |
if err == nil || !strings.Contains(out, errCaUnknown) {
|
| 1268 | 1266 |
c.Fatalf("Expected err: %s, got instead: %s and output: %s", errCaUnknown, err, out)
|
| ... | ... |
@@ -89,10 +89,18 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
|
| 89 | 89 |
c.Fatalf("Missing 'Commands:' in:\n%s", out)
|
| 90 | 90 |
} |
| 91 | 91 |
|
| 92 |
- // Grab all chars starting at "Commands:" |
|
| 93 |
- // Skip first line, its "Commands:" |
|
| 94 | 92 |
cmds := []string{}
|
| 95 |
- for _, cmd := range strings.Split(out[i:], "\n")[1:] {
|
|
| 93 |
+ // Grab all chars starting at "Commands:" |
|
| 94 |
+ helpOut := strings.Split(out[i:], "\n") |
|
| 95 |
+ // First line is just "Commands:" |
|
| 96 |
+ if isLocalDaemon {
|
|
| 97 |
+ // Replace first line with "daemon" command since it's not part of the list of commands. |
|
| 98 |
+ helpOut[0] = " daemon" |
|
| 99 |
+ } else {
|
|
| 100 |
+ // Skip first line |
|
| 101 |
+ helpOut = helpOut[1:] |
|
| 102 |
+ } |
|
| 103 |
+ for _, cmd := range helpOut {
|
|
| 96 | 104 |
var stderr string |
| 97 | 105 |
|
| 98 | 106 |
// Stop on blank line or non-idented line |
| ... | ... |
@@ -192,9 +200,10 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
|
| 192 | 192 |
// lead to incorrect test result (like false negative). |
| 193 | 193 |
// Whatever the reason, skip trying to run w/o args and |
| 194 | 194 |
// jump to trying with a bogus arg. |
| 195 |
- skipNoArgs := map[string]string{
|
|
| 196 |
- "events": "", |
|
| 197 |
- "load": "", |
|
| 195 |
+ skipNoArgs := map[string]struct{}{
|
|
| 196 |
+ "daemon": {},
|
|
| 197 |
+ "events": {},
|
|
| 198 |
+ "load": {},
|
|
| 198 | 199 |
} |
| 199 | 200 |
|
| 200 | 201 |
ec = 0 |
| ... | ... |
@@ -230,6 +239,9 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {
|
| 230 | 230 |
} |
| 231 | 231 |
|
| 232 | 232 |
expected := 39 |
| 233 |
+ if isLocalDaemon {
|
|
| 234 |
+ expected++ // for the daemon command |
|
| 235 |
+ } |
|
| 233 | 236 |
if len(cmds) != expected {
|
| 234 | 237 |
c.Fatalf("Wrong # of cmds(%d), it should be: %d\nThe list:\n%q",
|
| 235 | 238 |
len(cmds), expected, cmds) |
| ... | ... |
@@ -246,7 +258,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 246 | 246 |
cmd := exec.Command(dockerBinary) |
| 247 | 247 |
stdout, stderr, ec, err := runCommandWithStdoutStderr(cmd) |
| 248 | 248 |
if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
|
| 249 |
- c.Fatalf("Bad results from 'docker'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 249 |
+ c.Fatalf("Bad results from 'docker'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 250 | 250 |
} |
| 251 | 251 |
// Be really pick |
| 252 | 252 |
if strings.HasSuffix(stdout, "\n\n") {
|
| ... | ... |
@@ -257,7 +269,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 257 | 257 |
cmd = exec.Command(dockerBinary, "help") |
| 258 | 258 |
stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd) |
| 259 | 259 |
if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
|
| 260 |
- c.Fatalf("Bad results from 'docker help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 260 |
+ c.Fatalf("Bad results from 'docker help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 261 | 261 |
} |
| 262 | 262 |
// Be really pick |
| 263 | 263 |
if strings.HasSuffix(stdout, "\n\n") {
|
| ... | ... |
@@ -268,7 +280,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 268 | 268 |
cmd = exec.Command(dockerBinary, "--help") |
| 269 | 269 |
stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd) |
| 270 | 270 |
if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
|
| 271 |
- c.Fatalf("Bad results from 'docker --help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 271 |
+ c.Fatalf("Bad results from 'docker --help'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 272 | 272 |
} |
| 273 | 273 |
// Be really pick |
| 274 | 274 |
if strings.HasSuffix(stdout, "\n\n") {
|
| ... | ... |
@@ -280,7 +292,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 280 | 280 |
cmd = exec.Command(dockerBinary, "inspect", "busybox") |
| 281 | 281 |
stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd) |
| 282 | 282 |
if len(stdout) == 0 || len(stderr) != 0 || ec != 0 || err != nil {
|
| 283 |
- c.Fatalf("Bad results from 'docker inspect busybox'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 283 |
+ c.Fatalf("Bad results from 'docker inspect busybox'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 284 | 284 |
} |
| 285 | 285 |
// Be really pick |
| 286 | 286 |
if strings.HasSuffix(stdout, "\n\n") {
|
| ... | ... |
@@ -292,7 +304,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 292 | 292 |
cmd = exec.Command(dockerBinary, "rm") |
| 293 | 293 |
stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd) |
| 294 | 294 |
if len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {
|
| 295 |
- c.Fatalf("Bad results from 'docker rm'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 295 |
+ c.Fatalf("Bad results from 'docker rm'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 296 | 296 |
} |
| 297 | 297 |
// Should not contain full help text but should contain info about |
| 298 | 298 |
// # of args and Usage line |
| ... | ... |
@@ -305,7 +317,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 305 | 305 |
cmd = exec.Command(dockerBinary, "rm", "NoSuchContainer") |
| 306 | 306 |
stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd) |
| 307 | 307 |
if len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {
|
| 308 |
- c.Fatalf("Bad results from 'docker rm NoSuchContainer'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 308 |
+ c.Fatalf("Bad results from 'docker rm NoSuchContainer'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 309 | 309 |
} |
| 310 | 310 |
// Be really picky |
| 311 | 311 |
if strings.HasSuffix(stderr, "\n\n") {
|
| ... | ... |
@@ -316,7 +328,7 @@ func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) {
|
| 316 | 316 |
cmd = exec.Command(dockerBinary, "BadCmd") |
| 317 | 317 |
stdout, stderr, ec, err = runCommandWithStdoutStderr(cmd) |
| 318 | 318 |
if len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {
|
| 319 |
- c.Fatalf("Bad results from 'docker BadCmd'\nec:%d\nstdout:%s\nstderr:%s\nerr:%q", ec, stdout, stderr, err)
|
|
| 319 |
+ c.Fatalf("Bad results from 'docker BadCmd'\nec:%d\nstdout:%s\nstderr:%s\nerr:%v", ec, stdout, stderr, err)
|
|
| 320 | 320 |
} |
| 321 | 321 |
if stderr != "docker: 'BadCmd' is not a docker command.\nSee 'docker --help'.\n" {
|
| 322 | 322 |
c.Fatalf("Unexcepted output for 'docker badCmd'\nstderr:%s", stderr)
|
| ... | ... |
@@ -43,8 +43,7 @@ func (s *DockerDaemonSuite) TestCliProxyProxyTCPSock(c *check.C) {
|
| 43 | 43 |
c.Fatal("could not find ip to connect to")
|
| 44 | 44 |
} |
| 45 | 45 |
|
| 46 |
- s.d.GlobalFlags = []string{"-H", "tcp://" + ip + ":2375"}
|
|
| 47 |
- if err := s.d.Start(); err != nil {
|
|
| 46 |
+ if err := s.d.Start("-H", "tcp://"+ip+":2375"); err != nil {
|
|
| 48 | 47 |
c.Fatal(err) |
| 49 | 48 |
} |
| 50 | 49 |
|
| ... | ... |
@@ -217,6 +217,17 @@ func (s *DockerSuite) TestRunLinksContainerWithContainerId(c *check.C) {
|
| 217 | 217 |
} |
| 218 | 218 |
} |
| 219 | 219 |
|
| 220 |
+// Issue 9677. |
|
| 221 |
+func (s *DockerSuite) TestRunWithDaemonFlags(c *check.C) {
|
|
| 222 |
+ out, _, err := dockerCmdWithError(c, "--selinux-enabled", "run", "-i", "-t", "busybox", "true") |
|
| 223 |
+ if err != nil {
|
|
| 224 |
+ if !strings.Contains(out, "must follow the 'docker daemon' command") && // daemon |
|
| 225 |
+ !strings.Contains(out, "flag provided but not defined: --selinux-enabled") { // no daemon (client-only)
|
|
| 226 |
+ c.Fatal(err, out) |
|
| 227 |
+ } |
|
| 228 |
+ } |
|
| 229 |
+} |
|
| 230 |
+ |
|
| 220 | 231 |
// Regression test for #4979 |
| 221 | 232 |
func (s *DockerSuite) TestRunWithVolumesFromExited(c *check.C) {
|
| 222 | 233 |
out, exitCode := dockerCmd(c, "run", "--name", "test-data", "--volume", "/some/dir", "busybox", "touch", "/some/dir/file") |
| ... | ... |
@@ -29,6 +29,12 @@ import ( |
| 29 | 29 |
|
| 30 | 30 |
// Daemon represents a Docker daemon for the testing framework. |
| 31 | 31 |
type Daemon struct {
|
| 32 |
+ // Defaults to "daemon" |
|
| 33 |
+ // Useful to set to --daemon or -d for checking backwards compatability |
|
| 34 |
+ Command string |
|
| 35 |
+ GlobalFlags []string |
|
| 36 |
+ |
|
| 37 |
+ id string |
|
| 32 | 38 |
c *check.C |
| 33 | 39 |
logFile *os.File |
| 34 | 40 |
folder string |
| ... | ... |
@@ -59,7 +65,8 @@ func NewDaemon(c *check.C) *Daemon {
|
| 59 | 59 |
c.Fatal("Please set the DEST environment variable")
|
| 60 | 60 |
} |
| 61 | 61 |
|
| 62 |
- dir := filepath.Join(dest, fmt.Sprintf("d%d", time.Now().UnixNano()%100000000))
|
|
| 62 |
+ id := fmt.Sprintf("d%d", time.Now().UnixNano()%100000000)
|
|
| 63 |
+ dir := filepath.Join(dest, id) |
|
| 63 | 64 |
daemonFolder, err := filepath.Abs(dir) |
| 64 | 65 |
if err != nil {
|
| 65 | 66 |
c.Fatalf("Could not make %q an absolute path: %v", dir, err)
|
| ... | ... |
@@ -77,6 +84,8 @@ func NewDaemon(c *check.C) *Daemon {
|
| 77 | 77 |
} |
| 78 | 78 |
|
| 79 | 79 |
return &Daemon{
|
| 80 |
+ Command: "daemon", |
|
| 81 |
+ id: id, |
|
| 80 | 82 |
c: c, |
| 81 | 83 |
folder: daemonFolder, |
| 82 | 84 |
storageDriver: os.Getenv("DOCKER_GRAPHDRIVER"),
|
| ... | ... |
@@ -90,22 +99,22 @@ func NewDaemon(c *check.C) *Daemon {
|
| 90 | 90 |
func (d *Daemon) Start(arg ...string) error {
|
| 91 | 91 |
dockerBinary, err := exec.LookPath(dockerBinary) |
| 92 | 92 |
if err != nil {
|
| 93 |
- d.c.Fatalf("could not find docker binary in $PATH: %v", err)
|
|
| 93 |
+ d.c.Fatalf("[%s] could not find docker binary in $PATH: %v", d.id, err)
|
|
| 94 | 94 |
} |
| 95 | 95 |
|
| 96 |
- args := []string{
|
|
| 96 |
+ args := append(d.GlobalFlags, |
|
| 97 |
+ d.Command, |
|
| 97 | 98 |
"--host", d.sock(), |
| 98 |
- "--daemon", |
|
| 99 | 99 |
"--graph", fmt.Sprintf("%s/graph", d.folder),
|
| 100 | 100 |
"--pidfile", fmt.Sprintf("%s/docker.pid", d.folder),
|
| 101 | 101 |
fmt.Sprintf("--userland-proxy=%t", d.userlandProxy),
|
| 102 |
- } |
|
| 102 |
+ ) |
|
| 103 | 103 |
|
| 104 | 104 |
// If we don't explicitly set the log-level or debug flag(-D) then |
| 105 | 105 |
// turn on debug mode |
| 106 | 106 |
foundIt := false |
| 107 | 107 |
for _, a := range arg {
|
| 108 |
- if strings.Contains(a, "--log-level") || strings.Contains(a, "-D") {
|
|
| 108 |
+ if strings.Contains(a, "--log-level") || strings.Contains(a, "-D") || strings.Contains(a, "--debug") {
|
|
| 109 | 109 |
foundIt = true |
| 110 | 110 |
} |
| 111 | 111 |
} |
| ... | ... |
@@ -125,21 +134,21 @@ func (d *Daemon) Start(arg ...string) error {
|
| 125 | 125 |
|
| 126 | 126 |
d.logFile, err = os.OpenFile(filepath.Join(d.folder, "docker.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) |
| 127 | 127 |
if err != nil {
|
| 128 |
- d.c.Fatalf("Could not create %s/docker.log: %v", d.folder, err)
|
|
| 128 |
+ d.c.Fatalf("[%s] Could not create %s/docker.log: %v", d.id, d.folder, err)
|
|
| 129 | 129 |
} |
| 130 | 130 |
|
| 131 | 131 |
d.cmd.Stdout = d.logFile |
| 132 | 132 |
d.cmd.Stderr = d.logFile |
| 133 | 133 |
|
| 134 | 134 |
if err := d.cmd.Start(); err != nil {
|
| 135 |
- return fmt.Errorf("could not start daemon container: %v", err)
|
|
| 135 |
+ return fmt.Errorf("[%s] could not start daemon container: %v", d.id, err)
|
|
| 136 | 136 |
} |
| 137 | 137 |
|
| 138 | 138 |
wait := make(chan error) |
| 139 | 139 |
|
| 140 | 140 |
go func() {
|
| 141 | 141 |
wait <- d.cmd.Wait() |
| 142 |
- d.c.Log("exiting daemon")
|
|
| 142 |
+ d.c.Logf("[%s] exiting daemon", d.id)
|
|
| 143 | 143 |
close(wait) |
| 144 | 144 |
}() |
| 145 | 145 |
|
| ... | ... |
@@ -149,14 +158,14 @@ func (d *Daemon) Start(arg ...string) error {
|
| 149 | 149 |
// make sure daemon is ready to receive requests |
| 150 | 150 |
startTime := time.Now().Unix() |
| 151 | 151 |
for {
|
| 152 |
- d.c.Log("waiting for daemon to start")
|
|
| 152 |
+ d.c.Logf("[%s] waiting for daemon to start", d.id)
|
|
| 153 | 153 |
if time.Now().Unix()-startTime > 5 {
|
| 154 | 154 |
// After 5 seconds, give up |
| 155 |
- return errors.New("Daemon exited and never started")
|
|
| 155 |
+ return fmt.Errorf("[%s] Daemon exited and never started", d.id)
|
|
| 156 | 156 |
} |
| 157 | 157 |
select {
|
| 158 | 158 |
case <-time.After(2 * time.Second): |
| 159 |
- return errors.New("timeout: daemon does not respond")
|
|
| 159 |
+ return fmt.Errorf("[%s] timeout: daemon does not respond", d.id)
|
|
| 160 | 160 |
case <-tick: |
| 161 | 161 |
c, err := net.Dial("unix", filepath.Join(d.folder, "docker.sock"))
|
| 162 | 162 |
if err != nil {
|
| ... | ... |
@@ -168,7 +177,7 @@ func (d *Daemon) Start(arg ...string) error {
|
| 168 | 168 |
|
| 169 | 169 |
req, err := http.NewRequest("GET", "/_ping", nil)
|
| 170 | 170 |
if err != nil {
|
| 171 |
- d.c.Fatalf("could not create new request: %v", err)
|
|
| 171 |
+ d.c.Fatalf("[%s] could not create new request: %v", d.id, err)
|
|
| 172 | 172 |
} |
| 173 | 173 |
|
| 174 | 174 |
resp, err := client.Do(req) |
| ... | ... |
@@ -176,10 +185,10 @@ func (d *Daemon) Start(arg ...string) error {
|
| 176 | 176 |
continue |
| 177 | 177 |
} |
| 178 | 178 |
if resp.StatusCode != http.StatusOK {
|
| 179 |
- d.c.Logf("received status != 200 OK: %s", resp.Status)
|
|
| 179 |
+ d.c.Logf("[%s] received status != 200 OK: %s", d.id, resp.Status)
|
|
| 180 | 180 |
} |
| 181 | 181 |
|
| 182 |
- d.c.Log("daemon started")
|
|
| 182 |
+ d.c.Logf("[%s] daemon started", d.id)
|
|
| 183 | 183 |
return nil |
| 184 | 184 |
} |
| 185 | 185 |
} |