diff --git a/cli/cmd/login/login.go b/cli/cmd/login/login.go index ee5439b26..1cff03ac3 100644 --- a/cli/cmd/login/login.go +++ b/cli/cmd/login/login.go @@ -21,6 +21,8 @@ import ( "fmt" "strings" + "github.com/docker/api/cli/cmd/mobyflags" + "github.com/pkg/errors" "github.com/spf13/cobra" @@ -43,6 +45,7 @@ func Command() *cobra.Command { flags.StringP("username", "u", "", "Username") flags.StringP("password", "p", "", "Password") flags.BoolP("password-stdin", "", false, "Take the password from stdin") + mobyflags.AddMobyFlagsForRetrocompatibility(flags) return cmd } diff --git a/cli/cmd/mobyflags/mobyflags.go b/cli/cmd/mobyflags/mobyflags.go new file mode 100644 index 000000000..b094ef537 --- /dev/null +++ b/cli/cmd/mobyflags/mobyflags.go @@ -0,0 +1,24 @@ +package mobyflags + +import ( + "log" + + flag "github.com/spf13/pflag" +) + +// AddMobyFlagsForRetrocompatibility adds retrocompatibility flags to our commands +func AddMobyFlagsForRetrocompatibility(flags *flag.FlagSet) { + const hostFlag = "host" + flags.StringP(hostFlag, "H", "", "Daemon socket(s) to connect to") + markHidden(flags, hostFlag) + const logLevelFlag = "log-level" + flags.StringP(logLevelFlag, "l", "info", `Set the logging level ("debug"|"info"|"warn"|"error"|"fatal")`) + markHidden(flags, logLevelFlag) +} + +func markHidden(flags *flag.FlagSet, flagName string) { + err := flags.MarkHidden(flagName) + if err != nil { + log.Fatal(err) + } +} diff --git a/cli/cmd/version.go b/cli/cmd/version.go index 58cebf7ce..515f726fc 100644 --- a/cli/cmd/version.go +++ b/cli/cmd/version.go @@ -22,6 +22,7 @@ import ( "github.com/spf13/cobra" + "github.com/docker/api/cli/cmd/mobyflags" "github.com/docker/api/cli/mobycli" ) @@ -39,6 +40,7 @@ func VersionCommand() *cobra.Command { flags := cmd.Flags() flags.String("format", "", "Format the output using the given Go template") flags.String("kubeconfig", "", "Kubernetes config file") + mobyflags.AddMobyFlagsForRetrocompatibility(flags) return cmd } diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 2519aa7dc..c052893c7 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -173,6 +173,23 @@ func (s *E2eSuite) TestLeaveLegacyErrorMessagesUnchanged() { Expect(err).NotTo(BeNil()) } +func (s *E2eSuite) TestPassThroughRootLegacyFlags() { + output, err := s.NewDockerCommand("-H", "tcp://localhost:123", "version").Exec() + Expect(err).To(BeNil()) + Expect(output).To(ContainSubstring("Client:")) + Expect(output).To(ContainSubstring("localhost:123")) + + output, _ = s.NewDockerCommand("-H", "tcp://localhost:123", "login", "-u", "nouser", "-p", "wrongpasword").Exec() + Expect(output).To(ContainSubstring("WARNING! Using --password via the CLI is insecure")) + + output, _ = s.NewDockerCommand("--log-level", "debug", "login", "-u", "nouser", "-p", "wrongpasword").Exec() + Expect(output).To(ContainSubstring("WARNING! Using --password via the CLI is insecure")) + + output, _ = s.NewDockerCommand("login", "--help").Exec() + Expect(output).NotTo(ContainSubstring("--host")) + Expect(output).NotTo(ContainSubstring("--log-level")) +} + func (s *E2eSuite) TestDisplayFriendlyErrorMessageForLegacyCommands() { s.NewDockerCommand("context", "create", "example", "test-example").ExecOrDie() output, err := s.NewDockerCommand("--context", "test-example", "images").Exec()