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

Commit e3efdad

Browse files
authored
Merge pull request #92 from cdr/user-flag
Add --user flag to "secrets" and "envs"
2 parents 56a76c4 + 8f41aa3 commit e3efdad

22 files changed

+271
-158
lines changed

Diff for: cmd/coder/auth.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ 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+
}
42+
43+
return client, nil
4244
}

Diff for: cmd/coder/ceapi.go

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
4+
"context"
5+
46
"golang.org/x/xerrors"
57

68
"go.coder.com/flog"
@@ -27,23 +29,23 @@ outer:
2729
}
2830

2931
// getEnvs returns all environments for the user.
30-
func getEnvs(client *entclient.Client) ([]entclient.Environment, error) {
31-
me, err := client.Me()
32+
func getEnvs(ctx context.Context, client *entclient.Client, email string) ([]entclient.Environment, error) {
33+
user, err := client.UserByEmail(ctx, email)
3234
if err != nil {
33-
return nil, xerrors.Errorf("get self: %+v", err)
35+
return nil, xerrors.Errorf("get user: %+v", err)
3436
}
3537

36-
orgs, err := client.Orgs()
38+
orgs, err := client.Orgs(ctx)
3739
if err != nil {
3840
return nil, xerrors.Errorf("get orgs: %+v", err)
3941
}
4042

41-
orgs = userOrgs(me, orgs)
43+
orgs = userOrgs(user, orgs)
4244

4345
var allEnvs []entclient.Environment
4446

4547
for _, org := range orgs {
46-
envs, err := client.Envs(me, org)
48+
envs, err := client.Envs(ctx, user, org)
4749
if err != nil {
4850
return nil, xerrors.Errorf("get envs for %v: %+v", org.Name, err)
4951
}
@@ -56,8 +58,8 @@ func getEnvs(client *entclient.Client) ([]entclient.Environment, error) {
5658
}
5759

5860
// findEnv returns a single environment by name (if it exists.)
59-
func findEnv(client *entclient.Client, name string) (*entclient.Environment, error) {
60-
envs, err := getEnvs(client)
61+
func findEnv(ctx context.Context, client *entclient.Client, envName, userEmail string) (*entclient.Environment, error) {
62+
envs, err := getEnvs(ctx, client, userEmail)
6163
if err != nil {
6264
return nil, xerrors.Errorf("get environments: %w", err)
6365
}
@@ -66,11 +68,11 @@ func findEnv(client *entclient.Client, name string) (*entclient.Environment, err
6668

6769
for _, env := range envs {
6870
found = append(found, env.Name)
69-
if env.Name == name {
71+
if env.Name == envName {
7072
return &env, nil
7173
}
7274
}
7375
flog.Error("found %q", found)
74-
flog.Error("%q not found", name)
76+
flog.Error("%q not found", envName)
7577
return nil, xerrors.New("environment not found")
7678
}

Diff for: cmd/coder/configssh.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,19 @@ func configSSH(filepath *string, remove *bool) func(cmd *cobra.Command, _ []stri
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.Me(cmd.Context())
8787
if err != nil {
8888
return xerrors.Errorf("fetch username: %w", err)
8989
}
9090

91-
envs, err := getEnvs(entClient)
91+
envs, err := getEnvs(cmd.Context(), entClient, entclient.Me)
9292
if err != nil {
9393
return err
9494
}
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
}
@@ -127,7 +127,7 @@ var (
127127
)
128128

129129
func writeSSHKey(ctx context.Context, client *entclient.Client) error {
130-
key, err := client.SSHKey()
130+
key, err := client.SSHKey(ctx)
131131
if err != nil {
132132
return err
133133
}

Diff for: cmd/coder/envs.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,38 @@ 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"
11+
12+
"go.coder.com/flog"
1013
)
1114

1215
func makeEnvsCommand() *cobra.Command {
1316
var outputFmt string
17+
var user string
1418
cmd := &cobra.Command{
1519
Use: "envs",
1620
Short: "Interact with Coder environments",
1721
Long: "Perform operations on the Coder environments owned by the active user.",
1822
}
23+
cmd.PersistentFlags().StringVar(&user, "user", entclient.Me, "Specify the user whose resources to target")
1924

2025
lsCmd := &cobra.Command{
2126
Use: "ls",
2227
Short: "list all environments owned by the active user",
2328
Long: "List all Coder environments owned by the active user.",
2429
RunE: func(cmd *cobra.Command, args []string) error {
2530
entClient := requireAuth()
26-
envs, err := getEnvs(entClient)
31+
envs, err := getEnvs(cmd.Context(), entClient, user)
2732
if err != nil {
2833
return err
2934
}
35+
if len(envs) < 1 {
36+
flog.Info("no environments found")
37+
return nil
38+
}
3039

3140
switch outputFmt {
3241
case "human":

Diff for: cmd/coder/main.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"net/http"
@@ -19,6 +20,9 @@ var (
1920
)
2021

2122
func main() {
23+
ctx, cancel := context.WithCancel(context.Background())
24+
defer cancel()
25+
2226
if os.Getenv("PPROF") != "" {
2327
go func() {
2428
log.Println(http.ListenAndServe("localhost:6060", nil))
@@ -49,7 +53,7 @@ func main() {
4953
makeURLCmd(),
5054
completionCmd,
5155
)
52-
err = app.Execute()
56+
err = app.ExecuteContext(ctx)
5357
if err != nil {
5458
os.Exit(1)
5559
}

Diff for: cmd/coder/secrets.go

+75-59
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
@@ -107,10 +109,12 @@ coder secrets create aws-credentials --from-file ./credentials.json`,
107109
}
108110
}
109111

110-
err = client.InsertSecret(entclient.InsertSecretReq{
112+
err = client.InsertSecret(cmd.Context(), entclient.InsertSecretReq{
111113
Name: name,
112114
Value: value,
113115
Description: description,
116+
}, &entclient.ReqOptions{
117+
User: *user,
114118
})
115119
if err != nil {
116120
return xerrors.Errorf("insert secret: %w", err)
@@ -127,71 +131,83 @@ coder secrets create aws-credentials --from-file ./credentials.json`,
127131
return cmd
128132
}
129133

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

133-
secrets, err := client.Secrets()
134-
if err != nil {
135-
return xerrors.Errorf("get secrets: %w", err)
136-
}
138+
secrets, err := client.Secrets(cmd.Context(), &entclient.ReqOptions{
139+
User: *user,
140+
})
141+
if err != nil {
142+
return xerrors.Errorf("get secrets: %w", err)
143+
}
137144

138-
if len(secrets) < 1 {
139-
flog.Info("No secrets found")
140-
return nil
141-
}
145+
if len(secrets) < 1 {
146+
flog.Info("No secrets found")
147+
return nil
148+
}
142149

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)
150+
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
151+
s := secrets[i]
152+
s.Value = "******" // value is omitted from bulk responses
153+
return s
154+
})
155+
if err != nil {
156+
return xerrors.Errorf("write table of secrets: %w", err)
157+
}
158+
return nil
150159
}
151-
return nil
152160
}
153161

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-
}
162+
func makeViewSecret(user *string) func(cmd *cobra.Command, args []string) error {
163+
return func(cmd *cobra.Command, args []string) error {
164+
var (
165+
client = requireAuth()
166+
name = args[0]
167+
)
168+
if name == "" {
169+
return xerrors.New("[name] is a required argument")
170+
}
162171

163-
secret, err := client.SecretByName(name)
164-
if err != nil {
165-
return xerrors.Errorf("get secret by name: %w", err)
166-
}
172+
secret, err := client.SecretByName(cmd.Context(), name, &entclient.ReqOptions{
173+
User: *user,
174+
})
175+
if err != nil {
176+
return xerrors.Errorf("get secret by name: %w", err)
177+
}
167178

168-
_, err = fmt.Fprintln(os.Stdout, secret.Value)
169-
if err != nil {
170-
return xerrors.Errorf("write secret value: %w", err)
179+
_, err = fmt.Fprintln(os.Stdout, secret.Value)
180+
if err != nil {
181+
return xerrors.Errorf("write secret value: %w", err)
182+
}
183+
return nil
171184
}
172-
return nil
173185
}
174186

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-
}
187+
func makeRemoveSecrets(user *string) func(c *cobra.Command, args []string) error {
188+
return func(cmd *cobra.Command, args []string) error {
189+
var (
190+
client = requireAuth()
191+
)
192+
if len(args) < 1 {
193+
return xerrors.New("[...secret_name] is a required argument")
194+
}
182195

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)
196+
errorSeen := false
197+
for _, n := range args {
198+
err := client.DeleteSecretByName(cmd.Context(), n, &entclient.ReqOptions{
199+
User: *user,
200+
})
201+
if err != nil {
202+
flog.Error("failed to delete secret %q: %v", n, err)
203+
errorSeen = true
204+
} else {
205+
flog.Success("successfully deleted secret %q", n)
206+
}
191207
}
208+
if errorSeen {
209+
os.Exit(1)
210+
}
211+
return nil
192212
}
193-
if errorSeen {
194-
os.Exit(1)
195-
}
196-
return nil
197213
}

0 commit comments

Comments
 (0)