docker_api_images_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/url"
  6. "os/exec"
  7. "strings"
  8. "github.com/docker/docker/api/types"
  9. "github.com/go-check/check"
  10. )
  11. func (s *DockerSuite) TestLegacyImages(c *check.C) {
  12. status, body, err := sockRequest("GET", "/v1.6/images/json", nil)
  13. c.Assert(status, check.Equals, http.StatusOK)
  14. c.Assert(err, check.IsNil)
  15. images := []types.LegacyImage{}
  16. if err = json.Unmarshal(body, &images); err != nil {
  17. c.Fatalf("Error on unmarshal: %s", err)
  18. }
  19. if len(images) == 0 || images[0].Tag == "" || images[0].Repository == "" {
  20. c.Fatalf("Bad data: %q", images)
  21. }
  22. }
  23. func (s *DockerSuite) TestApiImagesFilter(c *check.C) {
  24. name := "utest:tag1"
  25. name2 := "utest/docker:tag2"
  26. name3 := "utest:5000/docker:tag3"
  27. for _, n := range []string{name, name2, name3} {
  28. if out, err := exec.Command(dockerBinary, "tag", "busybox", n).CombinedOutput(); err != nil {
  29. c.Fatal(err, out)
  30. }
  31. }
  32. type image types.Image
  33. getImages := func(filter string) []image {
  34. v := url.Values{}
  35. v.Set("filter", filter)
  36. status, b, err := sockRequest("GET", "/images/json?"+v.Encode(), nil)
  37. c.Assert(status, check.Equals, http.StatusOK)
  38. c.Assert(err, check.IsNil)
  39. var images []image
  40. if err := json.Unmarshal(b, &images); err != nil {
  41. c.Fatal(err)
  42. }
  43. return images
  44. }
  45. errMsg := "incorrect number of matches returned"
  46. if images := getImages("utest*/*"); len(images[0].RepoTags) != 2 {
  47. c.Fatal(errMsg)
  48. }
  49. if images := getImages("utest"); len(images[0].RepoTags) != 1 {
  50. c.Fatal(errMsg)
  51. }
  52. if images := getImages("utest*"); len(images[0].RepoTags) != 1 {
  53. c.Fatal(errMsg)
  54. }
  55. if images := getImages("*5000*/*"); len(images[0].RepoTags) != 1 {
  56. c.Fatal(errMsg)
  57. }
  58. }
  59. func (s *DockerSuite) TestApiImagesSaveAndLoad(c *check.C) {
  60. testRequires(c, Network)
  61. out, err := buildImage("saveandload", "FROM hello-world\nENV FOO bar", false)
  62. if err != nil {
  63. c.Fatal(err)
  64. }
  65. id := strings.TrimSpace(out)
  66. res, body, err := sockRequestRaw("GET", "/images/"+id+"/get", nil, "")
  67. c.Assert(err, check.IsNil)
  68. c.Assert(res.StatusCode, check.Equals, http.StatusOK)
  69. defer body.Close()
  70. if out, err := exec.Command(dockerBinary, "rmi", id).CombinedOutput(); err != nil {
  71. c.Fatal(err, out)
  72. }
  73. res, loadBody, err := sockRequestRaw("POST", "/images/load", body, "application/x-tar")
  74. c.Assert(err, check.IsNil)
  75. c.Assert(res.StatusCode, check.Equals, http.StatusOK)
  76. defer loadBody.Close()
  77. inspectOut, err := exec.Command(dockerBinary, "inspect", "--format='{{ .Id }}'", id).CombinedOutput()
  78. if err != nil {
  79. c.Fatal(err, inspectOut)
  80. }
  81. if strings.TrimSpace(string(inspectOut)) != id {
  82. c.Fatal("load did not work properly")
  83. }
  84. }
  85. func (s *DockerSuite) TestApiImagesDelete(c *check.C) {
  86. name := "test-api-images-delete"
  87. out, err := buildImage(name, "FROM hello-world\nENV FOO bar", false)
  88. if err != nil {
  89. c.Fatal(err)
  90. }
  91. defer deleteImages(name)
  92. id := strings.TrimSpace(out)
  93. if out, err := exec.Command(dockerBinary, "tag", name, "test:tag1").CombinedOutput(); err != nil {
  94. c.Fatal(err, out)
  95. }
  96. status, _, err := sockRequest("DELETE", "/images/"+id, nil)
  97. c.Assert(status, check.Equals, http.StatusConflict)
  98. c.Assert(err, check.IsNil)
  99. status, _, err = sockRequest("DELETE", "/images/test:tag1", nil)
  100. c.Assert(status, check.Equals, http.StatusOK)
  101. c.Assert(err, check.IsNil)
  102. }