github.com/DaoCloud/dao@v0.0.0-20161212064103-c3dbfd13ee36/cli/cobraadaptor/adaptor.go (about)

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