| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "os" |
| |
| "github.com/docker/cli/cli-plugins/metadata" |
| "github.com/docker/cli/cli-plugins/plugin" |
| "github.com/docker/cli/cli/command" |
| "github.com/moby/moby/client" |
| "github.com/spf13/cobra" |
| ) |
| |
| func main() { |
| plugin.Run(func(dockerCLI command.Cli) *cobra.Command { |
| goodbye := &cobra.Command{ |
| Use: "goodbye", |
| Short: "Say Goodbye instead of Hello", |
| Run: func(cmd *cobra.Command, _ []string) { |
| _, _ = fmt.Fprintln(dockerCLI.Out(), "Goodbye World!") |
| }, |
| } |
| apiversion := &cobra.Command{ |
| Use: "apiversion", |
| Short: "Print the API version of the server", |
| RunE: func(_ *cobra.Command, _ []string) error { |
| apiClient := dockerCLI.Client() |
| ping, err := apiClient.Ping(context.Background(), client.PingOptions{}) |
| if err != nil { |
| return err |
| } |
| _, _ = fmt.Println(ping.APIVersion) |
| return nil |
| }, |
| } |
| |
| exitStatus2 := &cobra.Command{ |
| Use: "exitstatus2", |
| Short: "Exit with status 2", |
| RunE: func(_ *cobra.Command, _ []string) error { |
| _, _ = fmt.Fprintln(dockerCLI.Err(), "Exiting with error status 2") |
| os.Exit(2) |
| return nil |
| }, |
| } |
| |
| var ( |
| who, optContext string |
| preRun, debug bool |
| ) |
| cmd := &cobra.Command{ |
| Use: "helloworld", |
| Short: "A basic Hello World plugin for tests", |
| PersistentPreRunE: func(cmd *cobra.Command, args []string) error { |
| if err := plugin.PersistentPreRunE(cmd, args); err != nil { |
| return err |
| } |
| if preRun { |
| _, _ = fmt.Fprintln(dockerCLI.Err(), "Plugin PersistentPreRunE called") |
| } |
| return nil |
| }, |
| RunE: func(cmd *cobra.Command, args []string) error { |
| if debug { |
| _, _ = fmt.Fprintln(dockerCLI.Err(), "Plugin debug mode enabled") |
| } |
| |
| switch optContext { |
| case "Christmas": |
| _, _ = fmt.Fprintln(dockerCLI.Out(), "Merry Christmas!") |
| return nil |
| case "": |
| // nothing |
| } |
| |
| if who == "" { |
| who, _ = dockerCLI.ConfigFile().PluginConfig("helloworld", "who") |
| } |
| if who == "" { |
| who = "World" |
| } |
| |
| _, _ = fmt.Fprintln(dockerCLI.Out(), "Hello", who) |
| dockerCLI.ConfigFile().SetPluginConfig("helloworld", "lastwho", who) |
| return dockerCLI.ConfigFile().Save() |
| }, |
| } |
| |
| flags := cmd.Flags() |
| flags.StringVar(&who, "who", "", "Who are we addressing?") |
| flags.BoolVar(&preRun, "pre-run", false, "Log from prerun hook") |
| // These are intended to deliberately clash with the CLIs own top |
| // level arguments. |
| flags.BoolVarP(&debug, "debug", "D", false, "Enable debug") |
| flags.StringVarP(&optContext, "context", "c", "", "Is it Christmas?") |
| |
| cmd.AddCommand(goodbye, apiversion, exitStatus2) |
| return cmd |
| }, |
| metadata.Metadata{ |
| SchemaVersion: "0.1.0", |
| Vendor: "Docker Inc.", |
| Version: "testing", |
| }) |
| } |