server_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. package docker
  2. import (
  3. "github.com/dotcloud/docker"
  4. "strings"
  5. "testing"
  6. )
  7. func TestImageTagImageDelete(t *testing.T) {
  8. eng := NewTestEngine(t)
  9. defer mkRuntimeFromEngine(eng, t).Nuke()
  10. srv := mkServerFromEngine(eng, t)
  11. initialImages := getAllImages(eng, t)
  12. if err := eng.Job("tag", unitTestImageName, "utest", "tag1").Run(); err != nil {
  13. t.Fatal(err)
  14. }
  15. if err := eng.Job("tag", unitTestImageName, "utest/docker", "tag2").Run(); err != nil {
  16. t.Fatal(err)
  17. }
  18. if err := eng.Job("tag", unitTestImageName, "utest:5000/docker", "tag3").Run(); err != nil {
  19. t.Fatal(err)
  20. }
  21. images := getAllImages(eng, t)
  22. nExpected := len(initialImages.Data[0].GetList("RepoTags")) + 3
  23. nActual := len(images.Data[0].GetList("RepoTags"))
  24. if nExpected != nActual {
  25. t.Errorf("Expected %d images, %d found", nExpected, nActual)
  26. }
  27. if _, err := srv.ImageDelete("utest/docker:tag2", true); err != nil {
  28. t.Fatal(err)
  29. }
  30. images = getAllImages(eng, t)
  31. nExpected = len(initialImages.Data[0].GetList("RepoTags")) + 2
  32. nActual = len(images.Data[0].GetList("RepoTags"))
  33. if nExpected != nActual {
  34. t.Errorf("Expected %d images, %d found", nExpected, nActual)
  35. }
  36. if _, err := srv.ImageDelete("utest:5000/docker:tag3", true); err != nil {
  37. t.Fatal(err)
  38. }
  39. images = getAllImages(eng, t)
  40. nExpected = len(initialImages.Data[0].GetList("RepoTags")) + 1
  41. nActual = len(images.Data[0].GetList("RepoTags"))
  42. if _, err := srv.ImageDelete("utest:tag1", true); err != nil {
  43. t.Fatal(err)
  44. }
  45. images = getAllImages(eng, t)
  46. if images.Len() != initialImages.Len() {
  47. t.Errorf("Expected %d image, %d found", initialImages.Len(), images.Len())
  48. }
  49. }
  50. func TestCreateRm(t *testing.T) {
  51. eng := NewTestEngine(t)
  52. srv := mkServerFromEngine(eng, t)
  53. defer mkRuntimeFromEngine(eng, t).Nuke()
  54. config, _, _, err := docker.ParseRun([]string{unitTestImageID, "echo test"}, nil)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. id := createTestContainer(eng, config, t)
  59. if c := srv.Containers(true, false, -1, "", ""); len(c) != 1 {
  60. t.Errorf("Expected 1 container, %v found", len(c))
  61. }
  62. job := eng.Job("container_delete", id)
  63. job.SetenvBool("removeVolume", true)
  64. if err := job.Run(); err != nil {
  65. t.Fatal(err)
  66. }
  67. if c := srv.Containers(true, false, -1, "", ""); len(c) != 0 {
  68. t.Errorf("Expected 0 container, %v found", len(c))
  69. }
  70. }
  71. func TestCreateRmVolumes(t *testing.T) {
  72. eng := NewTestEngine(t)
  73. srv := mkServerFromEngine(eng, t)
  74. defer mkRuntimeFromEngine(eng, t).Nuke()
  75. config, hostConfig, _, err := docker.ParseRun([]string{"-v", "/srv", unitTestImageID, "echo", "test"}, nil)
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. id := createTestContainer(eng, config, t)
  80. if c := srv.Containers(true, false, -1, "", ""); len(c) != 1 {
  81. t.Errorf("Expected 1 container, %v found", len(c))
  82. }
  83. job := eng.Job("start", id)
  84. if err := job.ImportEnv(hostConfig); err != nil {
  85. t.Fatal(err)
  86. }
  87. if err := job.Run(); err != nil {
  88. t.Fatal(err)
  89. }
  90. job = eng.Job("stop", id)
  91. job.SetenvInt("t", 1)
  92. if err := job.Run(); err != nil {
  93. t.Fatal(err)
  94. }
  95. job = eng.Job("container_delete", id)
  96. job.SetenvBool("removeVolume", true)
  97. if err := job.Run(); err != nil {
  98. t.Fatal(err)
  99. }
  100. if c := srv.Containers(true, false, -1, "", ""); len(c) != 0 {
  101. t.Errorf("Expected 0 container, %v found", len(c))
  102. }
  103. }
  104. func TestCommit(t *testing.T) {
  105. eng := NewTestEngine(t)
  106. defer mkRuntimeFromEngine(eng, t).Nuke()
  107. config, _, _, err := docker.ParseRun([]string{unitTestImageID, "/bin/cat"}, nil)
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. id := createTestContainer(eng, config, t)
  112. job := eng.Job("commit", id)
  113. job.Setenv("repo", "testrepo")
  114. job.Setenv("tag", "testtag")
  115. job.SetenvJson("config", config)
  116. if err := job.Run(); err != nil {
  117. t.Fatal(err)
  118. }
  119. }
  120. func TestCreateStartRestartStopStartKillRm(t *testing.T) {
  121. eng := NewTestEngine(t)
  122. srv := mkServerFromEngine(eng, t)
  123. defer mkRuntimeFromEngine(eng, t).Nuke()
  124. config, hostConfig, _, err := docker.ParseRun([]string{"-i", unitTestImageID, "/bin/cat"}, nil)
  125. if err != nil {
  126. t.Fatal(err)
  127. }
  128. id := createTestContainer(eng, config, t)
  129. if c := srv.Containers(true, false, -1, "", ""); len(c) != 1 {
  130. t.Errorf("Expected 1 container, %v found", len(c))
  131. }
  132. job := eng.Job("start", id)
  133. if err := job.ImportEnv(hostConfig); err != nil {
  134. t.Fatal(err)
  135. }
  136. if err := job.Run(); err != nil {
  137. t.Fatal(err)
  138. }
  139. job = eng.Job("restart", id)
  140. job.SetenvInt("t", 15)
  141. if err := job.Run(); err != nil {
  142. t.Fatal(err)
  143. }
  144. job = eng.Job("stop", id)
  145. job.SetenvInt("t", 15)
  146. if err := job.Run(); err != nil {
  147. t.Fatal(err)
  148. }
  149. job = eng.Job("start", id)
  150. if err := job.ImportEnv(hostConfig); err != nil {
  151. t.Fatal(err)
  152. }
  153. if err := job.Run(); err != nil {
  154. t.Fatal(err)
  155. }
  156. if err := eng.Job("kill", id).Run(); err != nil {
  157. t.Fatal(err)
  158. }
  159. // FIXME: this failed once with a race condition ("Unable to remove filesystem for xxx: directory not empty")
  160. job = eng.Job("container_delete", id)
  161. job.SetenvBool("removeVolume", true)
  162. if err := job.Run(); err != nil {
  163. t.Fatal(err)
  164. }
  165. if c := srv.Containers(true, false, -1, "", ""); len(c) != 0 {
  166. t.Errorf("Expected 0 container, %v found", len(c))
  167. }
  168. }
  169. func TestRunWithTooLowMemoryLimit(t *testing.T) {
  170. eng := NewTestEngine(t)
  171. defer mkRuntimeFromEngine(eng, t).Nuke()
  172. // Try to create a container with a memory limit of 1 byte less than the minimum allowed limit.
  173. job := eng.Job("create")
  174. job.Setenv("Image", unitTestImageID)
  175. job.Setenv("Memory", "524287")
  176. job.Setenv("CpuShares", "1000")
  177. job.SetenvList("Cmd", []string{"/bin/cat"})
  178. var id string
  179. job.Stdout.AddString(&id)
  180. if err := job.Run(); err == nil {
  181. t.Errorf("Memory limit is smaller than the allowed limit. Container creation should've failed!")
  182. }
  183. }
  184. func TestRmi(t *testing.T) {
  185. eng := NewTestEngine(t)
  186. srv := mkServerFromEngine(eng, t)
  187. defer mkRuntimeFromEngine(eng, t).Nuke()
  188. initialImages := getAllImages(eng, t)
  189. config, hostConfig, _, err := docker.ParseRun([]string{unitTestImageID, "echo", "test"}, nil)
  190. if err != nil {
  191. t.Fatal(err)
  192. }
  193. containerID := createTestContainer(eng, config, t)
  194. //To remove
  195. job := eng.Job("start", containerID)
  196. if err := job.ImportEnv(hostConfig); err != nil {
  197. t.Fatal(err)
  198. }
  199. if err := job.Run(); err != nil {
  200. t.Fatal(err)
  201. }
  202. if err := eng.Job("wait", containerID).Run(); err != nil {
  203. t.Fatal(err)
  204. }
  205. job = eng.Job("commit", containerID)
  206. job.Setenv("repo", "test")
  207. var imageID string
  208. job.Stdout.AddString(&imageID)
  209. if err := job.Run(); err != nil {
  210. t.Fatal(err)
  211. }
  212. if err := eng.Job("tag", imageID, "test", "0.1").Run(); err != nil {
  213. t.Fatal(err)
  214. }
  215. containerID = createTestContainer(eng, config, t)
  216. //To remove
  217. job = eng.Job("start", containerID)
  218. if err := job.ImportEnv(hostConfig); err != nil {
  219. t.Fatal(err)
  220. }
  221. if err := job.Run(); err != nil {
  222. t.Fatal(err)
  223. }
  224. if err := eng.Job("wait", containerID).Run(); err != nil {
  225. t.Fatal(err)
  226. }
  227. job = eng.Job("commit", containerID)
  228. job.Setenv("repo", "test")
  229. if err := job.Run(); err != nil {
  230. t.Fatal(err)
  231. }
  232. images := getAllImages(eng, t)
  233. if images.Len()-initialImages.Len() != 2 {
  234. t.Fatalf("Expected 2 new images, found %d.", images.Len()-initialImages.Len())
  235. }
  236. _, err = srv.ImageDelete(imageID, true)
  237. if err != nil {
  238. t.Fatal(err)
  239. }
  240. images = getAllImages(eng, t)
  241. if images.Len()-initialImages.Len() != 1 {
  242. t.Fatalf("Expected 1 new image, found %d.", images.Len()-initialImages.Len())
  243. }
  244. for _, image := range images.Data {
  245. if strings.Contains(unitTestImageID, image.Get("ID")) {
  246. continue
  247. }
  248. if image.GetList("RepoTags")[0] == "<none>:<none>" {
  249. t.Fatalf("Expected tagged image, got untagged one.")
  250. }
  251. }
  252. }
  253. func TestImagesFilter(t *testing.T) {
  254. eng := NewTestEngine(t)
  255. defer nuke(mkRuntimeFromEngine(eng, t))
  256. if err := eng.Job("tag", unitTestImageName, "utest", "tag1").Run(); err != nil {
  257. t.Fatal(err)
  258. }
  259. if err := eng.Job("tag", unitTestImageName, "utest/docker", "tag2").Run(); err != nil {
  260. t.Fatal(err)
  261. }
  262. if err := eng.Job("tag", unitTestImageName, "utest:5000/docker", "tag3").Run(); err != nil {
  263. t.Fatal(err)
  264. }
  265. images := getImages(eng, t, false, "utest*/*")
  266. if len(images.Data[0].GetList("RepoTags")) != 2 {
  267. t.Fatal("incorrect number of matches returned")
  268. }
  269. images = getImages(eng, t, false, "utest")
  270. if len(images.Data[0].GetList("RepoTags")) != 1 {
  271. t.Fatal("incorrect number of matches returned")
  272. }
  273. images = getImages(eng, t, false, "utest*")
  274. if len(images.Data[0].GetList("RepoTags")) != 1 {
  275. t.Fatal("incorrect number of matches returned")
  276. }
  277. images = getImages(eng, t, false, "*5000*/*")
  278. if len(images.Data[0].GetList("RepoTags")) != 1 {
  279. t.Fatal("incorrect number of matches returned")
  280. }
  281. }
  282. func TestImageInsert(t *testing.T) {
  283. eng := NewTestEngine(t)
  284. defer mkRuntimeFromEngine(eng, t).Nuke()
  285. srv := mkServerFromEngine(eng, t)
  286. // bad image name fails
  287. if err := srv.Eng.Job("insert", "foo", "https://www.docker.io/static/img/docker-top-logo.png", "/foo").Run(); err == nil {
  288. t.Fatal("expected an error and got none")
  289. }
  290. // bad url fails
  291. if err := srv.Eng.Job("insert", unitTestImageID, "http://bad_host_name_that_will_totally_fail.com/", "/foo").Run(); err == nil {
  292. t.Fatal("expected an error and got none")
  293. }
  294. // success returns nil
  295. if err := srv.Eng.Job("insert", unitTestImageID, "https://www.docker.io/static/img/docker-top-logo.png", "/foo").Run(); err != nil {
  296. t.Fatalf("expected no error, but got %v", err)
  297. }
  298. }
  299. // Regression test for being able to untag an image with an existing
  300. // container
  301. func TestDeleteTagWithExistingContainers(t *testing.T) {
  302. eng := NewTestEngine(t)
  303. defer nuke(mkRuntimeFromEngine(eng, t))
  304. srv := mkServerFromEngine(eng, t)
  305. // Tag the image
  306. if err := eng.Job("tag", unitTestImageID, "utest", "tag1").Run(); err != nil {
  307. t.Fatal(err)
  308. }
  309. // Create a container from the image
  310. config, _, _, err := docker.ParseRun([]string{unitTestImageID, "echo test"}, nil)
  311. if err != nil {
  312. t.Fatal(err)
  313. }
  314. id := createNamedTestContainer(eng, config, t, "testingtags")
  315. if id == "" {
  316. t.Fatal("No id returned")
  317. }
  318. containers := srv.Containers(true, false, -1, "", "")
  319. if len(containers) != 1 {
  320. t.Fatalf("Expected 1 container got %d", len(containers))
  321. }
  322. // Try to remove the tag
  323. imgs, err := srv.ImageDelete("utest:tag1", true)
  324. if err != nil {
  325. t.Fatal(err)
  326. }
  327. if len(imgs) != 1 {
  328. t.Fatalf("Should only have deleted one untag %d", len(imgs))
  329. }
  330. untag := imgs[0]
  331. if untag.Untagged != unitTestImageID {
  332. t.Fatalf("Expected %s got %s", unitTestImageID, untag.Untagged)
  333. }
  334. }