server_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package docker
  2. import (
  3. "bytes"
  4. "testing"
  5. "time"
  6. "github.com/docker/docker/builder"
  7. "github.com/docker/docker/engine"
  8. )
  9. func TestCreateNumberHostname(t *testing.T) {
  10. eng := NewTestEngine(t)
  11. defer mkDaemonFromEngine(eng, t).Nuke()
  12. config, _, _, err := parseRun([]string{"-h", "web.0", unitTestImageID, "echo test"})
  13. if err != nil {
  14. t.Fatal(err)
  15. }
  16. createTestContainer(eng, config, t)
  17. }
  18. func TestCommit(t *testing.T) {
  19. eng := NewTestEngine(t)
  20. b := &builder.BuilderJob{Engine: eng}
  21. b.Install()
  22. defer mkDaemonFromEngine(eng, t).Nuke()
  23. config, _, _, err := parseRun([]string{unitTestImageID, "/bin/cat"})
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. id := createTestContainer(eng, config, t)
  28. job := eng.Job("commit", id)
  29. job.Setenv("repo", "testrepo")
  30. job.Setenv("tag", "testtag")
  31. job.SetenvJson("config", config)
  32. if err := job.Run(); err != nil {
  33. t.Fatal(err)
  34. }
  35. }
  36. func TestMergeConfigOnCommit(t *testing.T) {
  37. eng := NewTestEngine(t)
  38. b := &builder.BuilderJob{Engine: eng}
  39. b.Install()
  40. runtime := mkDaemonFromEngine(eng, t)
  41. defer runtime.Nuke()
  42. container1, _, _ := mkContainer(runtime, []string{"-e", "FOO=bar", unitTestImageID, "echo test > /tmp/foo"}, t)
  43. defer runtime.Rm(container1)
  44. config, _, _, err := parseRun([]string{container1.ID, "cat /tmp/foo"})
  45. if err != nil {
  46. t.Error(err)
  47. }
  48. job := eng.Job("commit", container1.ID)
  49. job.Setenv("repo", "testrepo")
  50. job.Setenv("tag", "testtag")
  51. job.SetenvJson("config", config)
  52. var outputBuffer = bytes.NewBuffer(nil)
  53. job.Stdout.Add(outputBuffer)
  54. if err := job.Run(); err != nil {
  55. t.Error(err)
  56. }
  57. container2, _, _ := mkContainer(runtime, []string{engine.Tail(outputBuffer, 1)}, t)
  58. defer runtime.Rm(container2)
  59. job = eng.Job("container_inspect", container1.Name)
  60. baseContainer, _ := job.Stdout.AddEnv()
  61. if err := job.Run(); err != nil {
  62. t.Error(err)
  63. }
  64. job = eng.Job("container_inspect", container2.Name)
  65. commitContainer, _ := job.Stdout.AddEnv()
  66. if err := job.Run(); err != nil {
  67. t.Error(err)
  68. }
  69. baseConfig := baseContainer.GetSubEnv("Config")
  70. commitConfig := commitContainer.GetSubEnv("Config")
  71. if commitConfig.Get("Env") != baseConfig.Get("Env") {
  72. t.Fatalf("Env config in committed container should be %v, was %v",
  73. baseConfig.Get("Env"), commitConfig.Get("Env"))
  74. }
  75. if baseConfig.Get("Cmd") != "[\"echo test \\u003e /tmp/foo\"]" {
  76. t.Fatalf("Cmd in base container should be [\"echo test \\u003e /tmp/foo\"], was %s",
  77. baseConfig.Get("Cmd"))
  78. }
  79. if commitConfig.Get("Cmd") != "[\"cat /tmp/foo\"]" {
  80. t.Fatalf("Cmd in committed container should be [\"cat /tmp/foo\"], was %s",
  81. commitConfig.Get("Cmd"))
  82. }
  83. }
  84. func TestRestartKillWait(t *testing.T) {
  85. eng := NewTestEngine(t)
  86. runtime := mkDaemonFromEngine(eng, t)
  87. defer runtime.Nuke()
  88. config, hostConfig, _, err := parseRun([]string{"-i", unitTestImageID, "/bin/cat"})
  89. if err != nil {
  90. t.Fatal(err)
  91. }
  92. id := createTestContainer(eng, config, t)
  93. job := eng.Job("containers")
  94. job.SetenvBool("all", true)
  95. outs, err := job.Stdout.AddListTable()
  96. if err != nil {
  97. t.Fatal(err)
  98. }
  99. if err := job.Run(); err != nil {
  100. t.Fatal(err)
  101. }
  102. if len(outs.Data) != 1 {
  103. t.Errorf("Expected 1 container, %v found", len(outs.Data))
  104. }
  105. job = eng.Job("start", id)
  106. if err := job.ImportEnv(hostConfig); err != nil {
  107. t.Fatal(err)
  108. }
  109. if err := job.Run(); err != nil {
  110. t.Fatal(err)
  111. }
  112. job = eng.Job("kill", id)
  113. if err := job.Run(); err != nil {
  114. t.Fatal(err)
  115. }
  116. eng = newTestEngine(t, false, runtime.Config().Root)
  117. job = eng.Job("containers")
  118. job.SetenvBool("all", true)
  119. outs, err = job.Stdout.AddListTable()
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. if err := job.Run(); err != nil {
  124. t.Fatal(err)
  125. }
  126. if len(outs.Data) != 1 {
  127. t.Errorf("Expected 1 container, %v found", len(outs.Data))
  128. }
  129. setTimeout(t, "Waiting on stopped container timedout", 5*time.Second, func() {
  130. job = eng.Job("wait", outs.Data[0].Get("Id"))
  131. if err := job.Run(); err != nil {
  132. t.Fatal(err)
  133. }
  134. })
  135. }
  136. func TestCreateStartRestartStopStartKillRm(t *testing.T) {
  137. eng := NewTestEngine(t)
  138. defer mkDaemonFromEngine(eng, t).Nuke()
  139. config, hostConfig, _, err := parseRun([]string{"-i", unitTestImageID, "/bin/cat"})
  140. if err != nil {
  141. t.Fatal(err)
  142. }
  143. id := createTestContainer(eng, config, t)
  144. job := eng.Job("containers")
  145. job.SetenvBool("all", true)
  146. outs, err := job.Stdout.AddListTable()
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. if err := job.Run(); err != nil {
  151. t.Fatal(err)
  152. }
  153. if len(outs.Data) != 1 {
  154. t.Errorf("Expected 1 container, %v found", len(outs.Data))
  155. }
  156. job = eng.Job("start", id)
  157. if err := job.ImportEnv(hostConfig); err != nil {
  158. t.Fatal(err)
  159. }
  160. if err := job.Run(); err != nil {
  161. t.Fatal(err)
  162. }
  163. job = eng.Job("restart", id)
  164. job.SetenvInt("t", 2)
  165. if err := job.Run(); err != nil {
  166. t.Fatal(err)
  167. }
  168. job = eng.Job("stop", id)
  169. job.SetenvInt("t", 2)
  170. if err := job.Run(); err != nil {
  171. t.Fatal(err)
  172. }
  173. job = eng.Job("start", id)
  174. if err := job.ImportEnv(hostConfig); err != nil {
  175. t.Fatal(err)
  176. }
  177. if err := job.Run(); err != nil {
  178. t.Fatal(err)
  179. }
  180. if err := eng.Job("kill", id).Run(); err != nil {
  181. t.Fatal(err)
  182. }
  183. // FIXME: this failed once with a race condition ("Unable to remove filesystem for xxx: directory not empty")
  184. job = eng.Job("rm", id)
  185. job.SetenvBool("removeVolume", true)
  186. if err := job.Run(); err != nil {
  187. t.Fatal(err)
  188. }
  189. job = eng.Job("containers")
  190. job.SetenvBool("all", true)
  191. outs, err = job.Stdout.AddListTable()
  192. if err != nil {
  193. t.Fatal(err)
  194. }
  195. if err := job.Run(); err != nil {
  196. t.Fatal(err)
  197. }
  198. if len(outs.Data) != 0 {
  199. t.Errorf("Expected 0 container, %v found", len(outs.Data))
  200. }
  201. }
  202. func TestRunWithTooLowMemoryLimit(t *testing.T) {
  203. eng := NewTestEngine(t)
  204. defer mkDaemonFromEngine(eng, t).Nuke()
  205. // Try to create a container with a memory limit of 1 byte less than the minimum allowed limit.
  206. job := eng.Job("create")
  207. job.Setenv("Image", unitTestImageID)
  208. job.Setenv("Memory", "524287")
  209. job.Setenv("CpuShares", "1000")
  210. job.SetenvList("Cmd", []string{"/bin/cat"})
  211. if err := job.Run(); err == nil {
  212. t.Errorf("Memory limit is smaller than the allowed limit. Container creation should've failed!")
  213. }
  214. }
  215. func TestImagesFilter(t *testing.T) {
  216. eng := NewTestEngine(t)
  217. defer nuke(mkDaemonFromEngine(eng, t))
  218. if err := eng.Job("tag", unitTestImageName, "utest", "tag1").Run(); err != nil {
  219. t.Fatal(err)
  220. }
  221. if err := eng.Job("tag", unitTestImageName, "utest/docker", "tag2").Run(); err != nil {
  222. t.Fatal(err)
  223. }
  224. if err := eng.Job("tag", unitTestImageName, "utest:5000/docker", "tag3").Run(); err != nil {
  225. t.Fatal(err)
  226. }
  227. images := getImages(eng, t, false, "utest*/*")
  228. if len(images.Data[0].GetList("RepoTags")) != 2 {
  229. t.Fatal("incorrect number of matches returned")
  230. }
  231. images = getImages(eng, t, false, "utest")
  232. if len(images.Data[0].GetList("RepoTags")) != 1 {
  233. t.Fatal("incorrect number of matches returned")
  234. }
  235. images = getImages(eng, t, false, "utest*")
  236. if len(images.Data[0].GetList("RepoTags")) != 1 {
  237. t.Fatal("incorrect number of matches returned")
  238. }
  239. images = getImages(eng, t, false, "*5000*/*")
  240. if len(images.Data[0].GetList("RepoTags")) != 1 {
  241. t.Fatal("incorrect number of matches returned")
  242. }
  243. }