Merge pull request #31830 from dnephin/refactor-cli-state

Small cleanup now that we have multiple details about the server stored on the cli
This commit is contained in:
Sebastiaan van Stijn 2017-03-29 13:36:32 +02:00 committed by GitHub
commit db8f631c1f
1 changed files with 21 additions and 7 deletions

View File

@ -14,6 +14,7 @@ import (
cliconfig "github.com/docker/docker/cli/config" cliconfig "github.com/docker/docker/cli/config"
"github.com/docker/docker/cli/debug" "github.com/docker/docker/cli/debug"
cliflags "github.com/docker/docker/cli/flags" cliflags "github.com/docker/docker/cli/flags"
"github.com/docker/docker/client"
"github.com/docker/docker/dockerversion" "github.com/docker/docker/dockerversion"
"github.com/docker/docker/pkg/term" "github.com/docker/docker/pkg/term"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -49,7 +50,7 @@ func newDockerCommand(dockerCli *command.DockerCli) *cobra.Command {
if err := dockerCli.Initialize(opts); err != nil { if err := dockerCli.Initialize(opts); err != nil {
return err return err
} }
return isSupported(cmd, dockerCli.Client().ClientVersion(), dockerCli.OSType(), dockerCli.HasExperimental()) return isSupported(cmd, dockerCli)
}, },
} }
cli.SetupRootCommand(cmd) cli.SetupRootCommand(cmd)
@ -80,7 +81,7 @@ func setFlagErrorFunc(dockerCli *command.DockerCli, cmd *cobra.Command, flags *p
flagErrorFunc := cmd.FlagErrorFunc() flagErrorFunc := cmd.FlagErrorFunc()
cmd.SetFlagErrorFunc(func(cmd *cobra.Command, err error) error { cmd.SetFlagErrorFunc(func(cmd *cobra.Command, err error) error {
initializeDockerCli(dockerCli, flags, opts) initializeDockerCli(dockerCli, flags, opts)
if err := isSupported(cmd, dockerCli.Client().ClientVersion(), dockerCli.OSType(), dockerCli.HasExperimental()); err != nil { if err := isSupported(cmd, dockerCli); err != nil {
return err return err
} }
return flagErrorFunc(cmd, err) return flagErrorFunc(cmd, err)
@ -90,12 +91,12 @@ func setFlagErrorFunc(dockerCli *command.DockerCli, cmd *cobra.Command, flags *p
func setHelpFunc(dockerCli *command.DockerCli, cmd *cobra.Command, flags *pflag.FlagSet, opts *cliflags.ClientOptions) { func setHelpFunc(dockerCli *command.DockerCli, cmd *cobra.Command, flags *pflag.FlagSet, opts *cliflags.ClientOptions) {
cmd.SetHelpFunc(func(ccmd *cobra.Command, args []string) { cmd.SetHelpFunc(func(ccmd *cobra.Command, args []string) {
initializeDockerCli(dockerCli, flags, opts) initializeDockerCli(dockerCli, flags, opts)
if err := isSupported(ccmd, dockerCli.Client().ClientVersion(), dockerCli.OSType(), dockerCli.HasExperimental()); err != nil { if err := isSupported(ccmd, dockerCli); err != nil {
ccmd.Println(err) ccmd.Println(err)
return return
} }
hideUnsupportedFeatures(ccmd, dockerCli.Client().ClientVersion(), dockerCli.OSType(), dockerCli.HasExperimental()) hideUnsupportedFeatures(ccmd, dockerCli)
if err := ccmd.Help(); err != nil { if err := ccmd.Help(); err != nil {
ccmd.Println(err) ccmd.Println(err)
@ -122,7 +123,7 @@ func setValidateArgs(dockerCli *command.DockerCli, cmd *cobra.Command, flags *pf
cmdArgs := ccmd.Args cmdArgs := ccmd.Args
ccmd.Args = func(cmd *cobra.Command, args []string) error { ccmd.Args = func(cmd *cobra.Command, args []string) error {
initializeDockerCli(dockerCli, flags, opts) initializeDockerCli(dockerCli, flags, opts)
if err := isSupported(cmd, dockerCli.Client().ClientVersion(), dockerCli.OSType(), dockerCli.HasExperimental()); err != nil { if err := isSupported(cmd, dockerCli); err != nil {
return err return err
} }
return cmdArgs(cmd, args) return cmdArgs(cmd, args)
@ -198,7 +199,16 @@ func dockerPreRun(opts *cliflags.ClientOptions) {
} }
} }
func hideUnsupportedFeatures(cmd *cobra.Command, clientVersion, osType string, hasExperimental bool) { type versionDetails interface {
Client() client.APIClient
ServerInfo() command.ServerInfo
}
func hideUnsupportedFeatures(cmd *cobra.Command, details versionDetails) {
clientVersion := details.Client().ClientVersion()
osType := details.ServerInfo().OSType
hasExperimental := details.ServerInfo().HasExperimental
cmd.Flags().VisitAll(func(f *pflag.Flag) { cmd.Flags().VisitAll(func(f *pflag.Flag) {
// hide experimental flags // hide experimental flags
if !hasExperimental { if !hasExperimental {
@ -228,7 +238,11 @@ func hideUnsupportedFeatures(cmd *cobra.Command, clientVersion, osType string, h
} }
} }
func isSupported(cmd *cobra.Command, clientVersion, osType string, hasExperimental bool) error { func isSupported(cmd *cobra.Command, details versionDetails) error {
clientVersion := details.Client().ClientVersion()
osType := details.ServerInfo().OSType
hasExperimental := details.ServerInfo().HasExperimental
// Check recursively so that, e.g., `docker stack ls` returns the same output as `docker stack` // Check recursively so that, e.g., `docker stack ls` returns the same output as `docker stack`
for curr := cmd; curr != nil; curr = curr.Parent() { for curr := cmd; curr != nil; curr = curr.Parent() {
if cmdVersion, ok := curr.Tags["version"]; ok && versions.LessThan(clientVersion, cmdVersion) { if cmdVersion, ok := curr.Tags["version"]; ok && versions.LessThan(clientVersion, cmdVersion) {