@@ -9,8 +9,10 @@ import (
9
9
"cdr.dev/coder-cli/coder-sdk"
10
10
"cdr.dev/coder-cli/internal/clog"
11
11
"cdr.dev/coder-cli/internal/x/xtabwriter"
12
+ "github.com/manifoldco/promptui"
12
13
"github.com/spf13/cobra"
13
14
"golang.org/x/sync/errgroup"
15
+ "golang.org/x/sync/semaphore"
14
16
"golang.org/x/xerrors"
15
17
)
16
18
@@ -24,7 +26,6 @@ const (
24
26
)
25
27
26
28
func envsCommand () * cobra.Command {
27
- var outputFmt string
28
29
var user string
29
30
cmd := & cobra.Command {
30
31
Use : "envs" ,
@@ -33,7 +34,22 @@ func envsCommand() *cobra.Command {
33
34
}
34
35
cmd .PersistentFlags ().StringVar (& user , "user" , coder .Me , "Specify the user whose resources to target" )
35
36
36
- lsCmd := & cobra.Command {
37
+ cmd .AddCommand (
38
+ lsEnvsCommand (& user ),
39
+ stopEnvsCommand (& user ),
40
+ rmEnvsCommand (& user ),
41
+ watchBuildLogCommand (),
42
+ rebuildEnvCommand (),
43
+ createEnvCommand (),
44
+ editEnvCommand (& user ),
45
+ )
46
+ return cmd
47
+ }
48
+
49
+ func lsEnvsCommand (user * string ) * cobra.Command {
50
+ var outputFmt string
51
+
52
+ cmd := & cobra.Command {
37
53
Use : "ls" ,
38
54
Short : "list all environments owned by the active user" ,
39
55
Long : "List all Coder environments owned by the active user." ,
@@ -42,7 +58,7 @@ func envsCommand() *cobra.Command {
42
58
if err != nil {
43
59
return err
44
60
}
45
- envs , err := getEnvs (cmd .Context (), client , user )
61
+ envs , err := getEnvs (cmd .Context (), client , * user )
46
62
if err != nil {
47
63
return err
48
64
}
@@ -70,17 +86,13 @@ func envsCommand() *cobra.Command {
70
86
return nil
71
87
},
72
88
}
73
- lsCmd .Flags ().StringVarP (& outputFmt , "output" , "o" , "human" , "human | json" )
74
- cmd .AddCommand (lsCmd )
75
- cmd .AddCommand (editEnvCommand (& user ))
76
- cmd .AddCommand (stopEnvCommand (& user ))
77
- cmd .AddCommand (watchBuildLogCommand ())
78
- cmd .AddCommand (rebuildEnvCommand ())
79
- cmd .AddCommand (createEnvCommand ())
89
+
90
+ cmd .Flags ().StringVarP (& outputFmt , "output" , "o" , "human" , "human | json" )
91
+
80
92
return cmd
81
93
}
82
94
83
- func stopEnvCommand (user * string ) * cobra.Command {
95
+ func stopEnvsCommand (user * string ) * cobra.Command {
84
96
return & cobra.Command {
85
97
Use : "stop [...environment_names]" ,
86
98
Short : "stop Coder environments by name" ,
@@ -310,3 +322,62 @@ coder envs edit back-end-env --disk 20`,
310
322
cmd .Flags ().BoolVar (& follow , "follow" , false , "follow buildlog after initiating rebuild" )
311
323
return cmd
312
324
}
325
+
326
+ func rmEnvsCommand (user * string ) * cobra.Command {
327
+ var force bool
328
+ cmd := & cobra.Command {
329
+ Use : "rm [...environment_names]" ,
330
+ Short : "remove Coder environments by name" ,
331
+ Args : cobra .MinimumNArgs (1 ),
332
+ RunE : func (cmd * cobra.Command , args []string ) error {
333
+ ctx := cmd .Context ()
334
+ client , err := newClient ()
335
+ if err != nil {
336
+ return err
337
+ }
338
+
339
+ // only show one confirmation dialogue at a time
340
+ confirmLimiter := semaphore .NewWeighted (1 )
341
+
342
+ var egroup errgroup.Group
343
+ for _ , envName := range args {
344
+ envName := envName
345
+ egroup .Go (func () error {
346
+ env , err := findEnv (ctx , client , envName , * user )
347
+ if err != nil {
348
+ clog .Log (err )
349
+ return err
350
+ }
351
+ if ! force {
352
+ confirm := promptui.Prompt {
353
+ Label : fmt .Sprintf ("Delete environment \" %s\" ? (all data will be lost)" , env .Name ),
354
+ IsConfirm : true ,
355
+ }
356
+ if err := confirmLimiter .Acquire (ctx , 1 ); err != nil {
357
+ return err
358
+ }
359
+
360
+ if _ , err = confirm .Run (); err != nil {
361
+ confirmLimiter .Release (1 )
362
+ return xerrors .Errorf ("confirm deletion of environment \" %s\" " , env .Name )
363
+ }
364
+ confirmLimiter .Release (1 )
365
+ }
366
+ if err = client .DeleteEnvironment (cmd .Context (), env .ID ); err != nil {
367
+ err = clog .Error (fmt .Sprintf (`failed to delete environment "%s"` , env .Name ), clog .Cause (err .Error ()))
368
+ clog .Log (err )
369
+ return err
370
+ }
371
+ return nil
372
+ })
373
+ }
374
+
375
+ if err = egroup .Wait (); err != nil {
376
+ return xerrors .Errorf ("some environment remove operations failed" )
377
+ }
378
+ return nil
379
+ },
380
+ }
381
+ cmd .Flags ().BoolVarP (& force , "force" , "f" , false , "force remove the specified environments without prompting first" )
382
+ return cmd
383
+ }
0 commit comments