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