diff options
author | Vincent Demeester <vincent@sbr.pm> | 2016-06-10 12:07:23 +0200 |
---|---|---|
committer | Vincent Demeester <vincent@sbr.pm> | 2016-06-10 12:07:23 +0200 |
commit | fa67b984f8ec1aa7b8292777210f4643d4bc1bf0 (patch) | |
tree | ddf808219c961c17d2b2948f01a8a8d121f8add6 | |
parent | a05536ff42d8a59d72cd95dfc38dc848e736420c (diff) | |
download | docker-fa67b984f8ec1aa7b8292777210f4643d4bc1bf0.tar.gz |
Migrate pull command to cobra
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
-rw-r--r-- | api/client/commands.go | 1 | ||||
-rw-r--r-- | api/client/image/pull.go | 86 | ||||
-rw-r--r-- | api/client/pull.go | 64 | ||||
-rw-r--r-- | api/client/trust.go | 7 | ||||
-rw-r--r-- | cli/cobraadaptor/adaptor.go | 1 | ||||
-rw-r--r-- | cli/usage.go | 1 |
6 files changed, 93 insertions, 67 deletions
diff --git a/api/client/commands.go b/api/client/commands.go index b843106a72..d6f5aebdac 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -11,7 +11,6 @@ func (cli *DockerCli) Command(name string) func(...string) error { "login": cli.CmdLogin, "logout": cli.CmdLogout, "ps": cli.CmdPs, - "pull": cli.CmdPull, "push": cli.CmdPush, "update": cli.CmdUpdate, }[name] diff --git a/api/client/image/pull.go b/api/client/image/pull.go new file mode 100644 index 0000000000..24d91e4a63 --- /dev/null +++ b/api/client/image/pull.go @@ -0,0 +1,86 @@ +package image + +import ( + "errors" + "fmt" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/client" + "github.com/docker/docker/cli" + "github.com/docker/docker/reference" + "github.com/docker/docker/registry" + "github.com/spf13/cobra" +) + +type pullOptions struct { + remote string + all bool +} + +// NewPullCommand creates a new `docker pull` command +func NewPullCommand(dockerCli *client.DockerCli) *cobra.Command { + var opts pullOptions + + cmd := &cobra.Command{ + Use: "pull [OPTIONS] NAME[:TAG|@DIGEST]", + Short: "Pull an image or a repository from a registry", + Args: cli.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + opts.remote = args[0] + return runPull(dockerCli, opts) + }, + } + + flags := cmd.Flags() + + flags.BoolVarP(&opts.all, "all-tags", "a", false, "Download all tagged images in the repository") + client.AddTrustedFlags(flags, true) + + return cmd +} + +func runPull(dockerCli *client.DockerCli, opts pullOptions) error { + + distributionRef, err := reference.ParseNamed(opts.remote) + if err != nil { + return err + } + if opts.all && !reference.IsNameOnly(distributionRef) { + return errors.New("tag can't be used with --all-tags/-a") + } + + if !opts.all && reference.IsNameOnly(distributionRef) { + distributionRef = reference.WithDefaultTag(distributionRef) + fmt.Fprintf(dockerCli.Out(), "Using default tag: %s\n", reference.DefaultTag) + } + + var tag string + switch x := distributionRef.(type) { + case reference.Canonical: + tag = x.Digest().String() + case reference.NamedTagged: + tag = x.Tag() + } + + registryRef := registry.ParseReference(tag) + + // Resolve the Repository name from fqn to RepositoryInfo + repoInfo, err := registry.ParseRepositoryInfo(distributionRef) + if err != nil { + return err + } + + ctx := context.Background() + + authConfig := dockerCli.ResolveAuthConfig(ctx, repoInfo.Index) + requestPrivilege := dockerCli.RegistryAuthenticationPrivilegedFunc(repoInfo.Index, "pull") + + if client.IsTrusted() && !registryRef.HasDigest() { + // Check if tag is digest + return dockerCli.TrustedPull(ctx, repoInfo, registryRef, authConfig, requestPrivilege) + } + + return dockerCli.ImagePullPrivileged(ctx, authConfig, distributionRef.String(), requestPrivilege, opts.all) + +} diff --git a/api/client/pull.go b/api/client/pull.go index 364e513de1..c0cef6f009 100644 --- a/api/client/pull.go +++ b/api/client/pull.go @@ -1,74 +1,14 @@ package client import ( - "errors" - "fmt" - "golang.org/x/net/context" - Cli "github.com/docker/docker/cli" "github.com/docker/docker/pkg/jsonmessage" - flag "github.com/docker/docker/pkg/mflag" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" "github.com/docker/engine-api/types" ) -// CmdPull pulls an image or a repository from the registry. -// -// Usage: docker pull [OPTIONS] IMAGENAME[:TAG|@DIGEST] -func (cli *DockerCli) CmdPull(args ...string) error { - cmd := Cli.Subcmd("pull", []string{"NAME[:TAG|@DIGEST]"}, Cli.DockerCommands["pull"].Description, true) - allTags := cmd.Bool([]string{"a", "-all-tags"}, false, "Download all tagged images in the repository") - addTrustedFlags(cmd, true) - cmd.Require(flag.Exact, 1) - - cmd.ParseFlags(args, true) - remote := cmd.Arg(0) - - distributionRef, err := reference.ParseNamed(remote) - if err != nil { - return err - } - if *allTags && !reference.IsNameOnly(distributionRef) { - return errors.New("tag can't be used with --all-tags/-a") - } - - if !*allTags && reference.IsNameOnly(distributionRef) { - distributionRef = reference.WithDefaultTag(distributionRef) - fmt.Fprintf(cli.out, "Using default tag: %s\n", reference.DefaultTag) - } - - var tag string - switch x := distributionRef.(type) { - case reference.Canonical: - tag = x.Digest().String() - case reference.NamedTagged: - tag = x.Tag() - } - - registryRef := registry.ParseReference(tag) - - // Resolve the Repository name from fqn to RepositoryInfo - repoInfo, err := registry.ParseRepositoryInfo(distributionRef) - if err != nil { - return err - } - - ctx := context.Background() - - authConfig := cli.ResolveAuthConfig(ctx, repoInfo.Index) - requestPrivilege := cli.RegistryAuthenticationPrivilegedFunc(repoInfo.Index, "pull") - - if IsTrusted() && !registryRef.HasDigest() { - // Check if tag is digest - return cli.trustedPull(ctx, repoInfo, registryRef, authConfig, requestPrivilege) - } - - return cli.imagePullPrivileged(ctx, authConfig, distributionRef.String(), requestPrivilege, *allTags) -} - -func (cli *DockerCli) imagePullPrivileged(ctx context.Context, authConfig types.AuthConfig, ref string, requestPrivilege types.RequestPrivilegeFunc, all bool) error { +// ImagePullPrivileged pulls the image and displays it to the output +func (cli *DockerCli) ImagePullPrivileged(ctx context.Context, authConfig types.AuthConfig, ref string, requestPrivilege types.RequestPrivilegeFunc, all bool) error { encodedAuth, err := EncodeAuthToBase64(authConfig) if err != nil { diff --git a/api/client/trust.go b/api/client/trust.go index d2c3479f56..6c72099a9e 100644 --- a/api/client/trust.go +++ b/api/client/trust.go @@ -51,7 +51,7 @@ func addTrustedFlags(fs *flag.FlagSet, verify bool) { fs.BoolVar(&untrusted, []string{"-disable-content-trust"}, !trusted, message) } -// AddTrustedFlags adds the trust flags to a FlagSet +// AddTrustedFlags adds content trust flags to the current command flagset func AddTrustedFlags(fs *pflag.FlagSet, verify bool) { trusted, message := setupTrustedFlag(verify) fs.BoolVar(&untrusted, "disable-content-trust", !trusted, message) @@ -314,7 +314,8 @@ func notaryError(repoName string, err error) error { return err } -func (cli *DockerCli) trustedPull(ctx context.Context, repoInfo *registry.RepositoryInfo, ref registry.Reference, authConfig types.AuthConfig, requestPrivilege types.RequestPrivilegeFunc) error { +// TrustedPull handles content trust pulling of an image +func (cli *DockerCli) TrustedPull(ctx context.Context, repoInfo *registry.RepositoryInfo, ref registry.Reference, authConfig types.AuthConfig, requestPrivilege types.RequestPrivilegeFunc) error { var refs []target notaryRepo, err := cli.getNotaryRepository(repoInfo, authConfig, "pull") @@ -376,7 +377,7 @@ func (cli *DockerCli) trustedPull(ctx context.Context, repoInfo *registry.Reposi if err != nil { return err } - if err := cli.imagePullPrivileged(ctx, authConfig, ref.String(), requestPrivilege, false); err != nil { + if err := cli.ImagePullPrivileged(ctx, authConfig, ref.String(), requestPrivilege, false); err != nil { return err } diff --git a/cli/cobraadaptor/adaptor.go b/cli/cobraadaptor/adaptor.go index a9bdd1a170..2f3d14821e 100644 --- a/cli/cobraadaptor/adaptor.go +++ b/cli/cobraadaptor/adaptor.go @@ -59,6 +59,7 @@ func NewCobraAdaptor(clientFlags *cliflags.ClientFlags) CobraAdaptor { image.NewLoadCommand(dockerCli), image.NewRemoveCommand(dockerCli), image.NewSaveCommand(dockerCli), + image.NewPullCommand(dockerCli), image.NewSearchCommand(dockerCli), image.NewImportCommand(dockerCli), image.NewTagCommand(dockerCli), diff --git a/cli/usage.go b/cli/usage.go index 20eae80f74..c063dd0da6 100644 --- a/cli/usage.go +++ b/cli/usage.go @@ -16,7 +16,6 @@ var DockerCommandUsage = []Command{ {"login", "Log in to a Docker registry"}, {"logout", "Log out from a Docker registry"}, {"ps", "List containers"}, - {"pull", "Pull an image or a repository from a registry"}, {"push", "Push an image or a repository to a registry"}, {"update", "Update configuration of one or more containers"}, } |