The completion functions only need the API-client, and not all of the CLI. However, passing the API-client as argument would mean that the API-client is initialized early, which may not be what we want, so instead, defining an APIClientProvider interface to preserve the behavior of initializing when needed only. While updating, also simplify stack.format to only require an io.Writer. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
51 lines
1.4 KiB
Go
51 lines
1.4 KiB
Go
package service
|
|
|
|
import (
|
|
"github.com/docker/cli/cli"
|
|
"github.com/docker/cli/cli/command"
|
|
"github.com/docker/cli/cli/command/completion"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
// NewServiceCommand returns a cobra command for `service` subcommands
|
|
func NewServiceCommand(dockerCli command.Cli) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "service",
|
|
Short: "Manage Swarm services",
|
|
Args: cli.NoArgs,
|
|
RunE: command.ShowHelp(dockerCli.Err()),
|
|
Annotations: map[string]string{
|
|
"version": "1.24",
|
|
"swarm": "manager",
|
|
},
|
|
}
|
|
cmd.AddCommand(
|
|
newCreateCommand(dockerCli),
|
|
newInspectCommand(dockerCli),
|
|
newPsCommand(dockerCli),
|
|
newListCommand(dockerCli),
|
|
newRemoveCommand(dockerCli),
|
|
newScaleCommand(dockerCli),
|
|
newUpdateCommand(dockerCli),
|
|
newLogsCommand(dockerCli),
|
|
newRollbackCommand(dockerCli),
|
|
)
|
|
return cmd
|
|
}
|
|
|
|
// CompletionFn offers completion for swarm services
|
|
func CompletionFn(dockerCLI completion.APIClientProvider) completion.ValidArgsFn {
|
|
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
|
list, err := dockerCLI.Client().ServiceList(cmd.Context(), types.ServiceListOptions{})
|
|
if err != nil {
|
|
return nil, cobra.ShellCompDirectiveError
|
|
}
|
|
var names []string
|
|
for _, service := range list {
|
|
names = append(names, service.ID)
|
|
}
|
|
return names, cobra.ShellCompDirectiveNoFileComp
|
|
}
|
|
}
|