github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/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", 36 SilenceUsage: true, 37 SilenceErrors: true, 38 } 39 rootCmd.SetUsageTemplate(usageTemplate) 40 rootCmd.SetHelpTemplate(helpTemplate) 41 rootCmd.SetFlagErrorFunc(cli.FlagErrorFunc) 42 rootCmd.SetOutput(stdout) 43 rootCmd.AddCommand( 44 node.NewNodeCommand(dockerCli), 45 service.NewServiceCommand(dockerCli), 46 stack.NewStackCommand(dockerCli), 47 stack.NewTopLevelDeployCommand(dockerCli), 48 swarm.NewSwarmCommand(dockerCli), 49 container.NewAttachCommand(dockerCli), 50 container.NewCommitCommand(dockerCli), 51 container.NewCopyCommand(dockerCli), 52 container.NewCreateCommand(dockerCli), 53 container.NewDiffCommand(dockerCli), 54 container.NewExportCommand(dockerCli), 55 container.NewKillCommand(dockerCli), 56 container.NewLogsCommand(dockerCli), 57 container.NewPauseCommand(dockerCli), 58 container.NewPortCommand(dockerCli), 59 container.NewPsCommand(dockerCli), 60 container.NewRenameCommand(dockerCli), 61 container.NewRestartCommand(dockerCli), 62 container.NewRmCommand(dockerCli), 63 container.NewRunCommand(dockerCli), 64 container.NewStartCommand(dockerCli), 65 container.NewStatsCommand(dockerCli), 66 container.NewStopCommand(dockerCli), 67 container.NewTopCommand(dockerCli), 68 container.NewUnpauseCommand(dockerCli), 69 container.NewUpdateCommand(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 system.NewInfoCommand(dockerCli), 89 ) 90 plugin.NewPluginCommand(rootCmd, dockerCli) 91 92 rootCmd.PersistentFlags().BoolP("help", "h", false, "Print usage") 93 rootCmd.PersistentFlags().MarkShorthandDeprecated("help", "please use --help") 94 95 return CobraAdaptor{ 96 rootCmd: rootCmd, 97 dockerCli: dockerCli, 98 } 99 } 100 101 // Usage returns the list of commands and their short usage string for 102 // all top level cobra commands. 103 func (c CobraAdaptor) Usage() []cli.Command { 104 cmds := []cli.Command{} 105 for _, cmd := range c.rootCmd.Commands() { 106 if cmd.Name() != "" { 107 cmds = append(cmds, cli.Command{Name: cmd.Name(), Description: cmd.Short}) 108 } 109 } 110 return cmds 111 } 112 113 func (c CobraAdaptor) run(cmd string, args []string) error { 114 if err := c.dockerCli.Initialize(); err != nil { 115 return err 116 } 117 // Prepend the command name to support normal cobra command delegation 118 c.rootCmd.SetArgs(append([]string{cmd}, args...)) 119 return c.rootCmd.Execute() 120 } 121 122 // Command returns a cli command handler if one exists 123 func (c CobraAdaptor) Command(name string) func(...string) error { 124 for _, cmd := range c.rootCmd.Commands() { 125 if cmd.Name() == name { 126 return func(args ...string) error { 127 return c.run(name, args) 128 } 129 } 130 } 131 return nil 132 } 133 134 var usageTemplate = `Usage: {{if not .HasSubCommands}}{{if .HasLocalFlags}}{{appendIfNotPresent .UseLine "[OPTIONS]"}}{{else}}{{.UseLine}}{{end}}{{end}}{{if .HasSubCommands}}{{ .CommandPath}} COMMAND{{end}} 135 136 {{with or .Long .Short }}{{. | trim}}{{end}}{{if gt .Aliases 0}} 137 138 Aliases: 139 {{.NameAndAliases}}{{end}}{{if .HasExample}} 140 141 Examples: 142 {{ .Example }}{{end}}{{if .HasFlags}} 143 144 Options: 145 {{.Flags.FlagUsages | trimRightSpace}}{{end}}{{ if .HasAvailableSubCommands}} 146 147 Commands:{{range .Commands}}{{if .IsAvailableCommand}} 148 {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasSubCommands }} 149 150 Run '{{.CommandPath}} COMMAND --help' for more information on a command.{{end}} 151 ` 152 153 var helpTemplate = ` 154 {{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`