docker_cli_service_logs_experimental_test.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // +build !windows
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io"
  7. "os/exec"
  8. "strings"
  9. "github.com/docker/docker/pkg/integration/checker"
  10. "github.com/go-check/check"
  11. )
  12. type logMessage struct {
  13. err error
  14. data []byte
  15. }
  16. func (s *DockerSwarmSuite) TestServiceLogs(c *check.C) {
  17. testRequires(c, ExperimentalDaemon)
  18. d := s.AddDaemon(c, true, true)
  19. name := "TestServiceLogs"
  20. out, err := d.Cmd("service", "create", "--name", name, "--restart-condition", "none", "busybox", "sh", "-c", "echo hello world")
  21. c.Assert(err, checker.IsNil)
  22. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  23. // make sure task has been deployed.
  24. waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1)
  25. out, err = d.Cmd("service", "logs", name)
  26. fmt.Println(out)
  27. c.Assert(err, checker.IsNil)
  28. c.Assert(out, checker.Contains, "hello world")
  29. }
  30. func (s *DockerSwarmSuite) TestServiceLogsFollow(c *check.C) {
  31. testRequires(c, ExperimentalDaemon)
  32. d := s.AddDaemon(c, true, true)
  33. name := "TestServiceLogsFollow"
  34. out, err := d.Cmd("service", "create", "--name", name, "busybox", "sh", "-c", "while true; do echo log test; sleep 0.1; done")
  35. c.Assert(err, checker.IsNil)
  36. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  37. // make sure task has been deployed.
  38. waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1)
  39. args := []string{"service", "logs", "-f", name}
  40. cmd := exec.Command(dockerBinary, d.prependHostArg(args)...)
  41. r, w := io.Pipe()
  42. cmd.Stdout = w
  43. cmd.Stderr = w
  44. c.Assert(cmd.Start(), checker.IsNil)
  45. // Make sure pipe is written to
  46. ch := make(chan *logMessage)
  47. done := make(chan struct{})
  48. go func() {
  49. reader := bufio.NewReader(r)
  50. for {
  51. msg := &logMessage{}
  52. msg.data, _, msg.err = reader.ReadLine()
  53. select {
  54. case ch <- msg:
  55. case <-done:
  56. return
  57. }
  58. }
  59. }()
  60. for i := 0; i < 3; i++ {
  61. msg := <-ch
  62. c.Assert(msg.err, checker.IsNil)
  63. c.Assert(string(msg.data), checker.Contains, "log test")
  64. }
  65. close(done)
  66. c.Assert(cmd.Process.Kill(), checker.IsNil)
  67. }