1
1
package cli
2
2
3
3
import (
4
+ "context"
4
5
"fmt"
5
6
"regexp"
6
7
@@ -29,26 +30,59 @@ func (r *RootCmd) sharing() *serpent.Command {
29
30
Handler : func (inv * serpent.Invocation ) error {
30
31
return inv .Command .HelpHandler (inv )
31
32
},
32
- Children : []* serpent.Command {r .shareWorkspace (orgContext )},
33
- Hidden : true ,
33
+ Children : []* serpent.Command {
34
+ r .shareWorkspace (orgContext ),
35
+ r .statusWorkspaceSharing (),
36
+ },
37
+ Hidden : true ,
34
38
}
35
39
36
40
orgContext .AttachOptions (cmd )
37
41
return cmd
38
42
}
39
43
44
+ func (r * RootCmd ) statusWorkspaceSharing () * serpent.Command {
45
+ client := new (codersdk.Client )
46
+
47
+ cmd := & serpent.Command {
48
+ Use : "status <workspace>" ,
49
+ Short : "List all users and groups the given Workspace is shared with." ,
50
+ Aliases : []string {"list" },
51
+ Middleware : serpent .Chain (
52
+ r .InitClient (client ),
53
+ serpent .RequireNArgs (1 ),
54
+ ),
55
+ Handler : func (inv * serpent.Invocation ) error {
56
+ workspace , err := namedWorkspace (inv .Context (), client , inv .Args [0 ])
57
+ if err != nil {
58
+ return xerrors .Errorf ("unable to fetch Workspace %s: %w" , inv .Args [0 ], err )
59
+ }
60
+
61
+ acl , err := client .WorkspaceACL (inv .Context (), workspace .ID )
62
+ if err != nil {
63
+ return xerrors .Errorf ("unable to fetch ACL for Workspace: %w" , err )
64
+ }
65
+
66
+ out , err := workspaceACLToTable (inv .Context (), & acl )
67
+ if err != nil {
68
+ return err
69
+ }
70
+
71
+ _ , err = fmt .Fprintln (inv .Stdout , out )
72
+ return err
73
+ },
74
+ }
75
+
76
+ return cmd
77
+ }
78
+
40
79
func (r * RootCmd ) shareWorkspace (orgContext * OrganizationContext ) * serpent.Command {
41
80
var (
42
81
// Username regex taken from codersdk/name.go
43
82
nameRoleRegex = regexp .MustCompile (`(^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)+(?::([A-Za-z0-9-]+))?` )
44
83
client = new (codersdk.Client )
45
84
users []string
46
85
groups []string
47
- formatter = cliui .NewOutputFormatter (
48
- cliui .TableFormat (
49
- []workspaceShareRow {}, []string {"User" , "Group" , "Role" }),
50
- cliui .JSONFormat (),
51
- )
52
86
)
53
87
54
88
cmd := & serpent.Command {
@@ -175,37 +209,12 @@ func (r *RootCmd) shareWorkspace(orgContext *OrganizationContext) *serpent.Comma
175
209
return err
176
210
}
177
211
178
- workspaceACL , err := client .WorkspaceACL (inv .Context (), workspace .ID )
212
+ acl , err := client .WorkspaceACL (inv .Context (), workspace .ID )
179
213
if err != nil {
180
214
return xerrors .Errorf ("could not fetch current workspace ACL after sharing %w" , err )
181
215
}
182
216
183
- outputRows := make ([]workspaceShareRow , 0 )
184
- for _ , user := range workspaceACL .Users {
185
- if user .Role == codersdk .WorkspaceRoleDeleted {
186
- continue
187
- }
188
-
189
- outputRows = append (outputRows , workspaceShareRow {
190
- User : user .Username ,
191
- Group : defaultGroupDisplay ,
192
- Role : user .Role ,
193
- })
194
- }
195
- for _ , group := range workspaceACL .Groups {
196
- if group .Role == codersdk .WorkspaceRoleDeleted {
197
- continue
198
- }
199
-
200
- for _ , user := range group .Members {
201
- outputRows = append (outputRows , workspaceShareRow {
202
- User : user .Username ,
203
- Group : group .Name ,
204
- Role : group .Role ,
205
- })
206
- }
207
- }
208
- out , err := formatter .Format (inv .Context (), outputRows )
217
+ out , err := workspaceACLToTable (inv .Context (), & acl )
209
218
if err != nil {
210
219
return err
211
220
}
@@ -229,3 +238,48 @@ func stringToWorkspaceRole(role string) (codersdk.WorkspaceRole, error) {
229
238
role , codersdk .WorkspaceRoleAdmin , codersdk .WorkspaceRoleUse )
230
239
}
231
240
}
241
+
242
+ func workspaceACLToTable (ctx context.Context , acl * codersdk.WorkspaceACL ) (string , error ) {
243
+ type workspaceShareRow struct {
244
+ User string `table:"user"`
245
+ Group string `table:"group,default_sort"`
246
+ Role codersdk.WorkspaceRole `table:"role"`
247
+ }
248
+
249
+ formatter := cliui .NewOutputFormatter (
250
+ cliui .TableFormat (
251
+ []workspaceShareRow {}, []string {"User" , "Group" , "Role" }),
252
+ cliui .JSONFormat ())
253
+
254
+ outputRows := make ([]workspaceShareRow , 0 )
255
+ for _ , user := range acl .Users {
256
+ if user .Role == codersdk .WorkspaceRoleDeleted {
257
+ continue
258
+ }
259
+
260
+ outputRows = append (outputRows , workspaceShareRow {
261
+ User : user .Username ,
262
+ Group : defaultGroupDisplay ,
263
+ Role : user .Role ,
264
+ })
265
+ }
266
+ for _ , group := range acl .Groups {
267
+ if group .Role == codersdk .WorkspaceRoleDeleted {
268
+ continue
269
+ }
270
+
271
+ for _ , user := range group .Members {
272
+ outputRows = append (outputRows , workspaceShareRow {
273
+ User : user .Username ,
274
+ Group : group .Name ,
275
+ Role : group .Role ,
276
+ })
277
+ }
278
+ }
279
+ out , err := formatter .Format (ctx , outputRows )
280
+ if err != nil {
281
+ return "" , err
282
+ }
283
+
284
+ return out , nil
285
+ }
0 commit comments