Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit a5570f2

Browse files
committed
Add --user flag to "secrets" and "envs"
1 parent 4d9a0c9 commit a5570f2

File tree

14 files changed

+141
-86
lines changed

14 files changed

+141
-86
lines changed

cmd/coder/auth.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
// requireAuth exits the process with a nonzero exit code if the user is not authenticated to make requests
13-
func requireAuth() *entclient.Client {
13+
func requireAuth(userFlag string) *entclient.Client {
1414
sessionToken, err := config.Session.Read()
1515
requireSuccess(err, "read session: %v (did you run coder login?)", err)
1616

@@ -20,10 +20,19 @@ func requireAuth() *entclient.Client {
2020
u, err := url.Parse(rawURL)
2121
requireSuccess(err, "url misformatted: %v (try runing coder login)", err)
2222

23-
return &entclient.Client{
23+
client := &entclient.Client{
2424
BaseURL: u,
2525
Token: sessionToken,
26+
UserID: entclient.Me,
2627
}
28+
29+
user, err := client.UserByEmail(userFlag)
30+
requireSuccess(err, "failed to find user (%v) by email: %v", userFlag, err)
31+
32+
// perform all additional actions as this user
33+
client.UserID = user.ID
34+
35+
return client
2736
}
2837

2938
// requireSuccess prints the given message and format args as a fatal error if err != nil

cmd/coder/ceapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ outer:
2828

2929
// getEnvs returns all environments for the user.
3030
func getEnvs(client *entclient.Client) ([]entclient.Environment, error) {
31-
me, err := client.Me()
31+
me, err := client.TargetUser()
3232
if err != nil {
3333
return nil, xerrors.Errorf("get self: %+v", err)
3434
}

cmd/coder/configssh.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ func configSSH(filepath *string, remove *bool) func(c *cli.Context) error {
8686
return nil
8787
}
8888

89-
entClient := requireAuth()
89+
entClient := requireAuth(entclient.Me)
9090

9191
sshAvailable := isSSHAvailable(ctx)
9292
if !sshAvailable {
9393
return xerrors.New("SSH is disabled or not available for your Coder Enterprise deployment.")
9494
}
9595

96-
me, err := entClient.Me()
96+
me, err := entClient.TargetUser()
9797
if err != nil {
9898
return xerrors.Errorf("failed to fetch username: %w", err)
9999
}

cmd/coder/envs.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,36 @@ import (
44
"encoding/json"
55
"os"
66

7+
"cdr.dev/coder-cli/internal/entclient"
78
"cdr.dev/coder-cli/internal/x/xtabwriter"
89
"github.com/urfave/cli"
910
"golang.org/x/xerrors"
1011
)
1112

1213
func makeEnvsCommand() cli.Command {
1314
var outputFmt string
15+
var user string
1416
return cli.Command{
1517
Name: "envs",
1618
Usage: "Interact with Coder environments",
1719
Description: "Perform operations on the Coder environments owned by the active user.",
1820
Action: exitHelp,
21+
Flags: []cli.Flag{
22+
cli.StringFlag{
23+
Name: "user",
24+
Usage: "Specify the user whose resources to target",
25+
Value: entclient.Me,
26+
Destination: &user,
27+
},
28+
},
1929
Subcommands: []cli.Command{
2030
{
2131
Name: "ls",
2232
Usage: "list all environments owned by the active user",
2333
Description: "List all Coder environments owned by the active user.",
2434
ArgsUsage: "[...flags]>",
2535
Action: func(c *cli.Context) error {
26-
entClient := requireAuth()
36+
entClient := requireAuth(user)
2737
envs, err := getEnvs(entClient)
2838
if err != nil {
2939
return err

cmd/coder/secrets.go

Lines changed: 75 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,44 @@ import (
1515
)
1616

1717
func makeSecretsCmd() cli.Command {
18+
var user string
1819
return cli.Command{
1920
Name: "secrets",
2021
Usage: "Interact with Coder Secrets",
2122
Description: "Interact with secrets objects owned by the active user.",
2223
Action: exitHelp,
24+
Flags: []cli.Flag{
25+
cli.StringFlag{
26+
Name: "user",
27+
Usage: "Specify the user whose resources to target",
28+
Value: entclient.Me,
29+
Destination: &user,
30+
},
31+
},
2332
Subcommands: []cli.Command{
33+
makeCreateSecret(&user),
2434
{
2535
Name: "ls",
2636
Usage: "List all secrets owned by the active user",
27-
Action: listSecrets,
37+
Action: makeListSecrets(&user),
2838
},
29-
makeCreateSecret(),
3039
{
3140
Name: "rm",
3241
Usage: "Remove one or more secrets by name",
3342
ArgsUsage: "[...secret_name]",
34-
Action: removeSecrets,
43+
Action: makeRemoveSecrets(&user),
3544
},
3645
{
3746
Name: "view",
3847
Usage: "View a secret by name",
3948
ArgsUsage: "[secret_name]",
40-
Action: viewSecret,
49+
Action: makeViewSecret(&user),
4150
},
4251
},
4352
}
4453
}
4554

46-
func makeCreateSecret() cli.Command {
55+
func makeCreateSecret(user *string) cli.Command {
4756
var (
4857
fromFile string
4958
fromLiteral string
@@ -73,7 +82,7 @@ func makeCreateSecret() cli.Command {
7382
},
7483
Action: func(c *cli.Context) error {
7584
var (
76-
client = requireAuth()
85+
client = requireAuth(*user)
7786
name = c.Args().First()
7887
value string
7988
err error
@@ -139,72 +148,77 @@ func makeCreateSecret() cli.Command {
139148
}
140149
}
141150

142-
func listSecrets(_ *cli.Context) error {
143-
client := requireAuth()
151+
func makeListSecrets(user *string) func(c *cli.Context) error {
152+
return func(_ *cli.Context) error {
153+
client := requireAuth(*user)
144154

145-
secrets, err := client.Secrets()
146-
if err != nil {
147-
return xerrors.Errorf("failed to get secrets: %w", err)
148-
}
155+
secrets, err := client.Secrets()
156+
if err != nil {
157+
return xerrors.Errorf("failed to get secrets: %w", err)
158+
}
149159

150-
if len(secrets) < 1 {
151-
flog.Info("No secrets found")
152-
return nil
153-
}
160+
if len(secrets) < 1 {
161+
flog.Info("No secrets found")
162+
return nil
163+
}
154164

155-
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
156-
s := secrets[i]
157-
s.Value = "******" // value is omitted from bulk responses
158-
return s
159-
})
160-
if err != nil {
161-
return xerrors.Errorf("failed to write table of secrets: %w", err)
165+
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
166+
s := secrets[i]
167+
s.Value = "******" // value is omitted from bulk responses
168+
return s
169+
})
170+
if err != nil {
171+
return xerrors.Errorf("failed to write table of secrets: %w", err)
172+
}
173+
return nil
162174
}
163-
return nil
164175
}
165176

166-
func viewSecret(c *cli.Context) error {
167-
var (
168-
client = requireAuth()
169-
name = c.Args().First()
170-
)
171-
if name == "" {
172-
return xerrors.New("[name] is a required argument")
173-
}
177+
func makeViewSecret(user *string) func(c *cli.Context) error {
178+
return func(c *cli.Context) error {
179+
var (
180+
client = requireAuth(*user)
181+
name = c.Args().First()
182+
)
183+
if name == "" {
184+
return xerrors.New("[name] is a required argument")
185+
}
174186

175-
secret, err := client.SecretByName(name)
176-
if err != nil {
177-
return xerrors.Errorf("failed to get secret by name: %w", err)
178-
}
187+
secret, err := client.SecretByName(name)
188+
if err != nil {
189+
return xerrors.Errorf("failed to get secret by name: %w", err)
190+
}
179191

180-
_, err = fmt.Fprintln(os.Stdout, secret.Value)
181-
if err != nil {
182-
return xerrors.Errorf("failed to write: %w", err)
192+
_, err = fmt.Fprintln(os.Stdout, secret.Value)
193+
if err != nil {
194+
return xerrors.Errorf("failed to write: %w", err)
195+
}
196+
return nil
183197
}
184-
return nil
185198
}
199+
func makeRemoveSecrets(user *string) func(c *cli.Context) error {
200+
return func(c *cli.Context) error {
201+
var (
202+
client = requireAuth(*user)
203+
names = append([]string{c.Args().First()}, c.Args().Tail()...)
204+
)
205+
if len(names) < 1 || names[0] == "" {
206+
return xerrors.New("[...secret_name] is a required argument")
207+
}
186208

187-
func removeSecrets(c *cli.Context) error {
188-
var (
189-
client = requireAuth()
190-
names = append([]string{c.Args().First()}, c.Args().Tail()...)
191-
)
192-
if len(names) < 1 || names[0] == "" {
193-
return xerrors.New("[...secret_name] is a required argument")
194-
}
195-
196-
errorSeen := false
197-
for _, n := range names {
198-
err := client.DeleteSecretByName(n)
199-
if err != nil {
200-
flog.Error("Failed to delete secret: %v", err)
201-
errorSeen = true
202-
} else {
203-
flog.Info("Successfully deleted secret %q", n)
209+
errorSeen := false
210+
for _, n := range names {
211+
err := client.DeleteSecretByName(n)
212+
if err != nil {
213+
flog.Error("Failed to delete secret: %v", err)
214+
errorSeen = true
215+
} else {
216+
flog.Info("Successfully deleted secret %q", n)
217+
}
204218
}
219+
if errorSeen {
220+
os.Exit(1)
221+
}
222+
return nil
205223
}
206-
if errorSeen {
207-
os.Exit(1)
208-
}
209-
return nil
210224
}

cmd/coder/shell.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
"cdr.dev/coder-cli/internal/activity"
11+
"cdr.dev/coder-cli/internal/entclient"
1112
"cdr.dev/coder-cli/internal/x/xterminal"
1213
"cdr.dev/wsep"
1314
"github.com/urfave/cli"
@@ -83,7 +84,7 @@ func sendResizeEvents(ctx context.Context, termfd uintptr, process wsep.Process)
8384

8485
func runCommand(ctx context.Context, envName string, command string, args []string) error {
8586
var (
86-
entClient = requireAuth()
87+
entClient = requireAuth(entclient.Me)
8788
)
8889
env, err := findEnv(entClient, envName)
8990
if err != nil {

cmd/coder/sync.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"path/filepath"
99
"strings"
1010

11+
"cdr.dev/coder-cli/internal/entclient"
1112
"cdr.dev/coder-cli/internal/sync"
1213
"github.com/urfave/cli"
1314
"golang.org/x/xerrors"
@@ -62,7 +63,7 @@ func makeRunSync(init *bool) func(c *cli.Context) error {
6263
remote = c.Args().Get(1)
6364
)
6465

65-
entClient := requireAuth()
66+
entClient := requireAuth(entclient.Me)
6667

6768
info, err := os.Stat(local)
6869
if err != nil {

cmd/coder/urls.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strconv"
1010
"strings"
1111

12+
"cdr.dev/coder-cli/internal/entclient"
1213
"cdr.dev/coder-cli/internal/x/xtabwriter"
1314
"github.com/urfave/cli"
1415
"golang.org/x/xerrors"
@@ -191,7 +192,7 @@ func makeCreateDevURL() cli.Command {
191192
if urlname != "" && !devURLNameValidRx.MatchString(urlname) {
192193
return xerrors.New("update devurl: name must be < 64 chars in length, begin with a letter and only contain letters or digits.")
193194
}
194-
entClient := requireAuth()
195+
entClient := requireAuth(entclient.Me)
195196

196197
env, err := findEnv(entClient, envName)
197198
if err != nil {
@@ -251,7 +252,7 @@ func removeDevURL(c *cli.Context) error {
251252
return xerrors.Errorf("failed to validate port: %w", err)
252253
}
253254

254-
entClient := requireAuth()
255+
entClient := requireAuth(entclient.Me)
255256
env, err := findEnv(entClient, envName)
256257
if err != nil {
257258
return err
@@ -278,7 +279,7 @@ func removeDevURL(c *cli.Context) error {
278279

279280
// urlList returns the list of active devURLs from the cemanager.
280281
func urlList(envName string) ([]DevURL, error) {
281-
entClient := requireAuth()
282+
entClient := requireAuth(entclient.Me)
282283
env, err := findEnv(entClient, envName)
283284
if err != nil {
284285
return nil, err

cmd/coder/users.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"os"
66

7+
"cdr.dev/coder-cli/internal/entclient"
78
"cdr.dev/coder-cli/internal/x/xtabwriter"
89
"github.com/urfave/cli"
910
"golang.org/x/xerrors"
@@ -35,7 +36,7 @@ func makeUsersCmd() cli.Command {
3536

3637
func listUsers(outputFmt *string) func(c *cli.Context) error {
3738
return func(c *cli.Context) error {
38-
entClient := requireAuth()
39+
entClient := requireAuth(entclient.Me)
3940

4041
users, err := entClient.Users()
4142
if err != nil {

internal/entclient/client.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ import (
66
"net/url"
77
)
88

9+
// Me is the route param to access resources of the authenticated user
10+
const Me = "me"
11+
912
// Client wraps the Coder HTTP API
1013
type Client struct {
1114
BaseURL *url.URL
1215
Token string
16+
UserID string
1317
}
1418

1519
func (c Client) copyURL() *url.URL {

0 commit comments

Comments
 (0)