github.com/brahmaroutu/docker@v1.2.1-0.20160809185609-eb28dde01f16/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: "A self-sufficient runtime for containers", 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.NewExecCommand(dockerCli), 56 container.NewExportCommand(dockerCli), 57 container.NewKillCommand(dockerCli), 58 container.NewLogsCommand(dockerCli), 59 container.NewPauseCommand(dockerCli), 60 container.NewPortCommand(dockerCli), 61 container.NewPsCommand(dockerCli), 62 container.NewRenameCommand(dockerCli), 63 container.NewRestartCommand(dockerCli), 64 container.NewRmCommand(dockerCli), 65 container.NewRunCommand(dockerCli), 66 container.NewStartCommand(dockerCli), 67 container.NewStatsCommand(dockerCli), 68 container.NewStopCommand(dockerCli), 69 container.NewTopCommand(dockerCli), 70 container.NewUnpauseCommand(dockerCli), 71 container.NewUpdateCommand(dockerCli), 72 container.NewWaitCommand(dockerCli), 73 image.NewBuildCommand(dockerCli), 74 image.NewHistoryCommand(dockerCli), 75 image.NewImagesCommand(dockerCli), 76 image.NewLoadCommand(dockerCli), 77 image.NewRemoveCommand(dockerCli), 78 image.NewSaveCommand(dockerCli), 79 image.NewPullCommand(dockerCli), 80 image.NewPushCommand(dockerCli), 81 image.NewSearchCommand(dockerCli), 82 image.NewImportCommand(dockerCli), 83 image.NewTagCommand(dockerCli), 84 network.NewNetworkCommand(dockerCli), 85 system.NewEventsCommand(dockerCli), 86 system.NewInspectCommand(dockerCli), 87 registry.NewLoginCommand(dockerCli), 88 registry.NewLogoutCommand(dockerCli), 89 system.NewVersionCommand(dockerCli), 90 volume.NewVolumeCommand(dockerCli), 91 system.NewInfoCommand(dockerCli), 92 ) 93 plugin.NewPluginCommand(rootCmd, dockerCli) 94 95 rootCmd.PersistentFlags().BoolP("help", "h", false, "Print usage") 96 rootCmd.PersistentFlags().MarkShorthandDeprecated("help", "please use --help") 97 98 return CobraAdaptor{ 99 rootCmd: rootCmd, 100 dockerCli: dockerCli, 101 } 102 } 103 104 // Usage returns the list of commands and their short usage string for 105 // all top level cobra commands. 106 func (c CobraAdaptor) Usage() []cli.Command { 107 cmds := []cli.Command{} 108 for _, cmd := range c.rootCmd.Commands() { 109 if cmd.Name() != "" { 110 cmds = append(cmds, cli.Command{Name: cmd.Name(), Description: cmd.Short}) 111 } 112 } 113 return cmds 114 } 115 116 func (c CobraAdaptor) run(cmd string, args []string) error { 117 if err := c.dockerCli.Initialize(); err != nil { 118 return err 119 } 120 // Prepend the command name to support normal cobra command delegation 121 c.rootCmd.SetArgs(append([]string{cmd}, args...)) 122 return c.rootCmd.Execute() 123 } 124 125 // Command returns a cli command handler if one exists 126 func (c CobraAdaptor) Command(name string) func(...string) error { 127 for _, cmd := range c.rootCmd.Commands() { 128 if cmd.Name() == name { 129 return func(args ...string) error { 130 return c.run(name, args) 131 } 132 } 133 } 134 return nil 135 } 136 137 // GetRootCommand returns the root command. Required to generate the man pages 138 // and reference docs from a script outside this package. 139 func (c CobraAdaptor) GetRootCommand() *cobra.Command { 140 return c.rootCmd 141 } 142 143 var usageTemplate = `Usage: {{if not .HasSubCommands}}{{.UseLine}}{{end}}{{if .HasSubCommands}}{{ .CommandPath}} COMMAND{{end}} 144 145 {{ .Short | trim }}{{if gt .Aliases 0}} 146 147 Aliases: 148 {{.NameAndAliases}}{{end}}{{if .HasExample}} 149 150 Examples: 151 {{ .Example }}{{end}}{{if .HasFlags}} 152 153 Options: 154 {{.Flags.FlagUsages | trimRightSpace}}{{end}}{{ if .HasAvailableSubCommands}} 155 156 Commands:{{range .Commands}}{{if .IsAvailableCommand}} 157 {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasSubCommands }} 158 159 Run '{{.CommandPath}} COMMAND --help' for more information on a command.{{end}} 160 ` 161 162 var helpTemplate = ` 163 {{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`