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}}`