@@ -3,6 +3,7 @@ package cmd
3
3
import (
4
4
"fmt"
5
5
"os"
6
+ "sort"
6
7
"text/tabwriter"
7
8
8
9
"cdr.dev/coder-cli/coder-sdk"
@@ -14,60 +15,79 @@ func makeResourceCmd() *cobra.Command {
14
15
Use : "resources" ,
15
16
Short : "manager Coder resources with platform-level context (users, organizations, environments)" ,
16
17
}
17
- cmd .AddCommand (resourceTop )
18
+ cmd .AddCommand (resourceTop () )
18
19
return cmd
19
20
}
20
21
21
- var resourceTop = & cobra.Command {
22
- Use : "top" ,
23
- RunE : func (cmd * cobra.Command , args []string ) error {
24
- ctx := cmd .Context ()
25
-
26
- client , err := newClient ()
27
- if err != nil {
28
- return err
29
- }
30
-
31
- envs , err := client .ListEnvironments (ctx )
32
- if err != nil {
33
- return err
34
- }
35
-
36
- userEnvs := make (map [string ][]coder.Environment )
37
- for _ , e := range envs {
38
- userEnvs [e .UserID ] = append (userEnvs [e .UserID ], e )
39
- }
40
-
41
- users , err := client .Users (ctx )
42
- if err != nil {
43
- return err
44
- }
45
-
46
- orgs := make (map [string ]coder.Organization )
47
- orglist , err := client .Organizations (ctx )
48
- if err != nil {
49
- return err
50
- }
51
- for _ , o := range orglist {
52
- orgs [o .ID ] = o
53
- }
54
-
55
- tabwriter := tabwriter .NewWriter (os .Stdout , 0 , 0 , 4 , ' ' , 0 )
56
- for _ , u := range users {
57
- _ , _ = fmt .Fprintf (tabwriter , "%s\t (%s)\t %s" , u .Name , u .Email , aggregateEnvResources (userEnvs [u .ID ]))
58
- if len (userEnvs [u .ID ]) > 0 {
59
- _ , _ = fmt .Fprintf (tabwriter , "\f " )
22
+ func resourceTop () * cobra.Command {
23
+ cmd := & cobra.Command {
24
+ Use : "top" ,
25
+ RunE : func (cmd * cobra.Command , args []string ) error {
26
+ ctx := cmd .Context ()
27
+
28
+ client , err := newClient ()
29
+ if err != nil {
30
+ return err
31
+ }
32
+
33
+ envs , err := client .ListEnvironments (ctx )
34
+ if err != nil {
35
+ return err
36
+ }
37
+
38
+ userEnvs := make (map [string ][]coder.Environment )
39
+ for _ , e := range envs {
40
+ userEnvs [e .UserID ] = append (userEnvs [e .UserID ], e )
41
+ }
42
+
43
+ users , err := client .Users (ctx )
44
+ if err != nil {
45
+ return err
46
+ }
47
+
48
+ orgs := make (map [string ]coder.Organization )
49
+ orglist , err := client .Organizations (ctx )
50
+ if err != nil {
51
+ return err
52
+ }
53
+ for _ , o := range orglist {
54
+ orgs [o .ID ] = o
60
55
}
61
- for _ , env := range userEnvs [u .ID ] {
62
- _ , _ = fmt .Fprintf (tabwriter , "\t " )
63
- _ , _ = fmt .Fprintln (tabwriter , fmtEnvResources (env , orgs ))
56
+
57
+ tabwriter := tabwriter .NewWriter (os .Stdout , 0 , 0 , 4 , ' ' , 0 )
58
+ var userResources []aggregatedUser
59
+ for _ , u := range users {
60
+ userResources = append (userResources , aggregatedUser {User : u , resources : aggregateEnvResources (userEnvs [u .ID ])})
64
61
}
65
- fmt .Fprint (tabwriter , "\n " )
66
- }
67
- _ = tabwriter .Flush ()
62
+ sort .Slice (userResources , func (i , j int ) bool {
63
+ return userResources [i ].cpuAllocation > userResources [j ].cpuAllocation
64
+ })
65
+
66
+ for _ , u := range userResources {
67
+ _ , _ = fmt .Fprintf (tabwriter , "%s\t (%s)\t %s" , u .Name , u .Email , u .resources )
68
+ if verbose {
69
+ if len (userEnvs [u .ID ]) > 0 {
70
+ _ , _ = fmt .Fprintf (tabwriter , "\f " )
71
+ }
72
+ for _ , env := range userEnvs [u .ID ] {
73
+ _ , _ = fmt .Fprintf (tabwriter , "\t " )
74
+ _ , _ = fmt .Fprintln (tabwriter , fmtEnvResources (env , orgs ))
75
+ }
76
+ }
77
+ fmt .Fprint (tabwriter , "\n " )
78
+ }
79
+ _ = tabwriter .Flush ()
80
+
81
+ return nil
82
+ },
83
+ }
84
+
85
+ return cmd
86
+ }
68
87
69
- return nil
70
- },
88
+ type aggregatedUser struct {
89
+ coder.User
90
+ resources
71
91
}
72
92
73
93
func resourcesFromEnv (env coder.Environment ) resources {
0 commit comments