docker_cli_events_unix_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // +build !windows
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "io/ioutil"
  7. "os"
  8. "os/exec"
  9. "strings"
  10. "time"
  11. "unicode"
  12. "github.com/go-check/check"
  13. "github.com/kr/pty"
  14. )
  15. // #5979
  16. func (s *DockerSuite) TestEventsRedirectStdout(c *check.C) {
  17. since := daemonTime(c).Unix()
  18. dockerCmd(c, "run", "busybox", "true")
  19. file, err := ioutil.TempFile("", "")
  20. if err != nil {
  21. c.Fatalf("could not create temp file: %v", err)
  22. }
  23. defer os.Remove(file.Name())
  24. command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, daemonTime(c).Unix(), file.Name())
  25. _, tty, err := pty.Open()
  26. if err != nil {
  27. c.Fatalf("Could not open pty: %v", err)
  28. }
  29. cmd := exec.Command("sh", "-c", command)
  30. cmd.Stdin = tty
  31. cmd.Stdout = tty
  32. cmd.Stderr = tty
  33. if err := cmd.Run(); err != nil {
  34. c.Fatalf("run err for command %q: %v", command, err)
  35. }
  36. scanner := bufio.NewScanner(file)
  37. for scanner.Scan() {
  38. for _, ch := range scanner.Text() {
  39. if unicode.IsControl(ch) {
  40. c.Fatalf("found control character %v", []byte(string(ch)))
  41. }
  42. }
  43. }
  44. if err := scanner.Err(); err != nil {
  45. c.Fatalf("Scan err for command %q: %v", command, err)
  46. }
  47. }
  48. func (s *DockerSuite) TestEventsOOMDisableFalse(c *check.C) {
  49. testRequires(c, DaemonIsLinux)
  50. testRequires(c, oomControl)
  51. errChan := make(chan error)
  52. go func() {
  53. defer close(errChan)
  54. out, exitCode, _ := dockerCmdWithError("run", "--name", "oomFalse", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done")
  55. if expected := 137; exitCode != expected {
  56. errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out)
  57. }
  58. }()
  59. select {
  60. case err := <-errChan:
  61. c.Assert(err, check.IsNil)
  62. case <-time.After(30 * time.Second):
  63. c.Fatal("Timeout waiting for container to die on OOM")
  64. }
  65. out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomFalse", fmt.Sprintf("--until=%d", daemonTime(c).Unix()))
  66. events := strings.Split(strings.TrimSuffix(out, "\n"), "\n")
  67. if len(events) < 5 {
  68. c.Fatalf("Missing expected event")
  69. }
  70. createEvent := strings.Fields(events[len(events)-5])
  71. attachEvent := strings.Fields(events[len(events)-4])
  72. startEvent := strings.Fields(events[len(events)-3])
  73. oomEvent := strings.Fields(events[len(events)-2])
  74. dieEvent := strings.Fields(events[len(events)-1])
  75. if createEvent[len(createEvent)-1] != "create" {
  76. c.Fatalf("event should be create, not %#v", createEvent)
  77. }
  78. if attachEvent[len(attachEvent)-1] != "attach" {
  79. c.Fatalf("event should be attach, not %#v", attachEvent)
  80. }
  81. if startEvent[len(startEvent)-1] != "start" {
  82. c.Fatalf("event should be start, not %#v", startEvent)
  83. }
  84. if oomEvent[len(oomEvent)-1] != "oom" {
  85. c.Fatalf("event should be oom, not %#v", oomEvent)
  86. }
  87. if dieEvent[len(dieEvent)-1] != "die" {
  88. c.Fatalf("event should be die, not %#v", dieEvent)
  89. }
  90. }
  91. func (s *DockerSuite) TestEventsOOMDisableTrue(c *check.C) {
  92. testRequires(c, DaemonIsLinux)
  93. testRequires(c, oomControl)
  94. errChan := make(chan error)
  95. go func() {
  96. defer close(errChan)
  97. out, exitCode, _ := dockerCmdWithError("run", "--oom-kill-disable=true", "--name", "oomTrue", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done")
  98. if expected := 137; exitCode != expected {
  99. errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out)
  100. }
  101. }()
  102. select {
  103. case err := <-errChan:
  104. c.Assert(err, check.IsNil)
  105. case <-time.After(20 * time.Second):
  106. defer dockerCmd(c, "kill", "oomTrue")
  107. out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomTrue", fmt.Sprintf("--until=%d", daemonTime(c).Unix()))
  108. events := strings.Split(strings.TrimSuffix(out, "\n"), "\n")
  109. if len(events) < 4 {
  110. c.Fatalf("Missing expected event")
  111. }
  112. createEvent := strings.Fields(events[len(events)-4])
  113. attachEvent := strings.Fields(events[len(events)-3])
  114. startEvent := strings.Fields(events[len(events)-2])
  115. oomEvent := strings.Fields(events[len(events)-1])
  116. if createEvent[len(createEvent)-1] != "create" {
  117. c.Fatalf("event should be create, not %#v", createEvent)
  118. }
  119. if attachEvent[len(attachEvent)-1] != "attach" {
  120. c.Fatalf("event should be attach, not %#v", attachEvent)
  121. }
  122. if startEvent[len(startEvent)-1] != "start" {
  123. c.Fatalf("event should be start, not %#v", startEvent)
  124. }
  125. if oomEvent[len(oomEvent)-1] != "oom" {
  126. c.Fatalf("event should be oom, not %#v", oomEvent)
  127. }
  128. out, _ = dockerCmd(c, "inspect", "-f", "{{.State.Status}}", "oomTrue")
  129. if strings.TrimSpace(out) != "running" {
  130. c.Fatalf("container should be still running, not %v", out)
  131. }
  132. }
  133. }