4
4
"fmt"
5
5
"io"
6
6
"sort"
7
+ "strings"
7
8
"text/tabwriter"
8
9
9
10
"github.com/spf13/cobra"
@@ -96,11 +97,11 @@ func runResourceTop(options *resourceTopOptions) func(cmd *cobra.Command, args [
96
97
var labeler envLabeler
97
98
switch options .group {
98
99
case "user" :
99
- groups , labeler = aggregateByUser (users , orgs , envs , * options )
100
+ groups , labeler = aggregateByUser (providers . Kubernetes , users , orgs , envs , * options )
100
101
case "org" :
101
- groups , labeler = aggregateByOrg (users , orgs , envs , * options )
102
+ groups , labeler = aggregateByOrg (providers . Kubernetes , users , orgs , envs , * options )
102
103
case "provider" :
103
- groups , labeler = aggregateByProvider (providers .Kubernetes , orgs , envs , * options )
104
+ groups , labeler = aggregateByProvider (providers .Kubernetes , users , orgs , envs , * options )
104
105
default :
105
106
return xerrors .Errorf ("unknown --group %q" , options .group )
106
107
}
@@ -109,8 +110,9 @@ func runResourceTop(options *resourceTopOptions) func(cmd *cobra.Command, args [
109
110
}
110
111
}
111
112
112
- func aggregateByUser (users []coder.User , orgs []coder.Organization , envs []coder.Environment , options resourceTopOptions ) ([]groupable , envLabeler ) {
113
+ func aggregateByUser (providers []coder. KubernetesProvider , users []coder.User , orgs []coder.Organization , envs []coder.Environment , options resourceTopOptions ) ([]groupable , envLabeler ) {
113
114
var groups []groupable
115
+ providerIDMap := providerIDs (providers )
114
116
orgIDMap := make (map [string ]coder.Organization )
115
117
for _ , o := range orgs {
116
118
orgIDMap [o .ID ] = o
@@ -128,16 +130,22 @@ func aggregateByUser(users []coder.User, orgs []coder.Organization, envs []coder
128
130
}
129
131
groups = append (groups , userGrouping {user : u , envs : userEnvs [u .ID ]})
130
132
}
131
- return groups , orgLabeler { orgIDMap }
133
+ return groups , labelAll ( orgLabeler ( orgIDMap ), providerLabeler ( providerIDMap ))
132
134
}
133
135
134
- func aggregateByOrg (users []coder.User , orgs []coder.Organization , envs []coder.Environment , options resourceTopOptions ) ([]groupable , envLabeler ) {
135
- var groups []groupable
136
+ func userIDs (users []coder.User ) map [string ]coder.User {
136
137
userIDMap := make (map [string ]coder.User )
137
138
for _ , u := range users {
138
139
userIDMap [u .ID ] = u
139
140
}
141
+ return userIDMap
142
+ }
143
+
144
+ func aggregateByOrg (providers []coder.KubernetesProvider , users []coder.User , orgs []coder.Organization , envs []coder.Environment , options resourceTopOptions ) ([]groupable , envLabeler ) {
145
+ var groups []groupable
146
+ providerIDMap := providerIDs (providers )
140
147
orgEnvs := make (map [string ][]coder.Environment , len (orgs ))
148
+ userIDMap := userIDs (users )
141
149
for _ , e := range envs {
142
150
if options .user != "" && userIDMap [e .UserID ].Email != options .user {
143
151
continue
@@ -150,15 +158,21 @@ func aggregateByOrg(users []coder.User, orgs []coder.Organization, envs []coder.
150
158
}
151
159
groups = append (groups , orgGrouping {org : o , envs : orgEnvs [o .ID ]})
152
160
}
153
- return groups , userLabeler { userIDMap }
161
+ return groups , labelAll ( userLabeler ( userIDMap ), providerLabeler ( providerIDMap ))
154
162
}
155
163
156
- func aggregateByProvider (providers []coder.KubernetesProvider , _ []coder.Organization , envs []coder.Environment , options resourceTopOptions ) ([]groupable , envLabeler ) {
157
- var groups []groupable
164
+ func providerIDs (providers []coder.KubernetesProvider ) map [string ]coder.KubernetesProvider {
158
165
providerIDMap := make (map [string ]coder.KubernetesProvider )
159
166
for _ , p := range providers {
160
167
providerIDMap [p .ID ] = p
161
168
}
169
+ return providerIDMap
170
+ }
171
+
172
+ func aggregateByProvider (providers []coder.KubernetesProvider , users []coder.User , _ []coder.Organization , envs []coder.Environment , options resourceTopOptions ) ([]groupable , envLabeler ) {
173
+ var groups []groupable
174
+ providerIDMap := providerIDs (providers )
175
+ userIDMap := userIDs (users )
162
176
providerEnvs := make (map [string ][]coder.Environment , len (providers ))
163
177
for _ , e := range envs {
164
178
if options .provider != "" && providerIDMap [e .ResourcePoolID ].Name != options .provider {
@@ -172,7 +186,7 @@ func aggregateByProvider(providers []coder.KubernetesProvider, _ []coder.Organiz
172
186
}
173
187
groups = append (groups , providerGrouping {provider : p , envs : providerEnvs [p .ID ]})
174
188
}
175
- return groups , providerLabeler { providerIDMap }
189
+ return groups , labelAll ( userLabeler ( userIDMap )) // TODO: consider adding an org label here
176
190
}
177
191
178
192
// groupable specifies a structure capable of being an aggregation group of environments (user, org, all).
@@ -316,28 +330,49 @@ type envLabeler interface {
316
330
label (coder.Environment ) string
317
331
}
318
332
319
- type orgLabeler struct {
320
- orgMap map [string ]coder.Organization
333
+ func labelAll (labels ... envLabeler ) envLabeler { return multiLabeler (labels ) }
334
+
335
+ type multiLabeler []envLabeler
336
+
337
+ func (m multiLabeler ) label (e coder.Environment ) string {
338
+ var str strings.Builder
339
+ for i , labeler := range m {
340
+ if i != 0 {
341
+ str .WriteString ("\t " )
342
+ }
343
+ str .WriteString (labeler .label (e ))
344
+ }
345
+ return str .String ()
321
346
}
322
347
348
+ type orgLabeler map [string ]coder.Organization
349
+
323
350
func (o orgLabeler ) label (e coder.Environment ) string {
324
- return fmt .Sprintf ("[org: %s]" , o . orgMap [e .OrganizationID ].Name )
351
+ return fmt .Sprintf ("[org: %s]" , o [e .OrganizationID ].Name )
325
352
}
326
353
327
- type userLabeler struct {
328
- userMap map [string ]coder.User
354
+ // TODO: implement
355
+ //nolint
356
+ type imgLabeler struct {
357
+ imgMap map [string ]coder.Image
329
358
}
330
359
331
- func (u userLabeler ) label (e coder.Environment ) string {
332
- return fmt .Sprintf ("[user: %s]" , u .userMap [e .UserID ].Email )
360
+ // TODO: implement
361
+ //nolint
362
+ func (i imgLabeler ) label (e coder.Environment ) string {
363
+ return fmt .Sprintf ("[img: %s:%s]" , i .imgMap [e .ImageID ].Repository , e .ImageTag )
333
364
}
334
365
335
- type providerLabeler struct {
336
- providerMap map [string ]coder.KubernetesProvider
366
+ type userLabeler map [string ]coder.User
367
+
368
+ func (u userLabeler ) label (e coder.Environment ) string {
369
+ return fmt .Sprintf ("[user: %s]" , u [e .UserID ].Email )
337
370
}
338
371
372
+ type providerLabeler map [string ]coder.KubernetesProvider
373
+
339
374
func (p providerLabeler ) label (e coder.Environment ) string {
340
- return fmt .Sprintf ("[provider: %s]" , p . providerMap [e .ResourcePoolID ].Name )
375
+ return fmt .Sprintf ("[provider: %s]" , p [e .ResourcePoolID ].Name )
341
376
}
342
377
343
378
func aggregateEnvResources (envs []coder.Environment ) resources {
0 commit comments