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

Commit 13a89c4

Browse files
committed
Add --user flag to "secrets" and "envs"
1 parent 3dc2d89 commit 13a89c4

File tree

14 files changed

+133
-88
lines changed

14 files changed

+133
-88
lines changed

cmd/coder/auth.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import (
1111
)
1212

1313
// requireAuth exits the process with a nonzero exit code if the user is not authenticated to make requests
14-
func requireAuth() *entclient.Client {
15-
client, err := newClient()
14+
func requireAuth(user string) *entclient.Client {
15+
client, err := newClient(user)
1616
if err != nil {
1717
flog.Fatal("%v", err)
1818
}
1919
return client
2020
}
2121

22-
func newClient() (*entclient.Client, error) {
22+
func newClient(userFlag string) (*entclient.Client, error) {
2323
sessionToken, err := config.Session.Read()
2424
if err != nil {
2525
return nil, xerrors.Errorf("read session: %v (did you run coder login?)", err)
@@ -35,8 +35,19 @@ func newClient() (*entclient.Client, error) {
3535
return nil, xerrors.Errorf("url misformatted: %v (try runing coder login)", err)
3636
}
3737

38-
return &entclient.Client{
38+
client := &entclient.Client{
3939
BaseURL: u,
4040
Token: sessionToken,
41-
}, nil
41+
UserID: entclient.Me,
42+
}
43+
44+
user, err := client.UserByEmail(userFlag)
45+
if err != nil {
46+
return nil, xerrors.Errorf("failed to find user (%v) by email: %v", userFlag, err)
47+
}
48+
49+
// perform all additional actions as this user
50+
client.UserID = user.ID
51+
52+
return client, nil
4253
}

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
@@ -76,14 +76,14 @@ func configSSH(filepath *string, remove *bool) func(cmd *cobra.Command, _ []stri
7676
return nil
7777
}
7878

79-
entClient := requireAuth()
79+
entClient := requireAuth(entclient.Me)
8080

8181
sshAvailable := isSSHAvailable(ctx)
8282
if !sshAvailable {
8383
return xerrors.New("SSH is disabled or not available for your Coder Enterprise deployment.")
8484
}
8585

86-
me, err := entClient.Me()
86+
me, err := entClient.TargetUser()
8787
if err != nil {
8888
return xerrors.Errorf("fetch username: %w", err)
8989
}

cmd/coder/envs.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,28 @@ 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/spf13/cobra"
910
"golang.org/x/xerrors"
1011
)
1112

1213
func makeEnvsCommand() *cobra.Command {
1314
var outputFmt string
15+
var user string
1416
cmd := &cobra.Command{
1517
Use: "envs",
1618
Short: "Interact with Coder environments",
1719
Long: "Perform operations on the Coder environments owned by the active user.",
1820
}
21+
cmd.PersistentFlags().StringVar(&user, "user",entclient.Me, "Specify the user whose resources to target")
1922

2023
lsCmd := &cobra.Command{
2124
Use: "ls",
2225
Short: "list all environments owned by the active user",
2326
Long: "List all Coder environments owned by the active user.",
2427
RunE: func(cmd *cobra.Command, args []string) error {
25-
entClient := requireAuth()
28+
entClient := requireAuth(user)
2629
envs, err := getEnvs(entClient)
2730
if err != nil {
2831
return err

cmd/coder/secrets.go

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,39 @@ import (
1515
)
1616

1717
func makeSecretsCmd() *cobra.Command {
18+
var user string
1819
cmd := &cobra.Command{
1920
Use: "secrets",
2021
Short: "Interact with Coder Secrets",
2122
Long: "Interact with secrets objects owned by the active user.",
2223
}
24+
cmd.PersistentFlags().StringVar(&user, "user", entclient.Me, "Specify the user whose resources to target")
2325
cmd.AddCommand(
2426
&cobra.Command{
2527
Use: "ls",
2628
Short: "List all secrets owned by the active user",
27-
RunE: listSecrets,
29+
RunE: listSecrets(&user),
2830
},
29-
makeCreateSecret(),
31+
makeCreateSecret(&user),
3032
&cobra.Command{
3133
Use: "rm [...secret_name]",
3234
Short: "Remove one or more secrets by name",
3335
Args: cobra.MinimumNArgs(1),
34-
RunE: removeSecrets,
36+
RunE: makeRemoveSecrets(&user),
3537
Example: "coder secrets rm mysql-password mysql-user",
3638
},
3739
&cobra.Command{
3840
Use: "view [secret_name]",
3941
Short: "View a secret by name",
4042
Args: cobra.ExactArgs(1),
41-
RunE: viewSecret,
43+
RunE: makeViewSecret(&user),
4244
Example: "coder secrets view mysql-password",
4345
},
4446
)
4547
return cmd
4648
}
4749

48-
func makeCreateSecret() *cobra.Command {
50+
func makeCreateSecret(user *string) *cobra.Command {
4951
var (
5052
fromFile string
5153
fromLiteral string
@@ -77,7 +79,7 @@ coder secrets create aws-credentials --from-file ./credentials.json`,
7779
},
7880
RunE: func(cmd *cobra.Command, args []string) error {
7981
var (
80-
client = requireAuth()
82+
client = requireAuth(*user)
8183
name = args[0]
8284
value string
8385
err error
@@ -127,71 +129,78 @@ coder secrets create aws-credentials --from-file ./credentials.json`,
127129
return cmd
128130
}
129131

130-
func listSecrets(cmd *cobra.Command, _ []string) error {
131-
client := requireAuth()
132+
func listSecrets(user *string) func(cmd *cobra.Command, _ []string) error {
133+
return func(cmd *cobra.Command, _ []string) error {
134+
client := requireAuth(*user)
132135

133-
secrets, err := client.Secrets()
134-
if err != nil {
135-
return xerrors.Errorf("get secrets: %w", err)
136-
}
136+
secrets, err := client.Secrets()
137+
if err != nil {
138+
return xerrors.Errorf("get secrets: %w", err)
139+
}
137140

138-
if len(secrets) < 1 {
139-
flog.Info("No secrets found")
140-
return nil
141-
}
141+
if len(secrets) < 1 {
142+
flog.Info("No secrets found")
143+
return nil
144+
}
142145

143-
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
144-
s := secrets[i]
145-
s.Value = "******" // value is omitted from bulk responses
146-
return s
147-
})
148-
if err != nil {
149-
return xerrors.Errorf("write table of secrets: %w", err)
146+
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
147+
s := secrets[i]
148+
s.Value = "******" // value is omitted from bulk responses
149+
return s
150+
})
151+
if err != nil {
152+
return xerrors.Errorf("write table of secrets: %w", err)
153+
}
154+
return nil
150155
}
151-
return nil
152156
}
153157

154-
func viewSecret(_ *cobra.Command, args []string) error {
155-
var (
156-
client = requireAuth()
157-
name = args[0]
158-
)
159-
if name == "" {
160-
return xerrors.New("[name] is a required argument")
161-
}
158+
func makeViewSecret(user *string) func(cmd *cobra.Command, args []string) error {
159+
return func (_ *cobra.Command, args []string) error {
160+
var (
161+
client = requireAuth(*user)
162+
name = args[0]
163+
)
164+
if name == "" {
165+
return xerrors.New("[name] is a required argument")
166+
}
162167

163-
secret, err := client.SecretByName(name)
164-
if err != nil {
165-
return xerrors.Errorf("get secret by name: %w", err)
166-
}
168+
secret, err := client.SecretByName(name)
169+
if err != nil {
170+
return xerrors.Errorf("get secret by name: %w", err)
171+
}
167172

168-
_, err = fmt.Fprintln(os.Stdout, secret.Value)
169-
if err != nil {
170-
return xerrors.Errorf("write secret value: %w", err)
171-
}
172-
return nil
173+
_, err = fmt.Fprintln(os.Stdout, secret.Value)
174+
if err != nil {
175+
return xerrors.Errorf("write secret value: %w", err)
176+
}
177+
return nil
178+
}
173179
}
174180

175-
func removeSecrets(_ *cobra.Command, args []string) error {
176-
var (
177-
client = requireAuth()
178-
)
179-
if len(args) < 1 {
180-
return xerrors.New("[...secret_name] is a required argument")
181-
}
181+
func makeRemoveSecrets(user *string) func(c *cobra.Command, args []string) error {
182+
return func (_ *cobra.Command, args []string) error {
183+
var (
184+
client = requireAuth(*user)
185+
)
186+
if len(args) < 1 {
187+
return xerrors.New("[...secret_name] is a required argument")
188+
}
182189

183-
errorSeen := false
184-
for _, n := range args {
185-
err := client.DeleteSecretByName(n)
186-
if err != nil {
187-
flog.Error("failed to delete secret %q: %v", n, err)
188-
errorSeen = true
189-
} else {
190-
flog.Success("successfully deleted secret %q", n)
190+
errorSeen := false
191+
for _, n := range args {
192+
err := client.DeleteSecretByName(n)
193+
if err != nil {
194+
flog.Error("failed to delete secret %q: %v", n, err)
195+
errorSeen = true
196+
} else {
197+
flog.Success("successfully deleted secret %q", n)
198+
}
191199
}
200+
if errorSeen {
201+
os.Exit(1)
202+
}
203+
return nil
192204
}
193-
if errorSeen {
194-
os.Exit(1)
195-
}
196-
return nil
197205
}
206+

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/spf13/cobra"
@@ -94,7 +95,7 @@ func sendResizeEvents(ctx context.Context, termfd uintptr, process wsep.Process)
9495

9596
func runCommand(ctx context.Context, envName string, command string, args []string) error {
9697
var (
97-
entClient = requireAuth()
98+
entClient = requireAuth(entclient.Me)
9899
)
99100
env, err := findEnv(entClient, envName)
100101
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/spf13/cobra"
1314
"golang.org/x/xerrors"
@@ -51,7 +52,7 @@ func makeRunSync(init *bool) func(cmd *cobra.Command, args []string) error {
5152
remote = args[1]
5253
)
5354

54-
entClient := requireAuth()
55+
entClient := requireAuth(entclient.Me)
5556

5657
info, err := os.Stat(local)
5758
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/spf13/cobra"
1415
"golang.org/x/xerrors"
@@ -147,7 +148,7 @@ func makeCreateDevURL() *cobra.Command {
147148
if urlname != "" && !devURLNameValidRx.MatchString(urlname) {
148149
return xerrors.New("update devurl: name must be < 64 chars in length, begin with a letter and only contain letters or digits.")
149150
}
150-
entClient := requireAuth()
151+
entClient := requireAuth(entclient.Me)
151152

152153
env, err := findEnv(entClient, envName)
153154
if err != nil {
@@ -213,7 +214,7 @@ func removeDevURL(cmd *cobra.Command, args []string) error {
213214
return xerrors.Errorf("validate port: %w", err)
214215
}
215216

216-
entClient := requireAuth()
217+
entClient := requireAuth(entclient.Me)
217218
env, err := findEnv(entClient, envName)
218219
if err != nil {
219220
return err
@@ -240,7 +241,7 @@ func removeDevURL(cmd *cobra.Command, args []string) error {
240241

241242
// urlList returns the list of active devURLs from the cemanager.
242243
func urlList(envName string) ([]DevURL, error) {
243-
entClient := requireAuth()
244+
entClient := requireAuth(entclient.Me)
244245
env, err := findEnv(entClient, envName)
245246
if err != nil {
246247
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/spf13/cobra"
910
"golang.org/x/xerrors"
@@ -31,7 +32,7 @@ coder users ls -o json | jq .[] | jq -r .email`,
3132

3233
func listUsers(outputFmt *string) func(cmd *cobra.Command, args []string) error {
3334
return func(cmd *cobra.Command, args []string) error {
34-
entClient := requireAuth()
35+
entClient := requireAuth(entclient.Me)
3536

3637
users, err := entClient.Users()
3738
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)