Skip to content

Commit

Permalink
Support multiple namespaces for docker stack ls
Browse files Browse the repository at this point in the history
Signed-off-by: Mathieu Champlon <mathieu.champlon@docker.com>
  • Loading branch information
mat007 committed May 10, 2018
1 parent 3bfe848 commit 539654c
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 18 deletions.
3 changes: 0 additions & 3 deletions cli/command/stack/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ func NewStackCommand(dockerCli command.Cli) *cobra.Command {
newServicesCommand(dockerCli),
)
flags := cmd.PersistentFlags()
flags.String("namespace", "", "Kubernetes namespace to use")
flags.SetAnnotation("namespace", "kubernetes", nil)
flags.SetAnnotation("namespace", "experimentalCLI", nil)
flags.String("kubeconfig", "", "Kubernetes config file")
flags.SetAnnotation("kubeconfig", "kubernetes", nil)
flags.SetAnnotation("kubeconfig", "experimentalCLI", nil)
Expand Down
1 change: 1 addition & 0 deletions cli/command/stack/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,6 @@ func newDeployCommand(dockerCli command.Cli) *cobra.Command {
`Query the registry to resolve image digest and supported platforms ("`+swarm.ResolveImageAlways+`"|"`+swarm.ResolveImageChanged+`"|"`+swarm.ResolveImageNever+`")`)
flags.SetAnnotation("resolve-image", "version", []string{"1.30"})
flags.SetAnnotation("resolve-image", "swarm", nil)
kubernetes.AddNamespaceFlag(flags)
return cmd
}
8 changes: 7 additions & 1 deletion cli/command/stack/kubernetes/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,15 @@ func NewOptions(flags *flag.FlagSet) Options {
return opts
}

// AddNamespaceFlag adds the namespace flag to the given flag set
func AddNamespaceFlag(flags *flag.FlagSet) {
flags.String("namespace", "", "Kubernetes namespace to use")
flags.SetAnnotation("namespace", "kubernetes", nil)
flags.SetAnnotation("namespace", "experimentalCLI", nil)
}

// WrapCli wraps command.Cli with kubernetes specifics
func WrapCli(dockerCli command.Cli, opts Options) (*KubeCli, error) {
var err error
cli := &KubeCli{
Cli: dockerCli,
}
Expand Down
61 changes: 49 additions & 12 deletions cli/command/stack/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ func newListCommand(dockerCli command.Cli) *cobra.Command {

flags := cmd.Flags()
flags.StringVar(&opts.Format, "format", "", "Pretty-print stacks using a Go template")
flags.StringSliceVar(&opts.Namespaces, "namespace", []string{}, "Kubernetes namespaces to use")
flags.SetAnnotation("namespace", "kubernetes", nil)
flags.SetAnnotation("namespace", "experimentalCLI", nil)
flags.BoolVarP(&opts.AllNamespaces, "all-namespaces", "", false, "List stacks among all Kubernetes namespaces")
flags.SetAnnotation("all-namespaces", "kubernetes", nil)
flags.SetAnnotation("all-namespaces", "experimentalCLI", nil)
Expand All @@ -44,18 +47,26 @@ func runList(cmd *cobra.Command, dockerCli command.Cli, opts options.List) error
stacks = append(stacks, ss...)
}
if dockerCli.ClientInfo().HasKubernetes() {
if dockerCli.ClientInfo().HasAll() && !cmd.Flags().Changed("namespace") {
opts.AllNamespaces = true
kopts := kubernetes.NewOptions(cmd.Flags())
if opts.AllNamespaces || len(opts.Namespaces) == 0 {
if dockerCli.ClientInfo().HasAll() {
opts.AllNamespaces = true
}
ss, err := getStacks(dockerCli, opts, kopts)
if err != nil {
return err
}
stacks = append(stacks, ss...)
} else {
for _, nm := range removeDuplicates(opts.Namespaces) {
kopts.Namespace = nm
ss, err := getStacks(dockerCli, opts, kopts)
if err != nil {
return err
}
stacks = append(stacks, ss...)
}
}
kli, err := kubernetes.WrapCli(dockerCli, kubernetes.NewOptions(cmd.Flags()))
if err != nil {
return err
}
ss, err := kubernetes.GetStacks(kli, opts)
if err != nil {
return err
}
stacks = append(stacks, ss...)
}
format := opts.Format
if format == "" || format == formatter.TableFormatKey {
Expand All @@ -69,7 +80,33 @@ func runList(cmd *cobra.Command, dockerCli command.Cli, opts options.List) error
Format: formatter.Format(format),
}
sort.Slice(stacks, func(i, j int) bool {
return sortorder.NaturalLess(stacks[i].Name, stacks[j].Name)
return sortorder.NaturalLess(stacks[i].Name, stacks[j].Name) ||
!sortorder.NaturalLess(stacks[j].Name, stacks[i].Name) &&
sortorder.NaturalLess(stacks[j].Namespace, stacks[i].Namespace)
})
return formatter.StackWrite(stackCtx, stacks)
}

func getStacks(dockerCli command.Cli, opts options.List, kopts kubernetes.Options) ([]*formatter.Stack, error) {
kli, err := kubernetes.WrapCli(dockerCli, kopts)
if err != nil {
return nil, err
}
ss, err := kubernetes.GetStacks(kli, opts)
if err != nil {
return nil, err
}
return ss, nil
}

func removeDuplicates(namespaces []string) []string {
mnms := map[string]struct{}{}
for _, nm := range namespaces {
mnms[nm] = struct{}{}
}
namespaces = []string{}
for nm := range mnms {
namespaces = append(namespaces, nm)
}
return namespaces
}
1 change: 1 addition & 0 deletions cli/command/stack/options/opts.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ type Deploy struct {
type List struct {
Format string
AllNamespaces bool
Namespaces []string
}

// PS holds docker stack ps options
Expand Down
2 changes: 1 addition & 1 deletion cli/command/stack/ps.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@ func newPsCommand(dockerCli command.Cli) *cobra.Command {
flags.SetAnnotation("filter", "swarm", nil)
flags.BoolVarP(&opts.Quiet, "quiet", "q", false, "Only display task IDs")
flags.StringVar(&opts.Format, "format", "", "Pretty-print tasks using a Go template")

kubernetes.AddNamespaceFlag(flags)
return cmd
}
2 changes: 2 additions & 0 deletions cli/command/stack/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,7 @@ func newRemoveCommand(dockerCli command.Cli) *cobra.Command {
}
},
}
flags := cmd.Flags()
kubernetes.AddNamespaceFlag(flags)
return cmd
}
2 changes: 1 addition & 1 deletion cli/command/stack/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ func newServicesCommand(dockerCli command.Cli) *cobra.Command {
flags.StringVar(&opts.Format, "format", "", "Pretty-print services using a Go template")
flags.VarP(&opts.Filter, "filter", "f", "Filter output based on conditions provided")
flags.SetAnnotation("filter", "swarm", nil)

kubernetes.AddNamespaceFlag(flags)
return cmd
}

0 comments on commit 539654c

Please sign in to comment.