Explorar o código

daemon/imageService: Remove TagImageWithReference

TagImage is just a wrapper for TagImageWithReference which parses the
repo and tag into a reference. Change TagImageWithReference into
TagImage and move the responsibility of reference parsing to caller.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski %!s(int64=2) %!d(string=hai) anos
pai
achega
1ca85e835c

+ 1 - 1
api/server/backend/build/backend.go

@@ -21,7 +21,7 @@ import (
 // ImageComponent provides an interface for working with images
 // ImageComponent provides an interface for working with images
 type ImageComponent interface {
 type ImageComponent interface {
 	SquashImage(from string, to string) (string, error)
 	SquashImage(from string, to string) (string, error)
-	TagImageWithReference(context.Context, image.ID, reference.Named) error
+	TagImage(context.Context, image.ID, reference.Named) error
 }
 }
 
 
 // Builder defines interface for running a build
 // Builder defines interface for running a build

+ 1 - 1
api/server/backend/build/tag.go

@@ -13,7 +13,7 @@ import (
 // tagImages creates image tags for the imageID.
 // tagImages creates image tags for the imageID.
 func tagImages(ctx context.Context, ic ImageComponent, stdout io.Writer, imageID image.ID, repoAndTags []reference.Named) error {
 func tagImages(ctx context.Context, ic ImageComponent, stdout io.Writer, imageID image.ID, repoAndTags []reference.Named) error {
 	for _, rt := range repoAndTags {
 	for _, rt := range repoAndTags {
-		if err := ic.TagImageWithReference(ctx, imageID, rt); err != nil {
+		if err := ic.TagImage(ctx, imageID, rt); err != nil {
 			return err
 			return err
 		}
 		}
 		_, _ = fmt.Fprintln(stdout, "Successfully tagged", reference.FamiliarString(rt))
 		_, _ = fmt.Fprintln(stdout, "Successfully tagged", reference.FamiliarString(rt))

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

@@ -26,7 +26,7 @@ type imageBackend interface {
 	ImageHistory(ctx context.Context, imageName string) ([]*image.HistoryResponseItem, error)
 	ImageHistory(ctx context.Context, imageName string) ([]*image.HistoryResponseItem, error)
 	Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error)
 	Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error)
 	GetImage(ctx context.Context, refOrID string, options image.GetImageOpts) (*dockerimage.Image, error)
 	GetImage(ctx context.Context, refOrID string, options image.GetImageOpts) (*dockerimage.Image, error)
-	TagImage(ctx context.Context, imageName, repository, tag string) (string, error)
+	TagImage(ctx context.Context, id dockerimage.ID, newRef reference.Named) error
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
 }
 }
 
 

+ 23 - 1
api/server/router/image/image_routes.go

@@ -369,7 +369,29 @@ func (ir *imageRouter) postImagesTag(ctx context.Context, w http.ResponseWriter,
 	if err := httputils.ParseForm(r); err != nil {
 	if err := httputils.ParseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
-	if _, err := ir.backend.TagImage(ctx, vars["name"], r.Form.Get("repo"), r.Form.Get("tag")); err != nil {
+
+	repo := r.Form.Get("repo")
+	tag := r.Form.Get("tag")
+
+	ref, err := reference.ParseNormalizedNamed(repo)
+	if err != nil {
+		return errdefs.InvalidParameter(err)
+	}
+
+	if tag != "" {
+		if ref, err = reference.WithTag(reference.TrimNamed(ref), tag); err != nil {
+			return errdefs.InvalidParameter(err)
+		}
+	} else {
+		ref = reference.TagNameOnly(ref)
+	}
+
+	img, err := ir.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{})
+	if err != nil {
+		return errdefs.NotFound(err)
+	}
+
+	if err := ir.backend.TagImage(ctx, img.ID(), ref); err != nil {
 		return err
 		return err
 	}
 	}
 	w.WriteHeader(http.StatusCreated)
 	w.WriteHeader(http.StatusCreated)

+ 25 - 3
daemon/commit.go

@@ -7,6 +7,7 @@ import (
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
+	"github.com/docker/distribution/reference"
 	"github.com/docker/docker/api/types/backend"
 	"github.com/docker/docker/api/types/backend"
 	containertypes "github.com/docker/docker/api/types/container"
 	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/builder/dockerfile"
 	"github.com/docker/docker/builder/dockerfile"
@@ -119,6 +120,26 @@ func merge(userConf, imageConf *containertypes.Config) error {
 // applying that config over the existing container config.
 // applying that config over the existing container config.
 func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string, c *backend.CreateImageConfig) (string, error) {
 func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string, c *backend.CreateImageConfig) (string, error) {
 	start := time.Now()
 	start := time.Now()
+
+	var newRef reference.Named
+	if c.Repo != "" {
+		ref, err := reference.ParseNormalizedNamed(c.Repo)
+		if err != nil {
+			return "", errdefs.InvalidParameter(err)
+		}
+
+		if c.Tag != "" {
+			ref, err = reference.WithTag(ref, c.Tag)
+			if err != nil {
+				return "", errdefs.InvalidParameter(err)
+			}
+		} else {
+			ref = reference.TagNameOnly(ref)
+		}
+
+		newRef = ref
+	}
+
 	container, err := daemon.GetContainer(name)
 	container, err := daemon.GetContainer(name)
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err
@@ -169,12 +190,13 @@ func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string,
 		return "", err
 		return "", err
 	}
 	}
 
 
-	var imageRef string
-	if c.Repo != "" {
-		imageRef, err = daemon.imageService.TagImage(ctx, string(id), c.Repo, c.Tag)
+	imageRef := ""
+	if newRef != nil {
+		err = daemon.imageService.TagImage(ctx, id, newRef)
 		if err != nil {
 		if err != nil {
 			return "", err
 			return "", err
 		}
 		}
+		imageRef = reference.FamiliarString(newRef)
 	}
 	}
 	daemon.LogContainerEventWithAttributes(container, "commit", map[string]string{
 	daemon.LogContainerEventWithAttributes(container, "commit", map[string]string{
 		"comment":  c.Comment,
 		"comment":  c.Comment,

+ 1 - 2
daemon/image_service.go

@@ -37,8 +37,7 @@ type ImageService interface {
 	CountImages() int
 	CountImages() int
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
 	ImportImage(ctx context.Context, ref reference.Named, platform *v1.Platform, msg string, layerReader io.Reader, changes []string) (image.ID, error)
 	ImportImage(ctx context.Context, ref reference.Named, platform *v1.Platform, msg string, layerReader io.Reader, changes []string) (image.ID, error)
-	TagImage(ctx context.Context, imageName, repository, tag string) (string, error)
-	TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error
+	TagImage(ctx context.Context, imageID image.ID, newTag reference.Named) error
 	GetImage(ctx context.Context, refOrID string, options imagetype.GetImageOpts) (*image.Image, error)
 	GetImage(ctx context.Context, refOrID string, options imagetype.GetImageOpts) (*image.Image, error)
 	ImageHistory(ctx context.Context, name string) ([]*imagetype.HistoryResponseItem, error)
 	ImageHistory(ctx context.Context, name string) ([]*imagetype.HistoryResponseItem, error)
 	CommitImage(ctx context.Context, c backend.CommitConfig) (image.ID, error)
 	CommitImage(ctx context.Context, c backend.CommitConfig) (image.ID, error)

+ 1 - 1
daemon/images/image_import.go

@@ -80,7 +80,7 @@ func (i *ImageService) ImportImage(ctx context.Context, newRef reference.Named,
 	}
 	}
 
 
 	if newRef != nil {
 	if newRef != nil {
-		if err := i.TagImageWithReference(ctx, id, newRef); err != nil {
+		if err := i.TagImage(ctx, id, newRef); err != nil {
 			return "", err
 			return "", err
 		}
 		}
 	}
 	}

+ 2 - 25
daemon/images/image_tag.go

@@ -4,34 +4,11 @@ import (
 	"context"
 	"context"
 
 
 	"github.com/docker/distribution/reference"
 	"github.com/docker/distribution/reference"
-	imagetypes "github.com/docker/docker/api/types/image"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/image"
 )
 )
 
 
-// TagImage creates the tag specified by newTag, pointing to the image named
-// imageName (alternatively, imageName can also be an image ID).
-func (i *ImageService) TagImage(ctx context.Context, imageName, repository, tag string) (string, error) {
-	img, err := i.GetImage(ctx, imageName, imagetypes.GetImageOpts{})
-	if err != nil {
-		return "", err
-	}
-
-	newTag, err := reference.ParseNormalizedNamed(repository)
-	if err != nil {
-		return "", err
-	}
-	if tag != "" {
-		if newTag, err = reference.WithTag(reference.TrimNamed(newTag), tag); err != nil {
-			return "", err
-		}
-	}
-
-	err = i.TagImageWithReference(ctx, img.ID(), newTag)
-	return reference.FamiliarString(newTag), err
-}
-
-// TagImageWithReference adds the given reference to the image ID provided.
-func (i *ImageService) TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error {
+// TagImage adds the given reference to the image ID provided.
+func (i *ImageService) TagImage(ctx context.Context, imageID image.ID, newTag reference.Named) error {
 	if err := i.referenceStore.AddTag(newTag, imageID.Digest(), true); err != nil {
 	if err := i.referenceStore.AddTag(newTag, imageID.Digest(), true); err != nil {
 		return err
 		return err
 	}
 	}