mirror of https://github.com/docker/cli.git
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:
parent
66f7194250
commit
b71687e054
18
image_tag.go
18
image_tag.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue