adaptor.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package cobraadaptor
  2. import (
  3. "github.com/docker/docker/api/client"
  4. "github.com/docker/docker/api/client/container"
  5. "github.com/docker/docker/api/client/image"
  6. "github.com/docker/docker/api/client/network"
  7. "github.com/docker/docker/api/client/node"
  8. "github.com/docker/docker/api/client/plugin"
  9. "github.com/docker/docker/api/client/registry"
  10. "github.com/docker/docker/api/client/service"
  11. "github.com/docker/docker/api/client/stack"
  12. "github.com/docker/docker/api/client/swarm"
  13. "github.com/docker/docker/api/client/system"
  14. "github.com/docker/docker/api/client/volume"
  15. "github.com/docker/docker/cli"
  16. cliflags "github.com/docker/docker/cli/flags"
  17. "github.com/docker/docker/pkg/term"
  18. "github.com/spf13/cobra"
  19. )
  20. // CobraAdaptor is an adaptor for supporting spf13/cobra commands in the
  21. // docker/cli framework
  22. type CobraAdaptor struct {
  23. rootCmd *cobra.Command
  24. dockerCli *client.DockerCli
  25. }
  26. // NewCobraAdaptor returns a new handler
  27. func NewCobraAdaptor(clientFlags *cliflags.ClientFlags) CobraAdaptor {
  28. stdin, stdout, stderr := term.StdStreams()
  29. dockerCli := client.NewDockerCli(stdin, stdout, stderr, clientFlags)
  30. var rootCmd = &cobra.Command{
  31. Use: "docker [OPTIONS]",
  32. Short: "A self-sufficient runtime for containers",
  33. SilenceUsage: true,
  34. SilenceErrors: true,
  35. }
  36. rootCmd.SetUsageTemplate(usageTemplate)
  37. rootCmd.SetHelpTemplate(helpTemplate)
  38. rootCmd.SetFlagErrorFunc(cli.FlagErrorFunc)
  39. rootCmd.SetOutput(stdout)
  40. rootCmd.AddCommand(
  41. node.NewNodeCommand(dockerCli),
  42. service.NewServiceCommand(dockerCli),
  43. stack.NewStackCommand(dockerCli),
  44. stack.NewTopLevelDeployCommand(dockerCli),
  45. swarm.NewSwarmCommand(dockerCli),
  46. container.NewAttachCommand(dockerCli),
  47. container.NewCommitCommand(dockerCli),
  48. container.NewCopyCommand(dockerCli),
  49. container.NewCreateCommand(dockerCli),
  50. container.NewDiffCommand(dockerCli),
  51. container.NewExecCommand(dockerCli),
  52. container.NewExportCommand(dockerCli),
  53. container.NewKillCommand(dockerCli),
  54. container.NewLogsCommand(dockerCli),
  55. container.NewPauseCommand(dockerCli),
  56. container.NewPortCommand(dockerCli),
  57. container.NewPsCommand(dockerCli),
  58. container.NewRenameCommand(dockerCli),
  59. container.NewRestartCommand(dockerCli),
  60. container.NewRmCommand(dockerCli),
  61. container.NewRunCommand(dockerCli),
  62. container.NewStartCommand(dockerCli),
  63. container.NewStatsCommand(dockerCli),
  64. container.NewStopCommand(dockerCli),
  65. container.NewTopCommand(dockerCli),
  66. container.NewUnpauseCommand(dockerCli),
  67. container.NewUpdateCommand(dockerCli),
  68. container.NewWaitCommand(dockerCli),
  69. image.NewBuildCommand(dockerCli),
  70. image.NewHistoryCommand(dockerCli),
  71. image.NewImagesCommand(dockerCli),
  72. image.NewLoadCommand(dockerCli),
  73. image.NewRemoveCommand(dockerCli),
  74. image.NewSaveCommand(dockerCli),
  75. image.NewPullCommand(dockerCli),
  76. image.NewPushCommand(dockerCli),
  77. image.NewSearchCommand(dockerCli),
  78. image.NewImportCommand(dockerCli),
  79. image.NewTagCommand(dockerCli),
  80. network.NewNetworkCommand(dockerCli),
  81. system.NewEventsCommand(dockerCli),
  82. registry.NewLoginCommand(dockerCli),
  83. registry.NewLogoutCommand(dockerCli),
  84. system.NewVersionCommand(dockerCli),
  85. volume.NewVolumeCommand(dockerCli),
  86. system.NewInfoCommand(dockerCli),
  87. )
  88. plugin.NewPluginCommand(rootCmd, dockerCli)
  89. rootCmd.PersistentFlags().BoolP("help", "h", false, "Print usage")
  90. rootCmd.PersistentFlags().MarkShorthandDeprecated("help", "please use --help")
  91. return CobraAdaptor{
  92. rootCmd: rootCmd,
  93. dockerCli: dockerCli,
  94. }
  95. }
  96. // Usage returns the list of commands and their short usage string for
  97. // all top level cobra commands.
  98. func (c CobraAdaptor) Usage() []cli.Command {
  99. cmds := []cli.Command{}
  100. for _, cmd := range c.rootCmd.Commands() {
  101. if cmd.Name() != "" {
  102. cmds = append(cmds, cli.Command{Name: cmd.Name(), Description: cmd.Short})
  103. }
  104. }
  105. return cmds
  106. }
  107. func (c CobraAdaptor) run(cmd string, args []string) error {
  108. if err := c.dockerCli.Initialize(); err != nil {
  109. return err
  110. }
  111. // Prepend the command name to support normal cobra command delegation
  112. c.rootCmd.SetArgs(append([]string{cmd}, args...))
  113. return c.rootCmd.Execute()
  114. }
  115. // Command returns a cli command handler if one exists
  116. func (c CobraAdaptor) Command(name string) func(...string) error {
  117. for _, cmd := range c.rootCmd.Commands() {
  118. if cmd.Name() == name {
  119. return func(args ...string) error {
  120. return c.run(name, args)
  121. }
  122. }
  123. }
  124. return nil
  125. }
  126. // GetRootCommand returns the root command. Required to generate the man pages
  127. // and reference docs from a script outside this package.
  128. func (c CobraAdaptor) GetRootCommand() *cobra.Command {
  129. return c.rootCmd
  130. }
  131. var usageTemplate = `Usage: {{if not .HasSubCommands}}{{.UseLine}}{{end}}{{if .HasSubCommands}}{{ .CommandPath}} COMMAND{{end}}
  132. {{ .Short | trim }}{{if gt .Aliases 0}}
  133. Aliases:
  134. {{.NameAndAliases}}{{end}}{{if .HasExample}}
  135. Examples:
  136. {{ .Example }}{{end}}{{if .HasFlags}}
  137. Options:
  138. {{.Flags.FlagUsages | trimRightSpace}}{{end}}{{ if .HasAvailableSubCommands}}
  139. Commands:{{range .Commands}}{{if .IsAvailableCommand}}
  140. {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasSubCommands }}
  141. Run '{{.CommandPath}} COMMAND --help' for more information on a command.{{end}}
  142. `
  143. var helpTemplate = `
  144. {{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`