github.com/lazyboychen7/engine@v17.12.1-ce-rc2+incompatible/integration-cli/docker_api_images_test.go (about)

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