Skip to content

Commit 370bdd6

Browse files
authored
fix(cli): only init clistat.Client when calling coder stat (#9013)
1 parent c0d1cac commit 370bdd6

File tree

1 file changed

+67
-43
lines changed

1 file changed

+67
-43
lines changed

cli/stat.go

+67-43
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,43 @@ import (
1212
"github.com/coder/coder/cli/cliui"
1313
)
1414

15-
func (r *RootCmd) stat() *clibase.Cmd {
16-
fs := afero.NewReadOnlyFs(afero.NewOsFs())
17-
defaultCols := []string{
18-
"host_cpu",
19-
"host_memory",
20-
"home_disk",
21-
"container_cpu",
22-
"container_memory",
23-
}
24-
formatter := cliui.NewOutputFormatter(
25-
cliui.TableFormat([]statsRow{}, defaultCols),
26-
cliui.JSONFormat(),
27-
)
28-
st, err := clistat.New(clistat.WithFS(fs))
29-
if err != nil {
30-
panic(xerrors.Errorf("initialize workspace stats collector: %w", err))
15+
func initStatterMW(tgt **clistat.Statter, fs afero.Fs) clibase.MiddlewareFunc {
16+
return func(next clibase.HandlerFunc) clibase.HandlerFunc {
17+
return func(i *clibase.Invocation) error {
18+
var err error
19+
stat, err := clistat.New(clistat.WithFS(fs))
20+
if err != nil {
21+
return xerrors.Errorf("initialize workspace stats collector: %w", err)
22+
}
23+
*tgt = stat
24+
return next(i)
25+
}
3126
}
27+
}
3228

29+
func (r *RootCmd) stat() *clibase.Cmd {
30+
var (
31+
st *clistat.Statter
32+
fs = afero.NewReadOnlyFs(afero.NewOsFs())
33+
formatter = cliui.NewOutputFormatter(
34+
cliui.TableFormat([]statsRow{}, []string{
35+
"host_cpu",
36+
"host_memory",
37+
"home_disk",
38+
"container_cpu",
39+
"container_memory",
40+
}),
41+
cliui.JSONFormat(),
42+
)
43+
)
3344
cmd := &clibase.Cmd{
34-
Use: "stat",
35-
Short: "Show resource usage for the current workspace.",
45+
Use: "stat",
46+
Short: "Show resource usage for the current workspace.",
47+
Middleware: initStatterMW(&st, fs),
3648
Children: []*clibase.Cmd{
37-
r.statCPU(st, fs),
38-
r.statMem(st, fs),
39-
r.statDisk(st),
49+
r.statCPU(fs),
50+
r.statMem(fs),
51+
r.statDisk(fs),
4052
},
4153
Handler: func(inv *clibase.Invocation) error {
4254
var sr statsRow
@@ -118,12 +130,16 @@ func (r *RootCmd) stat() *clibase.Cmd {
118130
return cmd
119131
}
120132

121-
func (*RootCmd) statCPU(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
122-
var hostArg bool
123-
formatter := cliui.NewOutputFormatter(cliui.TextFormat(), cliui.JSONFormat())
133+
func (*RootCmd) statCPU(fs afero.Fs) *clibase.Cmd {
134+
var (
135+
hostArg bool
136+
st *clistat.Statter
137+
formatter = cliui.NewOutputFormatter(cliui.TextFormat(), cliui.JSONFormat())
138+
)
124139
cmd := &clibase.Cmd{
125-
Use: "cpu",
126-
Short: "Show CPU usage, in cores.",
140+
Use: "cpu",
141+
Short: "Show CPU usage, in cores.",
142+
Middleware: initStatterMW(&st, fs),
127143
Options: clibase.OptionSet{
128144
{
129145
Flag: "host",
@@ -135,9 +151,9 @@ func (*RootCmd) statCPU(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
135151
var cs *clistat.Result
136152
var err error
137153
if ok, _ := clistat.IsContainerized(fs); ok && !hostArg {
138-
cs, err = s.ContainerCPU()
154+
cs, err = st.ContainerCPU()
139155
} else {
140-
cs, err = s.HostCPU()
156+
cs, err = st.HostCPU()
141157
}
142158
if err != nil {
143159
return err
@@ -155,13 +171,17 @@ func (*RootCmd) statCPU(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
155171
return cmd
156172
}
157173

158-
func (*RootCmd) statMem(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
159-
var hostArg bool
160-
var prefixArg string
161-
formatter := cliui.NewOutputFormatter(cliui.TextFormat(), cliui.JSONFormat())
174+
func (*RootCmd) statMem(fs afero.Fs) *clibase.Cmd {
175+
var (
176+
hostArg bool
177+
prefixArg string
178+
st *clistat.Statter
179+
formatter = cliui.NewOutputFormatter(cliui.TextFormat(), cliui.JSONFormat())
180+
)
162181
cmd := &clibase.Cmd{
163-
Use: "mem",
164-
Short: "Show memory usage, in gigabytes.",
182+
Use: "mem",
183+
Short: "Show memory usage, in gigabytes.",
184+
Middleware: initStatterMW(&st, fs),
165185
Options: clibase.OptionSet{
166186
{
167187
Flag: "host",
@@ -185,9 +205,9 @@ func (*RootCmd) statMem(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
185205
var ms *clistat.Result
186206
var err error
187207
if ok, _ := clistat.IsContainerized(fs); ok && !hostArg {
188-
ms, err = s.ContainerMemory(pfx)
208+
ms, err = st.ContainerMemory(pfx)
189209
} else {
190-
ms, err = s.HostMemory(pfx)
210+
ms, err = st.HostMemory(pfx)
191211
}
192212
if err != nil {
193213
return err
@@ -205,13 +225,17 @@ func (*RootCmd) statMem(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
205225
return cmd
206226
}
207227

208-
func (*RootCmd) statDisk(s *clistat.Statter) *clibase.Cmd {
209-
var pathArg string
210-
var prefixArg string
211-
formatter := cliui.NewOutputFormatter(cliui.TextFormat(), cliui.JSONFormat())
228+
func (*RootCmd) statDisk(fs afero.Fs) *clibase.Cmd {
229+
var (
230+
pathArg string
231+
prefixArg string
232+
st *clistat.Statter
233+
formatter = cliui.NewOutputFormatter(cliui.TextFormat(), cliui.JSONFormat())
234+
)
212235
cmd := &clibase.Cmd{
213-
Use: "disk",
214-
Short: "Show disk usage, in gigabytes.",
236+
Use: "disk",
237+
Short: "Show disk usage, in gigabytes.",
238+
Middleware: initStatterMW(&st, fs),
215239
Options: clibase.OptionSet{
216240
{
217241
Flag: "path",
@@ -237,7 +261,7 @@ func (*RootCmd) statDisk(s *clistat.Statter) *clibase.Cmd {
237261
if len(inv.Args) > 0 {
238262
pathArg = inv.Args[0]
239263
}
240-
ds, err := s.Disk(pfx, pathArg)
264+
ds, err := st.Disk(pfx, pathArg)
241265
if err != nil {
242266
if os.IsNotExist(err) {
243267
//nolint:gocritic // fmt.Errorf produces a more concise error.

0 commit comments

Comments
 (0)