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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy