docker_api_images_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. defer deleteImages(name, name2, name3)
  28. for _, n := range []string{name, name2, name3} {
  29. if out, err := exec.Command(dockerBinary, "tag", "busybox", n).CombinedOutput(); err != nil {
  30. c.Fatal(err, out)
  31. }
  32. }
  33. type image struct{ RepoTags []string }
  34. getImages := func(filter string) []image {
  35. v := url.Values{}
  36. v.Set("filter", filter)
  37. status, b, err := sockRequest("GET", "/images/json?"+v.Encode(), nil)
  38. c.Assert(status, check.Equals, http.StatusOK)
  39. c.Assert(err, check.IsNil)
  40. var images []image
  41. if err := json.Unmarshal(b, &images); err != nil {
  42. c.Fatal(err)
  43. }
  44. return images
  45. }
  46. errMsg := "incorrect number of matches returned"
  47. if images := getImages("utest*/*"); len(images[0].RepoTags) != 2 {
  48. c.Fatal(errMsg)
  49. }
  50. if images := getImages("utest"); len(images[0].RepoTags) != 1 {
  51. c.Fatal(errMsg)
  52. }
  53. if images := getImages("utest*"); len(images[0].RepoTags) != 1 {
  54. c.Fatal(errMsg)
  55. }
  56. if images := getImages("*5000*/*"); len(images[0].RepoTags) != 1 {
  57. c.Fatal(errMsg)
  58. }
  59. }
  60. func (s *DockerSuite) TestApiImagesSaveAndLoad(c *check.C) {
  61. testRequires(c, Network)
  62. out, err := buildImage("saveandload", "FROM hello-world\nENV FOO bar", false)
  63. if err != nil {
  64. c.Fatal(err)
  65. }
  66. id := strings.TrimSpace(out)
  67. defer deleteImages("saveandload")
  68. status, body, err := sockRequestRaw("GET", "/images/"+id+"/get", nil, "")
  69. c.Assert(status, check.Equals, http.StatusOK)
  70. c.Assert(err, check.IsNil)
  71. defer body.Close()
  72. if out, err := exec.Command(dockerBinary, "rmi", id).CombinedOutput(); err != nil {
  73. c.Fatal(err, out)
  74. }
  75. status, loadBody, err := sockRequestRaw("POST", "/images/load", body, "application/x-tar")
  76. c.Assert(status, check.Equals, http.StatusOK)
  77. c.Assert(err, check.IsNil)
  78. defer loadBody.Close()
  79. inspectOut, err := exec.Command(dockerBinary, "inspect", "--format='{{ .Id }}'", id).CombinedOutput()
  80. if err != nil {
  81. c.Fatal(err, inspectOut)
  82. }
  83. if strings.TrimSpace(string(inspectOut)) != id {
  84. c.Fatal("load did not work properly")
  85. }
  86. }