| 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", | |
| }) | |
| } |