diff --git a/cli/command/stack/cmd.go b/cli/command/stack/cmd.go index 1570080d1e..b1ad21dafd 100644 --- a/cli/command/stack/cmd.go +++ b/cli/command/stack/cmd.go @@ -17,6 +17,13 @@ type commonOptions struct { orchestrator command.Orchestrator } +func (o *commonOptions) Orchestrator() command.Orchestrator { + if o == nil { + return command.OrchestratorSwarm + } + return o.orchestrator +} + // NewStackCommand returns a cobra command for `stack` subcommands func NewStackCommand(dockerCli command.Cli) *cobra.Command { var opts commonOptions diff --git a/cli/command/stack/common.go b/cli/command/stack/common.go index 6de410da84..2a89cfad2e 100644 --- a/cli/command/stack/common.go +++ b/cli/command/stack/common.go @@ -4,6 +4,10 @@ import ( "fmt" "strings" "unicode" + + "github.com/docker/cli/cli/command" + "github.com/docker/cli/cli/command/stack/kubernetes" + "github.com/spf13/pflag" ) // validateStackName checks if the provided string is a valid stack name (namespace). @@ -29,3 +33,18 @@ func validateStackNames(namespaces []string) error { func quotesOrWhitespace(r rune) bool { return unicode.IsSpace(r) || r == '"' || r == '\'' } + +func runOrchestratedCommand(dockerCli command.Cli, flags *pflag.FlagSet, commonOrchestrator command.Orchestrator, swarmCmd func() error, kubernetesCmd func(*kubernetes.KubeCli) error) error { + switch { + case commonOrchestrator.HasAll(): + return errUnsupportedAllOrchestrator + case commonOrchestrator.HasKubernetes(): + kli, err := kubernetes.WrapCli(dockerCli, kubernetes.NewOptions(flags, commonOrchestrator)) + if err != nil { + return err + } + return kubernetesCmd(kli) + default: + return swarmCmd() + } +} diff --git a/cli/command/stack/deploy.go b/cli/command/stack/deploy.go index bd4ab32db9..8007572747 100644 --- a/cli/command/stack/deploy.go +++ b/cli/command/stack/deploy.go @@ -50,7 +50,7 @@ func newDeployCommand(dockerCli command.Cli, common *commonOptions) *cobra.Comma if err != nil { return err } - return RunDeploy(dockerCli, cmd.Flags(), config, commonOrchestrator, opts) + return RunDeploy(dockerCli, cmd.Flags(), config, common.Orchestrator(), opts) }, } @@ -75,16 +75,7 @@ func newDeployCommand(dockerCli command.Cli, common *commonOptions) *cobra.Comma // RunDeploy performs a stack deploy against the specified orchestrator func RunDeploy(dockerCli command.Cli, flags *pflag.FlagSet, config *composetypes.Config, commonOrchestrator command.Orchestrator, opts options.Deploy) error { - switch { - case commonOrchestrator.HasAll(): - return errUnsupportedAllOrchestrator - case commonOrchestrator.HasKubernetes(): - kli, err := kubernetes.WrapCli(dockerCli, kubernetes.NewOptions(flags, commonOrchestrator)) - if err != nil { - return errors.Wrap(err, "unable to deploy to Kubernetes") - } - return kubernetes.RunDeploy(kli, opts, config) - default: - return swarm.RunDeploy(dockerCli, opts, config) - } + return runOrchestratedCommand(dockerCli, flags, commonOrchestrator, + func() error { return swarm.RunDeploy(dockerCli, opts, config) }, + func(kli *kubernetes.KubeCli) error { return kubernetes.RunDeploy(kli, opts, config) }) } diff --git a/cli/command/stack/list.go b/cli/command/stack/list.go index bc06926e73..697cbcce1d 100644 --- a/cli/command/stack/list.go +++ b/cli/command/stack/list.go @@ -22,7 +22,7 @@ func newListCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command Short: "List stacks", Args: cli.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return runList(cmd, dockerCli, opts, common.orchestrator) + return RunList(cmd, dockerCli, opts, common.orchestrator) }, } @@ -35,7 +35,8 @@ func newListCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command return cmd } -func runList(cmd *cobra.Command, dockerCli command.Cli, opts options.List, orchestrator command.Orchestrator) error { +// RunList performs a stack list against the specified orchestrator +func RunList(cmd *cobra.Command, dockerCli command.Cli, opts options.List, orchestrator command.Orchestrator) error { stacks := []*formatter.Stack{} if orchestrator.HasSwarm() { ss, err := swarm.GetStacks(dockerCli) diff --git a/cli/command/stack/ps.go b/cli/command/stack/ps.go index 4d6215351b..ae692d4e13 100644 --- a/cli/command/stack/ps.go +++ b/cli/command/stack/ps.go @@ -8,6 +8,7 @@ import ( "github.com/docker/cli/cli/command/stack/swarm" cliopts "github.com/docker/cli/opts" "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func newPsCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command { @@ -22,19 +23,7 @@ func newPsCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command { if err := validateStackName(opts.Namespace); err != nil { return err } - - switch { - case common.orchestrator.HasAll(): - return errUnsupportedAllOrchestrator - case common.orchestrator.HasKubernetes(): - kli, err := kubernetes.WrapCli(dockerCli, kubernetes.NewOptions(cmd.Flags(), common.orchestrator)) - if err != nil { - return err - } - return kubernetes.RunPS(kli, opts) - default: - return swarm.RunPS(dockerCli, opts) - } + return RunPs(dockerCli, cmd.Flags(), common.Orchestrator(), opts) }, } flags := cmd.Flags() @@ -46,3 +35,10 @@ func newPsCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command { kubernetes.AddNamespaceFlag(flags) return cmd } + +// RunPs performs a stack ps against the specified orchestrator +func RunPs(dockerCli command.Cli, flags *pflag.FlagSet, commonOrchestrator command.Orchestrator, opts options.PS) error { + return runOrchestratedCommand(dockerCli, flags, commonOrchestrator, + func() error { return swarm.RunPS(dockerCli, opts) }, + func(kli *kubernetes.KubeCli) error { return kubernetes.RunPS(kli, opts) }) +} diff --git a/cli/command/stack/remove.go b/cli/command/stack/remove.go index 737713e48a..a8dceff2bb 100644 --- a/cli/command/stack/remove.go +++ b/cli/command/stack/remove.go @@ -7,6 +7,7 @@ import ( "github.com/docker/cli/cli/command/stack/options" "github.com/docker/cli/cli/command/stack/swarm" "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func newRemoveCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command { @@ -22,22 +23,17 @@ func newRemoveCommand(dockerCli command.Cli, common *commonOptions) *cobra.Comma if err := validateStackNames(opts.Namespaces); err != nil { return err } - - switch { - case common.orchestrator.HasAll(): - return errUnsupportedAllOrchestrator - case common.orchestrator.HasKubernetes(): - kli, err := kubernetes.WrapCli(dockerCli, kubernetes.NewOptions(cmd.Flags(), common.orchestrator)) - if err != nil { - return err - } - return kubernetes.RunRemove(kli, opts) - default: - return swarm.RunRemove(dockerCli, opts) - } + return RunRemove(dockerCli, cmd.Flags(), common.Orchestrator(), opts) }, } flags := cmd.Flags() kubernetes.AddNamespaceFlag(flags) return cmd } + +// RunRemove performs a stack remove against the specified orchestrator +func RunRemove(dockerCli command.Cli, flags *pflag.FlagSet, commonOrchestrator command.Orchestrator, opts options.Remove) error { + return runOrchestratedCommand(dockerCli, flags, commonOrchestrator, + func() error { return swarm.RunRemove(dockerCli, opts) }, + func(kli *kubernetes.KubeCli) error { return kubernetes.RunRemove(kli, opts) }) +} diff --git a/cli/command/stack/services.go b/cli/command/stack/services.go index ca6d42c231..d875fa73a2 100644 --- a/cli/command/stack/services.go +++ b/cli/command/stack/services.go @@ -8,6 +8,7 @@ import ( "github.com/docker/cli/cli/command/stack/swarm" cliopts "github.com/docker/cli/opts" "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func newServicesCommand(dockerCli command.Cli, common *commonOptions) *cobra.Command { @@ -22,19 +23,7 @@ func newServicesCommand(dockerCli command.Cli, common *commonOptions) *cobra.Com if err := validateStackName(opts.Namespace); err != nil { return err } - - switch { - case common.orchestrator.HasAll(): - return errUnsupportedAllOrchestrator - case common.orchestrator.HasKubernetes(): - kli, err := kubernetes.WrapCli(dockerCli, kubernetes.NewOptions(cmd.Flags(), common.orchestrator)) - if err != nil { - return err - } - return kubernetes.RunServices(kli, opts) - default: - return swarm.RunServices(dockerCli, opts) - } + return RunServices(dockerCli, cmd.Flags(), common.Orchestrator(), opts) }, } flags := cmd.Flags() @@ -44,3 +33,10 @@ func newServicesCommand(dockerCli command.Cli, common *commonOptions) *cobra.Com kubernetes.AddNamespaceFlag(flags) return cmd } + +// RunServices performs a stack services against the specified orchestrator +func RunServices(dockerCli command.Cli, flags *pflag.FlagSet, commonOrchestrator command.Orchestrator, opts options.Services) error { + return runOrchestratedCommand(dockerCli, flags, commonOrchestrator, + func() error { return swarm.RunServices(dockerCli, opts) }, + func(kli *kubernetes.KubeCli) error { return kubernetes.RunServices(kli, opts) }) +}