diff --git a/cli/command/stack/common.go b/cli/command/stack/common.go index 6de410da84c3..58fc56eea526 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,23 @@ func validateStackNames(namespaces []string) error { func quotesOrWhitespace(r rune) bool { return unicode.IsSpace(r) || r == '"' || r == '\'' } + +func runOrchestratedCommand(dockerCli command.Cli, flags *pflag.FlagSet, common *commonOptions, swarmCmd func() error, kubernetesCmd func(*kubernetes.KubeCli) error) error { + commonOrchestrator := command.OrchestratorSwarm // default for top-level deploy command + if common != nil { + commonOrchestrator = common.orchestrator + } + //return RunPs(dockerCli, cmd.Flags(), commonOrchestrator, opts) + 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 bd4ab32db90f..f6e55f1c6ec8 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, opts) }, } @@ -74,17 +74,8 @@ 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) - } +func RunDeploy(dockerCli command.Cli, flags *pflag.FlagSet, config *composetypes.Config, common *commonOptions, opts options.Deploy) error { + return runOrchestratedCommand(dockerCli, flags, common, + 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/ps.go b/cli/command/stack/ps.go index 4d6215351b77..026726ee0cc3 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, 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, common *commonOptions, opts options.PS) error { + return runOrchestratedCommand(dockerCli, flags, common, + 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 737713e48a78..3a740b25de74 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, 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, common *commonOptions, opts options.Remove) error { + return runOrchestratedCommand(dockerCli, flags, common, + 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 ca6d42c23149..91a4bad10e48 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, 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, common *commonOptions, opts options.Services) error { + return runOrchestratedCommand(dockerCli, flags, common, + func() error { return swarm.RunServices(dockerCli, opts) }, + func(kli *kubernetes.KubeCli) error { return kubernetes.RunServices(kli, opts) }) +}