From be20dc15af0cb281bd6d11586cfcc96bd50d12ca Mon Sep 17 00:00:00 2001 From: Kenfe-Mickael Laventure Date: Wed, 11 Jan 2017 13:42:49 -0800 Subject: [PATCH 1/2] Fix ImageSummary.Size value The prune PR changed the meaning of the file to mean "space on disk only unique to this image", this PR revert this change. Signed-off-by: Kenfe-Mickael Laventure --- cli/command/formatter/image.go | 7 +++---- daemon/images.go | 5 +---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/cli/command/formatter/image.go b/cli/command/formatter/image.go index 594b2f3926..5c7de826f0 100644 --- a/cli/command/formatter/image.go +++ b/cli/command/formatter/image.go @@ -226,8 +226,7 @@ func (c *imageContext) CreatedAt() string { func (c *imageContext) Size() string { c.AddHeader(sizeHeader) - //NOTE: For backward compatibility we need to return VirtualSize - return units.HumanSizeWithPrecision(float64(c.i.VirtualSize), 3) + return units.HumanSizeWithPrecision(float64(c.i.Size), 3) } func (c *imageContext) Containers() string { @@ -253,8 +252,8 @@ func (c *imageContext) SharedSize() string { func (c *imageContext) UniqueSize() string { c.AddHeader(uniqueSizeHeader) - if c.i.Size == -1 { + if c.i.VirtualSize == -1 || c.i.SharedSize == -1 { return "N/A" } - return units.HumanSize(float64(c.i.Size)) + return units.HumanSize(float64(c.i.VirtualSize - c.i.SharedSize)) } diff --git a/daemon/images.go b/daemon/images.go index 25fad4ca00..01dbced164 100644 --- a/daemon/images.go +++ b/daemon/images.go @@ -210,7 +210,6 @@ func (daemon *Daemon) Images(imageFilters filters.Args, all bool, withExtraAttrs rootFS := *img.RootFS rootFS.DiffIDs = nil - newImage.Size = 0 newImage.SharedSize = 0 for _, id := range img.RootFS.DiffIDs { rootFS.Append(id) @@ -223,8 +222,6 @@ func (daemon *Daemon) Images(imageFilters filters.Args, all bool, withExtraAttrs if layerRefs[chid] > 1 { newImage.SharedSize += diffSize - } else { - newImage.Size += diffSize } } } @@ -323,7 +320,7 @@ func newImage(image *image.Image, virtualSize int64) *types.ImageSummary { newImage.ParentID = image.Parent.String() newImage.ID = image.ID().String() newImage.Created = image.Created.Unix() - newImage.Size = -1 + newImage.Size = virtualSize newImage.VirtualSize = virtualSize newImage.SharedSize = -1 newImage.Containers = -1 From d9451f1c8c8a584053ef06e0801df14e37d43cbd Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Thu, 12 Jan 2017 08:12:39 -0800 Subject: [PATCH 2/2] Add test for image size for v1.12 and v1.13 clients against v1.13 daemon This test checks to make sure both v1.12 and v1.13 client against v1.13 daemon get correct `Size` after the fix. This test is related to 30027. Signed-off-by: Yong Tang --- integration-cli/docker_api_images_test.go | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/integration-cli/docker_api_images_test.go b/integration-cli/docker_api_images_test.go index ff53f8e3ee..2908dae4a9 100644 --- a/integration-cli/docker_api_images_test.go +++ b/integration-cli/docker_api_images_test.go @@ -128,3 +128,39 @@ func (s *DockerSuite) TestAPIImagesSearchJSONContentType(c *check.C) { c.Assert(res.StatusCode, checker.Equals, http.StatusOK) c.Assert(res.Header.Get("Content-Type"), checker.Equals, "application/json") } + +// Test case for 30027: image size reported as -1 in v1.12 client against v1.13 daemon. +// This test checks to make sure both v1.12 and v1.13 client against v1.13 daemon get correct `Size` after the fix. +func (s *DockerSuite) TestAPIImagesSizeCompatibility(c *check.C) { + status, b, err := request.SockRequest("GET", "/images/json", nil, daemonHost()) + c.Assert(err, checker.IsNil) + c.Assert(status, checker.Equals, http.StatusOK) + var images []types.ImageSummary + err = json.Unmarshal(b, &images) + c.Assert(err, checker.IsNil) + c.Assert(len(images), checker.Not(checker.Equals), 0) + for _, image := range images { + c.Assert(image.Size, checker.Not(checker.Equals), int64(-1)) + } + + type v124Image struct { + ID string `json:"Id"` + ParentID string `json:"ParentId"` + RepoTags []string + RepoDigests []string + Created int64 + Size int64 + VirtualSize int64 + Labels map[string]string + } + status, b, err = request.SockRequest("GET", "/v1.24/images/json", nil, daemonHost()) + c.Assert(err, checker.IsNil) + c.Assert(status, checker.Equals, http.StatusOK) + var v124Images []v124Image + err = json.Unmarshal(b, &v124Images) + c.Assert(err, checker.IsNil) + c.Assert(len(v124Images), checker.Not(checker.Equals), 0) + for _, image := range v124Images { + c.Assert(image.Size, checker.Not(checker.Equals), int64(-1)) + } +}