Ver código fonte

Merge pull request #29841 from wefine/docker_image_tag_input_check

check both source_image_tag and target_image_tag for 'docker image tag'
Sebastiaan van Stijn 8 anos atrás
pai
commit
fc9d74136b
2 arquivos alterados com 22 adições e 9 exclusões
  1. 10 8
      client/image_tag.go
  2. 12 1
      client/image_tag_test.go

+ 10 - 8
client/image_tag.go

@@ -1,21 +1,23 @@
 package client
 
 import (
-	"errors"
-	"fmt"
 	"net/url"
 
-	"golang.org/x/net/context"
-
 	distreference "github.com/docker/distribution/reference"
 	"github.com/docker/docker/api/types/reference"
+	"github.com/pkg/errors"
+	"golang.org/x/net/context"
 )
 
 // ImageTag tags an image in the docker host
-func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error {
-	distributionRef, err := distreference.ParseNamed(ref)
+func (cli *Client) ImageTag(ctx context.Context, source, target string) error {
+	if _, err := distreference.ParseNamed(source); err != nil {
+		return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", source)
+	}
+
+	distributionRef, err := distreference.ParseNamed(target)
 	if err != nil {
-		return fmt.Errorf("Error parsing reference: %q is not a valid repository/tag", ref)
+		return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", target)
 	}
 
 	if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical {
@@ -28,7 +30,7 @@ func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error {
 	query.Set("repo", distributionRef.Name())
 	query.Set("tag", tag)
 
-	resp, err := cli.post(ctx, "/images/"+imageID+"/tag", query, nil, nil)
+	resp, err := cli.post(ctx, "/images/"+source+"/tag", query, nil, nil)
 	ensureReaderClosed(resp)
 	return err
 }

+ 12 - 1
client/image_tag_test.go

@@ -30,11 +30,22 @@ func TestImageTagInvalidReference(t *testing.T) {
 	}
 
 	err := client.ImageTag(context.Background(), "image_id", "aa/asdf$$^/aa")
-	if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag` {
+	if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag: invalid reference format` {
 		t.Fatalf("expected ErrReferenceInvalidFormat, got %v", err)
 	}
 }
 
+func TestImageTagInvalidSourceImageName(t *testing.T) {
+	client := &Client{
+		client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
+	}
+
+	err := client.ImageTag(context.Background(), "invalid_source_image_name_", "repo:tag")
+	if err == nil || err.Error() != "Error parsing reference: \"invalid_source_image_name_\" is not a valid repository/tag: invalid reference format" {
+		t.Fatalf("expected Parsing Reference Error, got %v", err)
+	}
+}
+
 func TestImageTag(t *testing.T) {
 	expectedURL := "/images/image_id/tag"
 	tagCases := []struct {