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

File tree

22 files changed

+271
-158
lines changed

22 files changed

+271
-158
lines changed

cmd/coder/auth.go

Lines changed: 4 additions & 2 deletions
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
}

cmd/coder/ceapi.go

Lines changed: 12 additions & 10 deletions
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
}

cmd/coder/configssh.go

Lines changed: 4 additions & 4 deletions
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
}

cmd/coder/envs.go

Lines changed: 10 additions & 1 deletion
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":

cmd/coder/main.go

Lines changed: 5 additions & 1 deletion
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
}

cmd/coder/secrets.go

Lines changed: 75 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
@@ -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)
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