Thanks to visit codestin.com
Credit goes to github.com

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)