Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Aug 30, 2024. It is now read-only.
/coder-v1-cliPublic archive

Commit902d17f

Browse files
committed
Abstract env resource grouping and label properly
1 parentb3e8ec9 commit902d17f

File tree

1 file changed

+104
-23
lines changed

1 file changed

+104
-23
lines changed

‎internal/cmd/resourcemanager.go

Lines changed: 104 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func makeResourceCmd() *cobra.Command {
2323
}
2424

2525
funcresourceTop()*cobra.Command {
26+
vargroupstring
2627
cmd:=&cobra.Command{
2728
Use:"top",
2829
RunE:func(cmd*cobra.Command,args []string)error {
@@ -39,64 +40,124 @@ func resourceTop() *cobra.Command {
3940
returnxerrors.Errorf("get environments %w",err)
4041
}
4142

42-
userEnvs:=make(map[string][]coder.Environment)
43-
for_,e:=rangeenvs {
44-
userEnvs[e.UserID]=append(userEnvs[e.UserID],e)
45-
}
46-
4743
users,err:=client.Users(ctx)
4844
iferr!=nil {
4945
returnxerrors.Errorf("get users: %w",err)
5046
}
5147

52-
orgIDMap:=make(map[string]coder.Organization)
53-
orglist,err:=client.Organizations(ctx)
48+
orgs,err:=client.Organizations(ctx)
5449
iferr!=nil {
5550
returnxerrors.Errorf("get organizations: %w",err)
5651
}
57-
for_,o:=rangeorglist {
58-
orgIDMap[o.ID]=o
52+
53+
vargroups []groupable
54+
varlabelerenvLabeler
55+
switchgroup {
56+
case"user":
57+
userEnvs:=make(map[string][]coder.Environment,len(users))
58+
for_,e:=rangeenvs {
59+
userEnvs[e.UserID]=append(userEnvs[e.UserID],e)
60+
}
61+
for_,u:=rangeusers {
62+
groups=append(groups,userGrouping{user:u,envs:userEnvs[u.ID]})
63+
}
64+
orgIDMap:=make(map[string]coder.Organization)
65+
for_,o:=rangeorgs {
66+
orgIDMap[o.ID]=o
67+
}
68+
labeler=orgLabeler{orgIDMap}
69+
case"org":
70+
orgEnvs:=make(map[string][]coder.Environment,len(orgs))
71+
for_,e:=rangeenvs {
72+
orgEnvs[e.OrganizationID]=append(orgEnvs[e.OrganizationID],e)
73+
}
74+
for_,o:=rangeorgs {
75+
groups=append(groups,orgGrouping{org:o,envs:orgEnvs[o.ID]})
76+
}
77+
userIDMap:=make(map[string]coder.User)
78+
for_,u:=rangeusers {
79+
userIDMap[u.ID]=u
80+
}
81+
labeler=userLabeler{userIDMap}
82+
default:
83+
returnxerrors.Errorf("unknown --group %q",group)
5984
}
6085

61-
printResourceTop(os.Stdout,users,orgIDMap,userEnvs)
86+
printResourceTop(os.Stdout,groups,labeler)
6287
returnnil
6388
},
6489
}
90+
cmd.Flags().StringVar(&group,"group","user","the grouping parameter (user|org|all)")
6591

6692
returncmd
6793
}
6894

69-
funcprintResourceTop(writer io.Writer,users []coder.User,orgIDMapmap[string]coder.Organization,userEnvsmap[string][]coder.Environment) {
95+
// groupable specifies a structure capable of being an aggregation group of environments (user, org, all)
96+
typegroupableinterface {
97+
header()string
98+
environments() []coder.Environment
99+
}
100+
101+
typeuserGroupingstruct {
102+
user coder.User
103+
envs []coder.Environment
104+
}
105+
106+
func (uuserGrouping)environments() []coder.Environment {
107+
returnu.envs
108+
}
109+
110+
func (uuserGrouping)header()string {
111+
returnfmt.Sprintf("%s\t(%s)",truncate(u.user.Name,20,"..."),u.user.Email)
112+
}
113+
114+
typeorgGroupingstruct {
115+
org coder.Organization
116+
envs []coder.Environment
117+
}
118+
119+
func (oorgGrouping)environments() []coder.Environment {
120+
returno.envs
121+
}
122+
123+
func (oorgGrouping)header()string {
124+
plural:="s"
125+
iflen(o.org.Members)<2 {
126+
plural=""
127+
}
128+
returnfmt.Sprintf("%s\t(%v member%s)",truncate(o.org.Name,20,"..."),len(o.org.Members),plural)
129+
}
130+
131+
funcprintResourceTop(writer io.Writer,groups []groupable,labelerenvLabeler) {
70132
tabwriter:=tabwriter.NewWriter(writer,0,0,4,' ',0)
71133
deferfunc() {_=tabwriter.Flush() }()
72134

73-
varuserResources []aggregatedUser
74-
for_,u:=rangeusers {
135+
varuserResources []aggregatedResources
136+
for_,group:=rangegroups {
75137
// truncate user names to ensure tabwriter doesn't push our entire table too far
76-
u.Name=truncate(u.Name,20,"...")
77-
userResources=append(userResources,aggregatedUser{User:u,resources:aggregateEnvResources(userEnvs[u.ID])})
138+
userResources=append(userResources,aggregatedResources{groupable:group,resources:aggregateEnvResources(group.environments())})
78139
}
79140
sort.Slice(userResources,func(i,jint)bool {
80141
returnuserResources[i].cpuAllocation>userResources[j].cpuAllocation
81142
})
82143

83144
for_,u:=rangeuserResources {
84-
_,_=fmt.Fprintf(tabwriter,"%s\t(%s)\t%s",u.Name,u.Email,u.resources)
145+
_,_=fmt.Fprintf(tabwriter,"%s\t%s",u.header(),u.resources)
85146
ifverbose {
86-
iflen(userEnvs[u.ID])>0 {
147+
iflen(u.environments())>0 {
87148
_,_=fmt.Fprintf(tabwriter,"\f")
88149
}
89-
for_,env:=rangeuserEnvs[u.ID] {
150+
for_,env:=rangeu.environments() {
90151
_,_=fmt.Fprintf(tabwriter,"\t")
91-
_,_=fmt.Fprintln(tabwriter,fmtEnvResources(env,orgIDMap))
152+
_,_=fmt.Fprintln(tabwriter,fmtEnvResources(env,labeler))
92153
}
93154
}
94155
_,_=fmt.Fprint(tabwriter,"\n")
95156
}
96157
}
97158

98-
typeaggregatedUserstruct {
99-
coder.User
159+
typeaggregatedResourcesstruct {
160+
groupable
100161
resources
101162
}
102163

@@ -109,8 +170,28 @@ func resourcesFromEnv(env coder.Environment) resources {
109170
}
110171
}
111172

112-
funcfmtEnvResources(env coder.Environment,orgsmap[string]coder.Organization)string {
113-
returnfmt.Sprintf("%s\t%s\t[org: %s]",env.Name,resourcesFromEnv(env),orgs[env.OrganizationID].Name)
173+
funcfmtEnvResources(env coder.Environment,labelerenvLabeler)string {
174+
returnfmt.Sprintf("%s\t%s\t%s",env.Name,resourcesFromEnv(env),labeler.label(env))
175+
}
176+
177+
typeenvLabelerinterface {
178+
label(coder.Environment)string
179+
}
180+
181+
typeorgLabelerstruct {
182+
orgMapmap[string]coder.Organization
183+
}
184+
185+
func (oorgLabeler)label(e coder.Environment)string {
186+
returnfmt.Sprintf("[org: %s]",o.orgMap[e.OrganizationID].Name)
187+
}
188+
189+
typeuserLabelerstruct {
190+
userMapmap[string]coder.User
191+
}
192+
193+
func (uuserLabeler)label(e coder.Environment)string {
194+
returnfmt.Sprintf("[user: %s]",u.userMap[e.UserID].Email)
114195
}
115196

116197
funcaggregateEnvResources(envs []coder.Environment)resources {

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp