docker_cli_events_unix_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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, NativeExecDriver)
  51. testRequires(c, oomControl)
  52. errChan := make(chan error)
  53. go func() {
  54. defer close(errChan)
  55. out, exitCode, _ := dockerCmdWithError("run", "--name", "oomFalse", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done")
  56. if expected := 137; exitCode != expected {
  57. errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out)
  58. }
  59. }()
  60. select {
  61. case err := <-errChan:
  62. c.Assert(err, check.IsNil)
  63. case <-time.After(30 * time.Second):
  64. c.Fatal("Timeout waiting for container to die on OOM")
  65. }
  66. out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomFalse", fmt.Sprintf("--until=%d", daemonTime(c).Unix()))
  67. events := strings.Split(strings.TrimSuffix(out, "\n"), "\n")
  68. if len(events) < 5 {
  69. c.Fatalf("Missing expected event")
  70. }
  71. createEvent := strings.Fields(events[len(events)-5])
  72. attachEvent := strings.Fields(events[len(events)-4])
  73. startEvent := strings.Fields(events[len(events)-3])
  74. oomEvent := strings.Fields(events[len(events)-2])
  75. dieEvent := strings.Fields(events[len(events)-1])
  76. if createEvent[len(createEvent)-1] != "create" {
  77. c.Fatalf("event should be create, not %#v", createEvent)
  78. }
  79. if attachEvent[len(attachEvent)-1] != "attach" {
  80. c.Fatalf("event should be attach, not %#v", attachEvent)
  81. }
  82. if startEvent[len(startEvent)-1] != "start" {
  83. c.Fatalf("event should be start, not %#v", startEvent)
  84. }
  85. if oomEvent[len(oomEvent)-1] != "oom" {
  86. c.Fatalf("event should be oom, not %#v", oomEvent)
  87. }
  88. if dieEvent[len(dieEvent)-1] != "die" {
  89. c.Fatalf("event should be die, not %#v", dieEvent)
  90. }
  91. }
  92. func (s *DockerSuite) TestEventsOOMDisableTrue(c *check.C) {
  93. testRequires(c, DaemonIsLinux)
  94. testRequires(c, NativeExecDriver)
  95. testRequires(c, oomControl)
  96. errChan := make(chan error)
  97. go func() {
  98. defer close(errChan)
  99. 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")
  100. if expected := 137; exitCode != expected {
  101. errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out)
  102. }
  103. }()
  104. select {
  105. case err := <-errChan:
  106. c.Assert(err, check.IsNil)
  107. case <-time.After(20 * time.Second):
  108. defer dockerCmd(c, "kill", "oomTrue")
  109. out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomTrue", fmt.Sprintf("--until=%d", daemonTime(c).Unix()))
  110. events := strings.Split(strings.TrimSuffix(out, "\n"), "\n")
  111. if len(events) < 4 {
  112. c.Fatalf("Missing expected event")
  113. }
  114. createEvent := strings.Fields(events[len(events)-4])
  115. attachEvent := strings.Fields(events[len(events)-3])
  116. startEvent := strings.Fields(events[len(events)-2])
  117. oomEvent := strings.Fields(events[len(events)-1])
  118. if createEvent[len(createEvent)-1] != "create" {
  119. c.Fatalf("event should be create, not %#v", createEvent)
  120. }
  121. if attachEvent[len(attachEvent)-1] != "attach" {
  122. c.Fatalf("event should be attach, not %#v", attachEvent)
  123. }
  124. if startEvent[len(startEvent)-1] != "start" {
  125. c.Fatalf("event should be start, not %#v", startEvent)
  126. }
  127. if oomEvent[len(oomEvent)-1] != "oom" {
  128. c.Fatalf("event should be oom, not %#v", oomEvent)
  129. }
  130. out, _ = dockerCmd(c, "inspect", "-f", "{{.State.Status}}", "oomTrue")
  131. if strings.TrimSpace(out) != "running" {
  132. c.Fatalf("container should be still running, not %v", out)
  133. }
  134. }
  135. }