Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 8aa4a08

Browse files
authored
fix: properly label by non grouped property (#299)
1 parent 709ca79 commit 8aa4a08

File tree

1 file changed

+56
-21
lines changed

1 file changed

+56
-21
lines changed

internal/cmd/resourcemanager.go

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"io"
66
"sort"
7+
"strings"
78
"text/tabwriter"
89

910
"github.com/spf13/cobra"
@@ -96,11 +97,11 @@ func runResourceTop(options *resourceTopOptions) func(cmd *cobra.Command, args [
9697
var labeler envLabeler
9798
switch options.group {
9899
case "user":
99-
groups, labeler = aggregateByUser(users, orgs, envs, *options)
100+
groups, labeler = aggregateByUser(providers.Kubernetes, users, orgs, envs, *options)
100101
case "org":
101-
groups, labeler = aggregateByOrg(users, orgs, envs, *options)
102+
groups, labeler = aggregateByOrg(providers.Kubernetes, users, orgs, envs, *options)
102103
case "provider":
103-
groups, labeler = aggregateByProvider(providers.Kubernetes, orgs, envs, *options)
104+
groups, labeler = aggregateByProvider(providers.Kubernetes, users, orgs, envs, *options)
104105
default:
105106
return xerrors.Errorf("unknown --group %q", options.group)
106107
}
@@ -109,8 +110,9 @@ func runResourceTop(options *resourceTopOptions) func(cmd *cobra.Command, args [
109110
}
110111
}
111112

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) {
113114
var groups []groupable
115+
providerIDMap := providerIDs(providers)
114116
orgIDMap := make(map[string]coder.Organization)
115117
for _, o := range orgs {
116118
orgIDMap[o.ID] = o
@@ -128,16 +130,22 @@ func aggregateByUser(users []coder.User, orgs []coder.Organization, envs []coder
128130
}
129131
groups = append(groups, userGrouping{user: u, envs: userEnvs[u.ID]})
130132
}
131-
return groups, orgLabeler{orgIDMap}
133+
return groups, labelAll(orgLabeler(orgIDMap), providerLabeler(providerIDMap))
132134
}
133135

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 {
136137
userIDMap := make(map[string]coder.User)
137138
for _, u := range users {
138139
userIDMap[u.ID] = u
139140
}
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)
140147
orgEnvs := make(map[string][]coder.Environment, len(orgs))
148+
userIDMap := userIDs(users)
141149
for _, e := range envs {
142150
if options.user != "" && userIDMap[e.UserID].Email != options.user {
143151
continue
@@ -150,15 +158,21 @@ func aggregateByOrg(users []coder.User, orgs []coder.Organization, envs []coder.
150158
}
151159
groups = append(groups, orgGrouping{org: o, envs: orgEnvs[o.ID]})
152160
}
153-
return groups, userLabeler{userIDMap}
161+
return groups, labelAll(userLabeler(userIDMap), providerLabeler(providerIDMap))
154162
}
155163

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 {
158165
providerIDMap := make(map[string]coder.KubernetesProvider)
159166
for _, p := range providers {
160167
providerIDMap[p.ID] = p
161168
}
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)
162176
providerEnvs := make(map[string][]coder.Environment, len(providers))
163177
for _, e := range envs {
164178
if options.provider != "" && providerIDMap[e.ResourcePoolID].Name != options.provider {
@@ -172,7 +186,7 @@ func aggregateByProvider(providers []coder.KubernetesProvider, _ []coder.Organiz
172186
}
173187
groups = append(groups, providerGrouping{provider: p, envs: providerEnvs[p.ID]})
174188
}
175-
return groups, providerLabeler{providerIDMap}
189+
return groups, labelAll(userLabeler(userIDMap)) // TODO: consider adding an org label here
176190
}
177191

178192
// groupable specifies a structure capable of being an aggregation group of environments (user, org, all).
@@ -316,28 +330,49 @@ type envLabeler interface {
316330
label(coder.Environment) string
317331
}
318332

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()
321346
}
322347

348+
type orgLabeler map[string]coder.Organization
349+
323350
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)
325352
}
326353

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
329358
}
330359

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)
333364
}
334365

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)
337370
}
338371

372+
type providerLabeler map[string]coder.KubernetesProvider
373+
339374
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)
341376
}
342377

343378
func aggregateEnvResources(envs []coder.Environment) resources {

0 commit comments

Comments
 (0)