@@ -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 {