check both source_image_tag and target_image_tag for 'docker image tag'

Signed-off-by: wefine <wang.xiaoren@zte.com.cn>
This commit is contained in:
wefine 2017-01-03 23:02:58 +08:00
parent 66f7194250
commit b71687e054
2 changed files with 22 additions and 9 deletions

View File

@ -1,21 +1,23 @@
package client package client
import ( import (
"errors"
"fmt"
"net/url" "net/url"
"golang.org/x/net/context"
distreference "github.com/docker/distribution/reference" distreference "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types/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 // ImageTag tags an image in the docker host
func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error { func (cli *Client) ImageTag(ctx context.Context, source, target string) error {
distributionRef, err := distreference.ParseNamed(ref) 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 { 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 { 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("repo", distributionRef.Name())
query.Set("tag", tag) 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) ensureReaderClosed(resp)
return err return err
} }

View File

@ -30,11 +30,22 @@ func TestImageTagInvalidReference(t *testing.T) {
} }
err := client.ImageTag(context.Background(), "image_id", "aa/asdf$$^/aa") 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) 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) { func TestImageTag(t *testing.T) {
expectedURL := "/images/image_id/tag" expectedURL := "/images/image_id/tag"
tagCases := []struct { tagCases := []struct {