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

Commit 17b16f9

Browse files
committed
Add --user flag to "secrets" and "envs"
1 parent 56a76c4 commit 17b16f9

File tree

14 files changed

+138
-94
lines changed

14 files changed

+138
-94
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: 3 additions & 3 deletions
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+
user, err := client.TargetUser()
3232
if err != nil {
3333
return nil, xerrors.Errorf("get self: %+v", err)
3434
}
@@ -38,12 +38,12 @@ func getEnvs(client *entclient.Client) ([]entclient.Environment, error) {
3838
return nil, xerrors.Errorf("get orgs: %+v", err)
3939
}
4040

41-
orgs = userOrgs(me, orgs)
41+
orgs = userOrgs(user, orgs)
4242

4343
var allEnvs []entclient.Environment
4444

4545
for _, org := range orgs {
46-
envs, err := client.Envs(me, org)
46+
envs, err := client.Envs(user, org)
4747
if err != nil {
4848
return nil, xerrors.Errorf("get envs for %v: %+v", org.Name, err)
4949
}

cmd/coder/configssh.go

Lines changed: 3 additions & 3 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+
user, err := entClient.TargetUser()
8787
if err != nil {
8888
return xerrors.Errorf("fetch username: %w", err)
8989
}
@@ -95,7 +95,7 @@ func configSSH(filepath *string, remove *bool) func(cmd *cobra.Command, _ []stri
9595
if len(envs) < 1 {
9696
return xerrors.New("no environments found")
9797
}
98-
newConfig, err := makeNewConfigs(me.Username, envs, startToken, startMessage, endToken)
98+
newConfig, err := makeNewConfigs(user.Username, envs, startToken, startMessage, endToken)
9999
if err != nil {
100100
return xerrors.Errorf("make new ssh configurations: %w", err)
101101
}

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: 67 additions & 59 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,77 @@ 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)
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
171178
}
172-
return nil
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
}

cmd/coder/shell.go

Lines changed: 5 additions & 4 deletions
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"
@@ -19,12 +20,12 @@ import (
1920
"go.coder.com/flog"
2021
)
2122

22-
func getEnvsForCompletion() []string {
23+
func getEnvsForCompletion(user string) []string {
2324
// TODO(@cmoog): Enable this if speed issue can be resolved. Otherwise, all commands will take > 1 second.
2425
return nil
2526

2627
var envNames []string
27-
client, err := newClient()
28+
client, err := newClient(user)
2829
if err != nil {
2930
return envNames
3031
}
@@ -45,7 +46,7 @@ func makeShellCmd() *cobra.Command {
4546
Long: "Execute a remote command on the environment\\nIf no command is specified, the default shell is opened.",
4647
Args: cobra.MinimumNArgs(1),
4748
DisableFlagParsing: true,
48-
ValidArgs: getEnvsForCompletion(),
49+
ValidArgs: getEnvsForCompletion(entclient.Me),
4950
RunE: shell,
5051
Example: "coder sh backend-env",
5152
}
@@ -97,7 +98,7 @@ func sendResizeEvents(ctx context.Context, termfd uintptr, process wsep.Process)
9798

9899
func runCommand(ctx context.Context, envName string, command string, args []string) error {
99100
var (
100-
entClient = requireAuth()
101+
entClient = requireAuth(entclient.Me)
101102
)
102103
env, err := findEnv(entClient, envName)
103104
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 {

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