@@ -28,6 +28,9 @@ func newListCommand(dockerCli command.Cli) *cobra.Command {
2828
2929 flags := cmd .Flags ()
3030 flags .StringVar (& opts .Format , "format" , "" , "Pretty-print stacks using a Go template" )
31+ flags .StringSliceVar (& opts .Namespaces , "namespace" , []string {}, "Kubernetes namespaces to use" )
32+ flags .SetAnnotation ("namespace" , "kubernetes" , nil )
33+ flags .SetAnnotation ("namespace" , "experimentalCLI" , nil )
3134 flags .BoolVarP (& opts .AllNamespaces , "all-namespaces" , "" , false , "List stacks among all Kubernetes namespaces" )
3235 flags .SetAnnotation ("all-namespaces" , "kubernetes" , nil )
3336 flags .SetAnnotation ("all-namespaces" , "experimentalCLI" , nil )
@@ -44,18 +47,26 @@ func runList(cmd *cobra.Command, dockerCli command.Cli, opts options.List) error
4447 stacks = append (stacks , ss ... )
4548 }
4649 if dockerCli .ClientInfo ().HasKubernetes () {
47- if dockerCli .ClientInfo ().HasAll () && ! cmd .Flags ().Changed ("namespace" ) {
48- opts .AllNamespaces = true
50+ kopts := kubernetes .NewOptions (cmd .Flags ())
51+ if opts .AllNamespaces || len (opts .Namespaces ) == 0 {
52+ if dockerCli .ClientInfo ().HasAll () {
53+ opts .AllNamespaces = true
54+ }
55+ ss , err := getStacks (dockerCli , opts , kopts )
56+ if err != nil {
57+ return err
58+ }
59+ stacks = append (stacks , ss ... )
60+ } else {
61+ for _ , nm := range removeDuplicates (opts .Namespaces ) {
62+ kopts .Namespace = nm
63+ ss , err := getStacks (dockerCli , opts , kopts )
64+ if err != nil {
65+ return err
66+ }
67+ stacks = append (stacks , ss ... )
68+ }
4969 }
50- kli , err := kubernetes .WrapCli (dockerCli , kubernetes .NewOptions (cmd .Flags ()))
51- if err != nil {
52- return err
53- }
54- ss , err := kubernetes .GetStacks (kli , opts )
55- if err != nil {
56- return err
57- }
58- stacks = append (stacks , ss ... )
5970 }
6071 format := opts .Format
6172 if format == "" || format == formatter .TableFormatKey {
@@ -69,7 +80,33 @@ func runList(cmd *cobra.Command, dockerCli command.Cli, opts options.List) error
6980 Format : formatter .Format (format ),
7081 }
7182 sort .Slice (stacks , func (i , j int ) bool {
72- return sortorder .NaturalLess (stacks [i ].Name , stacks [j ].Name )
83+ return sortorder .NaturalLess (stacks [i ].Name , stacks [j ].Name ) ||
84+ ! sortorder .NaturalLess (stacks [j ].Name , stacks [i ].Name ) &&
85+ sortorder .NaturalLess (stacks [j ].Namespace , stacks [i ].Namespace )
7386 })
7487 return formatter .StackWrite (stackCtx , stacks )
7588}
89+
90+ func getStacks (dockerCli command.Cli , opts options.List , kopts kubernetes.Options ) ([]* formatter.Stack , error ) {
91+ kli , err := kubernetes .WrapCli (dockerCli , kopts )
92+ if err != nil {
93+ return nil , err
94+ }
95+ ss , err := kubernetes .GetStacks (kli , opts )
96+ if err != nil {
97+ return nil , err
98+ }
99+ return ss , nil
100+ }
101+
102+ func removeDuplicates (namespaces []string ) []string {
103+ mnms := map [string ]struct {}{}
104+ for _ , nm := range namespaces {
105+ mnms [nm ] = struct {}{}
106+ }
107+ namespaces = []string {}
108+ for nm := range mnms {
109+ namespaces = append (namespaces , nm )
110+ }
111+ return namespaces
112+ }
0 commit comments