docker_cli_service_logs_experimental_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // +build !windows
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io"
  7. "os/exec"
  8. "strings"
  9. "github.com/docker/docker/integration-cli/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. // we have multiple services here for detecting the goroutine issue #28915
  20. services := map[string]string{
  21. "TestServiceLogs1": "hello1",
  22. "TestServiceLogs2": "hello2",
  23. }
  24. for name, message := range services {
  25. out, err := d.Cmd("service", "create", "--name", name, "busybox",
  26. "sh", "-c", fmt.Sprintf("echo %s; tail -f /dev/null", message))
  27. c.Assert(err, checker.IsNil)
  28. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  29. }
  30. // make sure task has been deployed.
  31. waitAndAssert(c, defaultReconciliationTimeout,
  32. d.CheckActiveContainerCount, checker.Equals, len(services))
  33. for name, message := range services {
  34. out, err := d.Cmd("service", "logs", name)
  35. c.Assert(err, checker.IsNil)
  36. c.Logf("log for %q: %q", name, out)
  37. c.Assert(out, checker.Contains, message)
  38. }
  39. }
  40. func (s *DockerSwarmSuite) TestServiceLogsFollow(c *check.C) {
  41. testRequires(c, ExperimentalDaemon)
  42. d := s.AddDaemon(c, true, true)
  43. name := "TestServiceLogsFollow"
  44. out, err := d.Cmd("service", "create", "--name", name, "busybox", "sh", "-c", "while true; do echo log test; sleep 0.1; done")
  45. c.Assert(err, checker.IsNil)
  46. c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "")
  47. // make sure task has been deployed.
  48. waitAndAssert(c, defaultReconciliationTimeout, d.CheckActiveContainerCount, checker.Equals, 1)
  49. args := []string{"service", "logs", "-f", name}
  50. cmd := exec.Command(dockerBinary, d.PrependHostArg(args)...)
  51. r, w := io.Pipe()
  52. cmd.Stdout = w
  53. cmd.Stderr = w
  54. c.Assert(cmd.Start(), checker.IsNil)
  55. // Make sure pipe is written to
  56. ch := make(chan *logMessage)
  57. done := make(chan struct{})
  58. go func() {
  59. reader := bufio.NewReader(r)
  60. for {
  61. msg := &logMessage{}
  62. msg.data, _, msg.err = reader.ReadLine()
  63. select {
  64. case ch <- msg:
  65. case <-done:
  66. return
  67. }
  68. }
  69. }()
  70. for i := 0; i < 3; i++ {
  71. msg := <-ch
  72. c.Assert(msg.err, checker.IsNil)
  73. c.Assert(string(msg.data), checker.Contains, "log test")
  74. }
  75. close(done)
  76. c.Assert(cmd.Process.Kill(), checker.IsNil)
  77. }