@@ -2,19 +2,21 @@ package cmd
2
2
3
3
import (
4
4
"encoding/json"
5
+ "fmt"
5
6
"os"
6
7
7
8
"cdr.dev/coder-cli/coder-sdk"
8
9
"cdr.dev/coder-cli/internal/x/xtabwriter"
10
+ "github.com/manifoldco/promptui"
9
11
"github.com/spf13/cobra"
10
12
"golang.org/x/sync/errgroup"
13
+ "golang.org/x/sync/semaphore"
11
14
"golang.org/x/xerrors"
12
15
13
16
"go.coder.com/flog"
14
17
)
15
18
16
19
func envsCommand () * cobra.Command {
17
- var outputFmt string
18
20
var user string
19
21
cmd := & cobra.Command {
20
22
Use : "envs" ,
@@ -23,7 +25,20 @@ func envsCommand() *cobra.Command {
23
25
}
24
26
cmd .PersistentFlags ().StringVar (& user , "user" , coder .Me , "Specify the user whose resources to target" )
25
27
26
- lsCmd := & cobra.Command {
28
+ cmd .AddCommand (
29
+ lsEnvsCommand (& user ),
30
+ stopEnvsCommand (& user ),
31
+ rmEnvsCommand (& user ),
32
+ watchBuildLogCommand (),
33
+ rebuildEnvCommand (),
34
+ )
35
+ return cmd
36
+ }
37
+
38
+ func lsEnvsCommand (user * string ) * cobra.Command {
39
+ var outputFmt string
40
+
41
+ cmd := & cobra.Command {
27
42
Use : "ls" ,
28
43
Short : "list all environments owned by the active user" ,
29
44
Long : "List all Coder environments owned by the active user." ,
@@ -32,7 +47,7 @@ func envsCommand() *cobra.Command {
32
47
if err != nil {
33
48
return err
34
49
}
35
- envs , err := getEnvs (cmd .Context (), client , user )
50
+ envs , err := getEnvs (cmd .Context (), client , * user )
36
51
if err != nil {
37
52
return err
38
53
}
@@ -60,16 +75,12 @@ func envsCommand() *cobra.Command {
60
75
return nil
61
76
},
62
77
}
63
- lsCmd .Flags ().StringVarP (& outputFmt , "output" , "o" , "human" , "human | json" )
64
- cmd .AddCommand (lsCmd )
65
- cmd .AddCommand (stopEnvCommand (& user ))
78
+ cmd .Flags ().StringVarP (& outputFmt , "output" , "o" , "human" , "human | json" )
66
79
67
- cmd .AddCommand (watchBuildLogCommand ())
68
- cmd .AddCommand (rebuildEnvCommand ())
69
80
return cmd
70
81
}
71
82
72
- func stopEnvCommand (user * string ) * cobra.Command {
83
+ func stopEnvsCommand (user * string ) * cobra.Command {
73
84
return & cobra.Command {
74
85
Use : "stop [...environment_names]" ,
75
86
Short : "stop Coder environments by name" ,
@@ -117,3 +128,61 @@ coder envs --user charlie@coder.com ls -o json \
117
128
},
118
129
}
119
130
}
131
+
132
+ func rmEnvsCommand (user * string ) * cobra.Command {
133
+ var force bool
134
+ cmd := & cobra.Command {
135
+ Use : "rm [...environment_names]" ,
136
+ Short : "remove Coder environments by name" ,
137
+ Args : cobra .MinimumNArgs (1 ),
138
+ RunE : func (cmd * cobra.Command , args []string ) error {
139
+ ctx := cmd .Context ()
140
+ client , err := newClient ()
141
+ if err != nil {
142
+ return err
143
+ }
144
+
145
+ // only show one confirmation dialogue at a time
146
+ confirmLimiter := semaphore .NewWeighted (1 )
147
+
148
+ var egroup errgroup.Group
149
+ for _ , envName := range args {
150
+ envName := envName
151
+ egroup .Go (func () error {
152
+ env , err := findEnv (ctx , client , envName , * user )
153
+ if err != nil {
154
+ flog .Error ("failed to find environment by name \" %s\" : %v" , envName , err )
155
+ return err
156
+ }
157
+ if ! force {
158
+ confirm := promptui.Prompt {
159
+ Label : fmt .Sprintf ("Delete environment \" %s\" ? (all data will be lost)" , env .Name ),
160
+ IsConfirm : true ,
161
+ }
162
+ if err := confirmLimiter .Acquire (ctx , 1 ); err != nil {
163
+ return err
164
+ }
165
+
166
+ if _ , err = confirm .Run (); err != nil {
167
+ confirmLimiter .Release (1 )
168
+ return xerrors .Errorf ("confirm deletion of environment \" %s\" " , env .Name )
169
+ }
170
+ confirmLimiter .Release (1 )
171
+ }
172
+ if err = client .DeleteEnvironment (cmd .Context (), env .ID ); err != nil {
173
+ flog .Error ("failed to delete environment \" %s\" : %v" , env .ID , err )
174
+ return xerrors .Errorf ("delete environment: %w" , err )
175
+ }
176
+ return nil
177
+ })
178
+ }
179
+
180
+ if err = egroup .Wait (); err != nil {
181
+ return xerrors .Errorf ("some environment remove operations failed: %w" , err )
182
+ }
183
+ return nil
184
+ },
185
+ }
186
+ cmd .Flags ().BoolVarP (& force , "force" , "f" , false , "force remove the specified environments without prompting first" )
187
+ return cmd
188
+ }
0 commit comments