Browse code

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 authored on 2023/01/10 22:29:40
Showing 8 changed files
... ...
@@ -21,7 +21,7 @@ import (
21 21
 // ImageComponent provides an interface for working with images
22 22
 type ImageComponent interface {
23 23
 	SquashImage(from string, to string) (string, error)
24
-	TagImageWithReference(context.Context, image.ID, reference.Named) error
24
+	TagImage(context.Context, image.ID, reference.Named) error
25 25
 }
26 26
 
27 27
 // Builder defines interface for running a build
... ...
@@ -13,7 +13,7 @@ import (
13 13
 // tagImages creates image tags for the imageID.
14 14
 func tagImages(ctx context.Context, ic ImageComponent, stdout io.Writer, imageID image.ID, repoAndTags []reference.Named) error {
15 15
 	for _, rt := range repoAndTags {
16
-		if err := ic.TagImageWithReference(ctx, imageID, rt); err != nil {
16
+		if err := ic.TagImage(ctx, imageID, rt); err != nil {
17 17
 			return err
18 18
 		}
19 19
 		_, _ = fmt.Fprintln(stdout, "Successfully tagged", reference.FamiliarString(rt))
... ...
@@ -26,7 +26,7 @@ type imageBackend interface {
26 26
 	ImageHistory(ctx context.Context, imageName string) ([]*image.HistoryResponseItem, error)
27 27
 	Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error)
28 28
 	GetImage(ctx context.Context, refOrID string, options image.GetImageOpts) (*dockerimage.Image, error)
29
-	TagImage(ctx context.Context, imageName, repository, tag string) (string, error)
29
+	TagImage(ctx context.Context, id dockerimage.ID, newRef reference.Named) error
30 30
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
31 31
 }
32 32
 
... ...
@@ -369,7 +369,29 @@ func (ir *imageRouter) postImagesTag(ctx context.Context, w http.ResponseWriter,
369 369
 	if err := httputils.ParseForm(r); err != nil {
370 370
 		return err
371 371
 	}
372
-	if _, err := ir.backend.TagImage(ctx, vars["name"], r.Form.Get("repo"), r.Form.Get("tag")); err != nil {
372
+
373
+	repo := r.Form.Get("repo")
374
+	tag := r.Form.Get("tag")
375
+
376
+	ref, err := reference.ParseNormalizedNamed(repo)
377
+	if err != nil {
378
+		return errdefs.InvalidParameter(err)
379
+	}
380
+
381
+	if tag != "" {
382
+		if ref, err = reference.WithTag(reference.TrimNamed(ref), tag); err != nil {
383
+			return errdefs.InvalidParameter(err)
384
+		}
385
+	} else {
386
+		ref = reference.TagNameOnly(ref)
387
+	}
388
+
389
+	img, err := ir.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{})
390
+	if err != nil {
391
+		return errdefs.NotFound(err)
392
+	}
393
+
394
+	if err := ir.backend.TagImage(ctx, img.ID(), ref); err != nil {
373 395
 		return err
374 396
 	}
375 397
 	w.WriteHeader(http.StatusCreated)
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	"strings"
8 8
 	"time"
9 9
 
10
+	"github.com/docker/distribution/reference"
10 11
 	"github.com/docker/docker/api/types/backend"
11 12
 	containertypes "github.com/docker/docker/api/types/container"
12 13
 	"github.com/docker/docker/builder/dockerfile"
... ...
@@ -119,6 +120,26 @@ func merge(userConf, imageConf *containertypes.Config) error {
119 119
 // applying that config over the existing container config.
120 120
 func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string, c *backend.CreateImageConfig) (string, error) {
121 121
 	start := time.Now()
122
+
123
+	var newRef reference.Named
124
+	if c.Repo != "" {
125
+		ref, err := reference.ParseNormalizedNamed(c.Repo)
126
+		if err != nil {
127
+			return "", errdefs.InvalidParameter(err)
128
+		}
129
+
130
+		if c.Tag != "" {
131
+			ref, err = reference.WithTag(ref, c.Tag)
132
+			if err != nil {
133
+				return "", errdefs.InvalidParameter(err)
134
+			}
135
+		} else {
136
+			ref = reference.TagNameOnly(ref)
137
+		}
138
+
139
+		newRef = ref
140
+	}
141
+
122 142
 	container, err := daemon.GetContainer(name)
123 143
 	if err != nil {
124 144
 		return "", err
... ...
@@ -169,12 +190,13 @@ func (daemon *Daemon) CreateImageFromContainer(ctx context.Context, name string,
169 169
 		return "", err
170 170
 	}
171 171
 
172
-	var imageRef string
173
-	if c.Repo != "" {
174
-		imageRef, err = daemon.imageService.TagImage(ctx, string(id), c.Repo, c.Tag)
172
+	imageRef := ""
173
+	if newRef != nil {
174
+		err = daemon.imageService.TagImage(ctx, id, newRef)
175 175
 		if err != nil {
176 176
 			return "", err
177 177
 		}
178
+		imageRef = reference.FamiliarString(newRef)
178 179
 	}
179 180
 	daemon.LogContainerEventWithAttributes(container, "commit", map[string]string{
180 181
 		"comment":  c.Comment,
... ...
@@ -37,8 +37,7 @@ type ImageService interface {
37 37
 	CountImages() int
38 38
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
39 39
 	ImportImage(ctx context.Context, ref reference.Named, platform *v1.Platform, msg string, layerReader io.Reader, changes []string) (image.ID, error)
40
-	TagImage(ctx context.Context, imageName, repository, tag string) (string, error)
41
-	TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error
40
+	TagImage(ctx context.Context, imageID image.ID, newTag reference.Named) error
42 41
 	GetImage(ctx context.Context, refOrID string, options imagetype.GetImageOpts) (*image.Image, error)
43 42
 	ImageHistory(ctx context.Context, name string) ([]*imagetype.HistoryResponseItem, error)
44 43
 	CommitImage(ctx context.Context, c backend.CommitConfig) (image.ID, error)
... ...
@@ -80,7 +80,7 @@ func (i *ImageService) ImportImage(ctx context.Context, newRef reference.Named,
80 80
 	}
81 81
 
82 82
 	if newRef != nil {
83
-		if err := i.TagImageWithReference(ctx, id, newRef); err != nil {
83
+		if err := i.TagImage(ctx, id, newRef); err != nil {
84 84
 			return "", err
85 85
 		}
86 86
 	}
... ...
@@ -4,34 +4,11 @@ import (
4 4
 	"context"
5 5
 
6 6
 	"github.com/docker/distribution/reference"
7
-	imagetypes "github.com/docker/docker/api/types/image"
8 7
 	"github.com/docker/docker/image"
9 8
 )
10 9
 
11
-// TagImage creates the tag specified by newTag, pointing to the image named
12
-// imageName (alternatively, imageName can also be an image ID).
13
-func (i *ImageService) TagImage(ctx context.Context, imageName, repository, tag string) (string, error) {
14
-	img, err := i.GetImage(ctx, imageName, imagetypes.GetImageOpts{})
15
-	if err != nil {
16
-		return "", err
17
-	}
18
-
19
-	newTag, err := reference.ParseNormalizedNamed(repository)
20
-	if err != nil {
21
-		return "", err
22
-	}
23
-	if tag != "" {
24
-		if newTag, err = reference.WithTag(reference.TrimNamed(newTag), tag); err != nil {
25
-			return "", err
26
-		}
27
-	}
28
-
29
-	err = i.TagImageWithReference(ctx, img.ID(), newTag)
30
-	return reference.FamiliarString(newTag), err
31
-}
32
-
33
-// TagImageWithReference adds the given reference to the image ID provided.
34
-func (i *ImageService) TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error {
10
+// TagImage adds the given reference to the image ID provided.
11
+func (i *ImageService) TagImage(ctx context.Context, imageID image.ID, newTag reference.Named) error {
35 12
 	if err := i.referenceStore.AddTag(newTag, imageID.Digest(), true); err != nil {
36 13
 		return err
37 14
 	}