docker_api_images_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package main
  2. import (
  3. "context"
  4. "net/http"
  5. "net/http/httptest"
  6. "runtime"
  7. "strconv"
  8. "strings"
  9. "github.com/docker/docker/api/types"
  10. "github.com/docker/docker/api/types/filters"
  11. "github.com/docker/docker/client"
  12. "github.com/docker/docker/integration-cli/checker"
  13. "github.com/docker/docker/integration-cli/cli"
  14. "github.com/docker/docker/integration-cli/cli/build"
  15. "github.com/docker/docker/internal/test/request"
  16. "github.com/docker/docker/pkg/parsers/kernel"
  17. "github.com/go-check/check"
  18. )
  19. func (s *DockerSuite) TestAPIImagesFilter(c *check.C) {
  20. cli, err := client.NewClientWithOpts(client.FromEnv)
  21. c.Assert(err, checker.IsNil)
  22. defer cli.Close()
  23. name := "utest:tag1"
  24. name2 := "utest/docker:tag2"
  25. name3 := "utest:5000/docker:tag3"
  26. for _, n := range []string{name, name2, name3} {
  27. dockerCmd(c, "tag", "busybox", n)
  28. }
  29. getImages := func(filter string) []types.ImageSummary {
  30. filters := filters.NewArgs()
  31. filters.Add("reference", filter)
  32. options := types.ImageListOptions{
  33. All: false,
  34. Filters: filters,
  35. }
  36. images, err := cli.ImageList(context.Background(), options)
  37. c.Assert(err, checker.IsNil)
  38. return images
  39. }
  40. //incorrect number of matches returned
  41. images := getImages("utest*/*")
  42. c.Assert(images[0].RepoTags, checker.HasLen, 2)
  43. images = getImages("utest")
  44. c.Assert(images[0].RepoTags, checker.HasLen, 1)
  45. images = getImages("utest*")
  46. c.Assert(images[0].RepoTags, checker.HasLen, 1)
  47. images = getImages("*5000*/*")
  48. c.Assert(images[0].RepoTags, checker.HasLen, 1)
  49. }
  50. func (s *DockerSuite) TestAPIImagesSaveAndLoad(c *check.C) {
  51. if runtime.GOOS == "windows" {
  52. v, err := kernel.GetKernelVersion()
  53. c.Assert(err, checker.IsNil)
  54. build, _ := strconv.Atoi(strings.Split(strings.SplitN(v.String(), " ", 3)[2][1:], ".")[0])
  55. if build == 16299 {
  56. c.Skip("Temporarily disabled on RS3 builds")
  57. }
  58. }
  59. testRequires(c, Network)
  60. buildImageSuccessfully(c, "saveandload", build.WithDockerfile("FROM busybox\nENV FOO bar"))
  61. id := getIDByName(c, "saveandload")
  62. res, body, err := request.Get("/images/" + id + "/get")
  63. c.Assert(err, checker.IsNil)
  64. defer body.Close()
  65. c.Assert(res.StatusCode, checker.Equals, http.StatusOK)
  66. dockerCmd(c, "rmi", id)
  67. res, loadBody, err := request.Post("/images/load", request.RawContent(body), request.ContentType("application/x-tar"))
  68. c.Assert(err, checker.IsNil)
  69. defer loadBody.Close()
  70. c.Assert(res.StatusCode, checker.Equals, http.StatusOK)
  71. inspectOut := cli.InspectCmd(c, id, cli.Format(".Id")).Combined()
  72. c.Assert(strings.TrimSpace(string(inspectOut)), checker.Equals, id, check.Commentf("load did not work properly"))
  73. }
  74. func (s *DockerSuite) TestAPIImagesDelete(c *check.C) {
  75. cli, err := client.NewClientWithOpts(client.FromEnv)
  76. c.Assert(err, checker.IsNil)
  77. defer cli.Close()
  78. if testEnv.OSType != "windows" {
  79. testRequires(c, Network)
  80. }
  81. name := "test-api-images-delete"
  82. buildImageSuccessfully(c, name, build.WithDockerfile("FROM busybox\nENV FOO bar"))
  83. id := getIDByName(c, name)
  84. dockerCmd(c, "tag", name, "test:tag1")
  85. _, err = cli.ImageRemove(context.Background(), id, types.ImageRemoveOptions{})
  86. c.Assert(err.Error(), checker.Contains, "unable to delete")
  87. _, err = cli.ImageRemove(context.Background(), "test:noexist", types.ImageRemoveOptions{})
  88. c.Assert(err.Error(), checker.Contains, "No such image")
  89. _, err = cli.ImageRemove(context.Background(), "test:tag1", types.ImageRemoveOptions{})
  90. c.Assert(err, checker.IsNil)
  91. }
  92. func (s *DockerSuite) TestAPIImagesHistory(c *check.C) {
  93. cli, err := client.NewClientWithOpts(client.FromEnv)
  94. c.Assert(err, checker.IsNil)
  95. defer cli.Close()
  96. if testEnv.OSType != "windows" {
  97. testRequires(c, Network)
  98. }
  99. name := "test-api-images-history"
  100. buildImageSuccessfully(c, name, build.WithDockerfile("FROM busybox\nENV FOO bar"))
  101. id := getIDByName(c, name)
  102. historydata, err := cli.ImageHistory(context.Background(), id)
  103. c.Assert(err, checker.IsNil)
  104. c.Assert(historydata, checker.Not(checker.HasLen), 0)
  105. var found bool
  106. for _, tag := range historydata[0].Tags {
  107. if tag == "test-api-images-history:latest" {
  108. found = true
  109. break
  110. }
  111. }
  112. c.Assert(found, checker.True)
  113. }
  114. func (s *DockerSuite) TestAPIImagesImportBadSrc(c *check.C) {
  115. if runtime.GOOS == "windows" {
  116. v, err := kernel.GetKernelVersion()
  117. c.Assert(err, checker.IsNil)
  118. build, _ := strconv.Atoi(strings.Split(strings.SplitN(v.String(), " ", 3)[2][1:], ".")[0])
  119. if build == 16299 {
  120. c.Skip("Temporarily disabled on RS3 builds")
  121. }
  122. }
  123. testRequires(c, Network, testEnv.IsLocalDaemon)
  124. server := httptest.NewServer(http.NewServeMux())
  125. defer server.Close()
  126. tt := []struct {
  127. statusExp int
  128. fromSrc string
  129. }{
  130. {http.StatusNotFound, server.URL + "/nofile.tar"},
  131. {http.StatusNotFound, strings.TrimPrefix(server.URL, "http://") + "/nofile.tar"},
  132. {http.StatusNotFound, strings.TrimPrefix(server.URL, "http://") + "%2Fdata%2Ffile.tar"},
  133. {http.StatusInternalServerError, "%2Fdata%2Ffile.tar"},
  134. }
  135. for _, te := range tt {
  136. res, _, err := request.Post(strings.Join([]string{"/images/create?fromSrc=", te.fromSrc}, ""), request.JSON)
  137. c.Assert(err, check.IsNil)
  138. c.Assert(res.StatusCode, checker.Equals, te.statusExp)
  139. c.Assert(res.Header.Get("Content-Type"), checker.Equals, "application/json")
  140. }
  141. }
  142. // #14846
  143. func (s *DockerSuite) TestAPIImagesSearchJSONContentType(c *check.C) {
  144. testRequires(c, Network)
  145. res, b, err := request.Get("/images/search?term=test", request.JSON)
  146. c.Assert(err, check.IsNil)
  147. b.Close()
  148. c.Assert(res.StatusCode, checker.Equals, http.StatusOK)
  149. c.Assert(res.Header.Get("Content-Type"), checker.Equals, "application/json")
  150. }
  151. // Test case for 30027: image size reported as -1 in v1.12 client against v1.13 daemon.
  152. // This test checks to make sure both v1.12 and v1.13 client against v1.13 daemon get correct `Size` after the fix.
  153. func (s *DockerSuite) TestAPIImagesSizeCompatibility(c *check.C) {
  154. apiclient := testEnv.APIClient()
  155. defer apiclient.Close()
  156. images, err := apiclient.ImageList(context.Background(), types.ImageListOptions{})
  157. c.Assert(err, checker.IsNil)
  158. c.Assert(len(images), checker.Not(checker.Equals), 0)
  159. for _, image := range images {
  160. c.Assert(image.Size, checker.Not(checker.Equals), int64(-1))
  161. }
  162. apiclient, err = client.NewClientWithOpts(client.FromEnv, client.WithVersion("v1.24"))
  163. c.Assert(err, checker.IsNil)
  164. defer apiclient.Close()
  165. v124Images, err := apiclient.ImageList(context.Background(), types.ImageListOptions{})
  166. c.Assert(err, checker.IsNil)
  167. c.Assert(len(v124Images), checker.Not(checker.Equals), 0)
  168. for _, image := range v124Images {
  169. c.Assert(image.Size, checker.Not(checker.Equals), int64(-1))
  170. }
  171. }