فهرست منبع

Generate api/types:Image from the swagger spec

and rename it to a more appropriate name ImageSummary.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Daniel Nephin 8 سال پیش
والد
کامیت
b06c352783

+ 2 - 1
Makefile

@@ -143,4 +143,5 @@ swagger-gen:
 	docker run --rm -v $(PWD):/work -w /work quay.io/goswagger/swagger \
 	docker run --rm -v $(PWD):/work -w /work quay.io/goswagger/swagger \
 		generate model -m "types" -f api/swagger.yaml -t api/ --skip-validator \
 		generate model -m "types" -f api/swagger.yaml -t api/ --skip-validator \
 			-n Volume \
 			-n Volume \
-			-n Port
+			-n Port \
+			-n ImageSummary

+ 1 - 1
api/server/router/image/backend.go

@@ -25,7 +25,7 @@ type containerBackend interface {
 type imageBackend interface {
 type imageBackend interface {
 	ImageDelete(imageRef string, force, prune bool) ([]types.ImageDelete, error)
 	ImageDelete(imageRef string, force, prune bool) ([]types.ImageDelete, error)
 	ImageHistory(imageName string) ([]*types.ImageHistory, error)
 	ImageHistory(imageName string) ([]*types.ImageHistory, error)
-	Images(filterArgs string, filter string, all bool, withExtraAttrs bool) ([]*types.Image, error)
+	Images(filterArgs string, filter string, all bool, withExtraAttrs bool) ([]*types.ImageSummary, error)
 	LookupImage(name string) (*types.ImageInspect, error)
 	LookupImage(name string) (*types.ImageInspect, error)
 	TagImage(imageName, repository, tag string) error
 	TagImage(imageName, repository, tag string) error
 	ImagesPrune(config *types.ImagesPruneConfig) (*types.ImagesPruneReport, error)
 	ImagesPrune(config *types.ImagesPruneConfig) (*types.ImagesPruneReport, error)

+ 54 - 28
api/swagger.yaml

@@ -762,6 +762,58 @@ definitions:
               type: "string"
               type: "string"
           BaseLayer:
           BaseLayer:
             type: "string"
             type: "string"
+
+  ImageSummary:
+    type: "object"
+    required:
+      - Id
+      - ParentId
+      - RepoTags
+      - RepoDigests
+      - Created
+      - Size
+      - SharedSize
+      - VirtualSize
+      - Labels
+      - Containers
+    properties:
+      Id:
+        type: "string"
+        x-nullable: false
+      ParentId:
+        type: "string"
+        x-nullable: false
+      RepoTags:
+        type: "array"
+        x-nullable: false
+        items:
+          type: "string"
+      RepoDigests:
+        type: "array"
+        x-nullable: false
+        items:
+          type: "string"
+      Created:
+        type: "integer"
+        x-nullable: false
+      Size:
+        type: "integer"
+        x-nullable: false
+      SharedSize:
+        type: "integer"
+        x-nullable: false
+      VirtualSize:
+        type: "integer"
+        x-nullable: false
+      Labels:
+        type: "object"
+        x-nullable: false
+        additionalProperties:
+          type: "string"
+      Containers:
+        x-nullable: false
+        type: "integer"
+
   AuthConfig:
   AuthConfig:
     type: "object"
     type: "object"
     properties:
     properties:
@@ -3829,37 +3881,11 @@ paths:
         - "application/json"
         - "application/json"
       responses:
       responses:
         200:
         200:
-          description: "no error"
+          description: "Summary image data for the images matching the query"
           schema:
           schema:
             type: "array"
             type: "array"
             items:
             items:
-              type: "object"
-              properties:
-                Id:
-                  type: "string"
-                ParentId:
-                  type: "string"
-                RepoTags:
-                  type: "array"
-                  items:
-                    type: "string"
-                RepoDigests:
-                  type: "array"
-                  items:
-                    type: "string"
-                Created:
-                  type: "integer"
-                  format: "int64"
-                Size:
-                  type: "integer"
-                  format: "int64"
-                VirtualSize:
-                  type: "integer"
-                  format: "int64"
-                Labels:
-                  type: "object"
-                  additionalProperties:
-                    type: "string"
+              $ref: "#/definitions/ImageSummary"
           examples:
           examples:
             application/json:
             application/json:
               - RepoTags:
               - RepoTags:

+ 49 - 0
api/types/image_summary.go

@@ -0,0 +1,49 @@
+package types
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+// ImageSummary image summary
+// swagger:model ImageSummary
+type ImageSummary struct {
+
+	// containers
+	// Required: true
+	Containers int64 `json:"Containers"`
+
+	// created
+	// Required: true
+	Created int64 `json:"Created"`
+
+	// Id
+	// Required: true
+	ID string `json:"Id"`
+
+	// labels
+	// Required: true
+	Labels map[string]string `json:"Labels"`
+
+	// parent Id
+	// Required: true
+	ParentID string `json:"ParentId"`
+
+	// repo digests
+	// Required: true
+	RepoDigests []string `json:"RepoDigests"`
+
+	// repo tags
+	// Required: true
+	RepoTags []string `json:"RepoTags"`
+
+	// shared size
+	// Required: true
+	SharedSize int64 `json:"SharedSize"`
+
+	// size
+	// Required: true
+	Size int64 `json:"Size"`
+
+	// virtual size
+	// Required: true
+	VirtualSize int64 `json:"VirtualSize"`
+}

+ 1 - 16
api/types/types.go

@@ -86,21 +86,6 @@ type ImageDelete struct {
 	Deleted  string `json:",omitempty"`
 	Deleted  string `json:",omitempty"`
 }
 }
 
 
-// Image contains response of Remote API:
-// GET "/images/json"
-type Image struct {
-	ID          string `json:"Id"`
-	ParentID    string `json:"ParentId"`
-	RepoTags    []string
-	RepoDigests []string
-	Created     int64
-	Size        int64
-	SharedSize  int64
-	VirtualSize int64
-	Labels      map[string]string
-	Containers  int64
-}
-
 // GraphDriverData returns Image's graph driver config info
 // GraphDriverData returns Image's graph driver config info
 // when calling inspect command
 // when calling inspect command
 type GraphDriverData struct {
 type GraphDriverData struct {
@@ -516,7 +501,7 @@ type Runtime struct {
 // GET "/system/df"
 // GET "/system/df"
 type DiskUsage struct {
 type DiskUsage struct {
 	LayersSize int64
 	LayersSize int64
-	Images     []*Image
+	Images     []*ImageSummary
 	Containers []*Container
 	Containers []*Container
 	Volumes    []*Volume
 	Volumes    []*Volume
 }
 }

+ 2 - 2
cli/command/formatter/disk_usage.go

@@ -31,7 +31,7 @@ type DiskUsageContext struct {
 	Context
 	Context
 	Verbose    bool
 	Verbose    bool
 	LayersSize int64
 	LayersSize int64
-	Images     []*types.Image
+	Images     []*types.ImageSummary
 	Containers []*types.Container
 	Containers []*types.Container
 	Volumes    []*types.Volume
 	Volumes    []*types.Volume
 }
 }
@@ -155,7 +155,7 @@ func (ctx *DiskUsageContext) Write() {
 type diskUsageImagesContext struct {
 type diskUsageImagesContext struct {
 	HeaderContext
 	HeaderContext
 	totalSize int64
 	totalSize int64
-	images    []*types.Image
+	images    []*types.ImageSummary
 }
 }
 
 
 func (c *diskUsageImagesContext) Type() string {
 func (c *diskUsageImagesContext) Type() string {

+ 4 - 4
cli/command/formatter/image.go

@@ -26,7 +26,7 @@ type ImageContext struct {
 	Digest bool
 	Digest bool
 }
 }
 
 
-func isDangling(image types.Image) bool {
+func isDangling(image types.ImageSummary) bool {
 	return len(image.RepoTags) == 1 && image.RepoTags[0] == "<none>:<none>" && len(image.RepoDigests) == 1 && image.RepoDigests[0] == "<none>@<none>"
 	return len(image.RepoTags) == 1 && image.RepoTags[0] == "<none>:<none>" && len(image.RepoDigests) == 1 && image.RepoDigests[0] == "<none>@<none>"
 }
 }
 
 
@@ -72,14 +72,14 @@ virtual_size: {{.Size}}
 }
 }
 
 
 // ImageWrite writes the formatter images using the ImageContext
 // ImageWrite writes the formatter images using the ImageContext
-func ImageWrite(ctx ImageContext, images []types.Image) error {
+func ImageWrite(ctx ImageContext, images []types.ImageSummary) error {
 	render := func(format func(subContext subContext) error) error {
 	render := func(format func(subContext subContext) error) error {
 		return imageFormat(ctx, images, format)
 		return imageFormat(ctx, images, format)
 	}
 	}
 	return ctx.Write(&imageContext{}, render)
 	return ctx.Write(&imageContext{}, render)
 }
 }
 
 
-func imageFormat(ctx ImageContext, images []types.Image, format func(subContext subContext) error) error {
+func imageFormat(ctx ImageContext, images []types.ImageSummary, format func(subContext subContext) error) error {
 	for _, image := range images {
 	for _, image := range images {
 		images := []*imageContext{}
 		images := []*imageContext{}
 		if isDangling(image) {
 		if isDangling(image) {
@@ -184,7 +184,7 @@ func imageFormat(ctx ImageContext, images []types.Image, format func(subContext
 type imageContext struct {
 type imageContext struct {
 	HeaderContext
 	HeaderContext
 	trunc  bool
 	trunc  bool
-	i      types.Image
+	i      types.ImageSummary
 	repo   string
 	repo   string
 	tag    string
 	tag    string
 	digest string
 	digest string

+ 10 - 10
cli/command/formatter/image_test.go

@@ -24,36 +24,36 @@ func TestImageContext(t *testing.T) {
 		call      func() string
 		call      func() string
 	}{
 	}{
 		{imageContext{
 		{imageContext{
-			i:     types.Image{ID: imageID},
+			i:     types.ImageSummary{ID: imageID},
 			trunc: true,
 			trunc: true,
 		}, stringid.TruncateID(imageID), imageIDHeader, ctx.ID},
 		}, stringid.TruncateID(imageID), imageIDHeader, ctx.ID},
 		{imageContext{
 		{imageContext{
-			i:     types.Image{ID: imageID},
+			i:     types.ImageSummary{ID: imageID},
 			trunc: false,
 			trunc: false,
 		}, imageID, imageIDHeader, ctx.ID},
 		}, imageID, imageIDHeader, ctx.ID},
 		{imageContext{
 		{imageContext{
-			i:     types.Image{Size: 10, VirtualSize: 10},
+			i:     types.ImageSummary{Size: 10, VirtualSize: 10},
 			trunc: true,
 			trunc: true,
 		}, "10 B", sizeHeader, ctx.Size},
 		}, "10 B", sizeHeader, ctx.Size},
 		{imageContext{
 		{imageContext{
-			i:     types.Image{Created: unix},
+			i:     types.ImageSummary{Created: unix},
 			trunc: true,
 			trunc: true,
 		}, time.Unix(unix, 0).String(), createdAtHeader, ctx.CreatedAt},
 		}, time.Unix(unix, 0).String(), createdAtHeader, ctx.CreatedAt},
 		// FIXME
 		// FIXME
 		// {imageContext{
 		// {imageContext{
-		// 	i:     types.Image{Created: unix},
+		// 	i:     types.ImageSummary{Created: unix},
 		// 	trunc: true,
 		// 	trunc: true,
 		// }, units.HumanDuration(time.Unix(unix, 0)), createdSinceHeader, ctx.CreatedSince},
 		// }, units.HumanDuration(time.Unix(unix, 0)), createdSinceHeader, ctx.CreatedSince},
 		{imageContext{
 		{imageContext{
-			i:    types.Image{},
+			i:    types.ImageSummary{},
 			repo: "busybox",
 			repo: "busybox",
 		}, "busybox", repositoryHeader, ctx.Repository},
 		}, "busybox", repositoryHeader, ctx.Repository},
 		{imageContext{
 		{imageContext{
-			i:   types.Image{},
+			i:   types.ImageSummary{},
 			tag: "latest",
 			tag: "latest",
 		}, "latest", tagHeader, ctx.Tag},
 		}, "latest", tagHeader, ctx.Tag},
 		{imageContext{
 		{imageContext{
-			i:      types.Image{},
+			i:      types.ImageSummary{},
 			digest: "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a",
 			digest: "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a",
 		}, "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a", digestHeader, ctx.Digest},
 		}, "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a", digestHeader, ctx.Digest},
 	}
 	}
@@ -262,7 +262,7 @@ image_id: imageID3
 	}
 	}
 
 
 	for _, testcase := range cases {
 	for _, testcase := range cases {
-		images := []types.Image{
+		images := []types.ImageSummary{
 			{ID: "imageID1", RepoTags: []string{"image:tag1"}, RepoDigests: []string{"image@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"}, Created: unixTime},
 			{ID: "imageID1", RepoTags: []string{"image:tag1"}, RepoDigests: []string{"image@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"}, Created: unixTime},
 			{ID: "imageID2", RepoTags: []string{"image:tag2"}, Created: unixTime},
 			{ID: "imageID2", RepoTags: []string{"image:tag2"}, Created: unixTime},
 			{ID: "imageID3", RepoTags: []string{"<none>:<none>"}, RepoDigests: []string{"<none>@<none>"}, Created: unixTime},
 			{ID: "imageID3", RepoTags: []string{"<none>:<none>"}, RepoDigests: []string{"<none>@<none>"}, Created: unixTime},
@@ -280,7 +280,7 @@ image_id: imageID3
 
 
 func TestImageContextWriteWithNoImage(t *testing.T) {
 func TestImageContextWriteWithNoImage(t *testing.T) {
 	out := bytes.NewBufferString("")
 	out := bytes.NewBufferString("")
-	images := []types.Image{}
+	images := []types.ImageSummary{}
 
 
 	contexts := []struct {
 	contexts := []struct {
 		context  ImageContext
 		context  ImageContext

+ 2 - 2
client/image_list.go

@@ -10,8 +10,8 @@ import (
 )
 )
 
 
 // ImageList returns a list of images in the docker host.
 // ImageList returns a list of images in the docker host.
-func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions) ([]types.Image, error) {
-	var images []types.Image
+func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error) {
+	var images []types.ImageSummary
 	query := url.Values{}
 	query := url.Values{}
 
 
 	if options.Filters.Len() > 0 {
 	if options.Filters.Len() > 0 {

+ 1 - 1
client/image_list_test.go

@@ -93,7 +93,7 @@ func TestImageList(t *testing.T) {
 						return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
 						return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
 					}
 					}
 				}
 				}
-				content, err := json.Marshal([]types.Image{
+				content, err := json.Marshal([]types.ImageSummary{
 					{
 					{
 						ID: "image_id2",
 						ID: "image_id2",
 					},
 					},

+ 1 - 1
client/interface.go

@@ -71,7 +71,7 @@ type ImageAPIClient interface {
 	ImageHistory(ctx context.Context, image string) ([]types.ImageHistory, error)
 	ImageHistory(ctx context.Context, image string) ([]types.ImageHistory, error)
 	ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error)
 	ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error)
 	ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error)
 	ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error)
-	ImageList(ctx context.Context, options types.ImageListOptions) ([]types.Image, error)
+	ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error)
 	ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error)
 	ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error)
 	ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error)
 	ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error)
 	ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error)
 	ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error)

+ 7 - 7
daemon/images.go

@@ -22,7 +22,7 @@ var acceptedImageFilterTags = map[string]bool{
 
 
 // byCreated is a temporary type used to sort a list of images by creation
 // byCreated is a temporary type used to sort a list of images by creation
 // time.
 // time.
-type byCreated []*types.Image
+type byCreated []*types.ImageSummary
 
 
 func (r byCreated) Len() int           { return len(r) }
 func (r byCreated) Len() int           { return len(r) }
 func (r byCreated) Swap(i, j int)      { r[i], r[j] = r[j], r[i] }
 func (r byCreated) Swap(i, j int)      { r[i], r[j] = r[j], r[i] }
@@ -38,7 +38,7 @@ func (daemon *Daemon) Map() map[image.ID]*image.Image {
 // filter is a shell glob string applied to repository names. The argument
 // filter is a shell glob string applied to repository names. The argument
 // named all controls whether all images in the graph are filtered, or just
 // named all controls whether all images in the graph are filtered, or just
 // the heads.
 // the heads.
-func (daemon *Daemon) Images(filterArgs, filter string, all bool, withExtraAttrs bool) ([]*types.Image, error) {
+func (daemon *Daemon) Images(filterArgs, filter string, all bool, withExtraAttrs bool) ([]*types.ImageSummary, error) {
 	var (
 	var (
 		allImages    map[image.ID]*image.Image
 		allImages    map[image.ID]*image.Image
 		err          error
 		err          error
@@ -83,8 +83,8 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool, withExtraAttrs
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	images := []*types.Image{}
-	var imagesMap map[*image.Image]*types.Image
+	images := []*types.ImageSummary{}
+	var imagesMap map[*image.Image]*types.ImageSummary
 	var layerRefs map[layer.ChainID]int
 	var layerRefs map[layer.ChainID]int
 	var allLayers map[layer.ChainID]layer.Layer
 	var allLayers map[layer.ChainID]layer.Layer
 	var allContainers []*container.Container
 	var allContainers []*container.Container
@@ -181,7 +181,7 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool, withExtraAttrs
 			if imagesMap == nil {
 			if imagesMap == nil {
 				allContainers = daemon.List()
 				allContainers = daemon.List()
 				allLayers = daemon.layerStore.Map()
 				allLayers = daemon.layerStore.Map()
-				imagesMap = make(map[*image.Image]*types.Image)
+				imagesMap = make(map[*image.Image]*types.ImageSummary)
 				layerRefs = make(map[layer.ChainID]int)
 				layerRefs = make(map[layer.ChainID]int)
 			}
 			}
 
 
@@ -241,8 +241,8 @@ func (daemon *Daemon) Images(filterArgs, filter string, all bool, withExtraAttrs
 	return images, nil
 	return images, nil
 }
 }
 
 
-func newImage(image *image.Image, virtualSize int64) *types.Image {
-	newImage := new(types.Image)
+func newImage(image *image.Image, virtualSize int64) *types.ImageSummary {
+	newImage := new(types.ImageSummary)
 	newImage.ParentID = image.Parent.String()
 	newImage.ParentID = image.Parent.String()
 	newImage.ID = image.ID().String()
 	newImage.ID = image.ID().String()
 	newImage.Created = image.Created.Unix()
 	newImage.Created = image.Created.Unix()

+ 1 - 1
integration-cli/docker_api_images_test.go

@@ -18,7 +18,7 @@ func (s *DockerSuite) TestAPIImagesFilter(c *check.C) {
 	for _, n := range []string{name, name2, name3} {
 	for _, n := range []string{name, name2, name3} {
 		dockerCmd(c, "tag", "busybox", n)
 		dockerCmd(c, "tag", "busybox", n)
 	}
 	}
-	type image types.Image
+	type image types.ImageSummary
 	getImages := func(filter string) []image {
 	getImages := func(filter string) []image {
 		v := url.Values{}
 		v := url.Values{}
 		v.Set("filter", filter)
 		v.Set("filter", filter)