From 2446fbfb3dc2abed77292eee7e11d7309a4ff7e7 Mon Sep 17 00:00:00 2001 From: Charlie Moog Date: Sat, 5 Sep 2020 15:17:16 -0500 Subject: [PATCH] Remove fatal calls from sdk client creation --- internal/cmd/auth.go | 17 ++++------------- internal/cmd/configssh.go | 5 ++++- internal/cmd/envs.go | 7 +++++-- internal/cmd/secrets.go | 30 ++++++++++++++++++++---------- internal/cmd/shell.go | 12 +++++++----- internal/cmd/sync.go | 15 +++++++++------ internal/cmd/urls.go | 29 +++++++++++++++++++---------- internal/cmd/users.go | 7 +++++-- 8 files changed, 73 insertions(+), 49 deletions(-) diff --git a/internal/cmd/auth.go b/internal/cmd/auth.go index f060d0ad..91882248 100644 --- a/internal/cmd/auth.go +++ b/internal/cmd/auth.go @@ -7,33 +7,24 @@ import ( "cdr.dev/coder-cli/coder-sdk" "cdr.dev/coder-cli/internal/config" - - "go.coder.com/flog" ) -// requireAuth exits the process with a nonzero exit code if the user is not authenticated to make requests. -func requireAuth() *coder.Client { - client, err := newClient() - if err != nil { - flog.Fatal("%s", err) - } - return client -} +var errNeedLogin = xerrors.New("failed to read session credentials: did you run \"coder login\"?") func newClient() (*coder.Client, error) { sessionToken, err := config.Session.Read() if err != nil { - return nil, xerrors.Errorf("read session: %w (did you run coder login?)", err) + return nil, errNeedLogin } rawURL, err := config.URL.Read() if err != nil { - return nil, xerrors.Errorf("read url: %w (did you run coder login?)", err) + return nil, errNeedLogin } u, err := url.Parse(rawURL) if err != nil { - return nil, xerrors.Errorf("url misformatted: %w (try runing coder login)", err) + return nil, xerrors.Errorf("url misformatted: %w try runing \"coder login\" with a valid URL", err) } return &coder.Client{ diff --git a/internal/cmd/configssh.go b/internal/cmd/configssh.go index 9c04d48a..5da6745c 100644 --- a/internal/cmd/configssh.go +++ b/internal/cmd/configssh.go @@ -88,7 +88,10 @@ func configSSH(configpath *string, remove *bool) func(cmd *cobra.Command, _ []st return nil } - client := requireAuth() + client, err := newClient() + if err != nil { + return err + } sshAvailable := isSSHAvailable(ctx) if !sshAvailable { diff --git a/internal/cmd/envs.go b/internal/cmd/envs.go index b5f3eb6d..c768a355 100644 --- a/internal/cmd/envs.go +++ b/internal/cmd/envs.go @@ -27,8 +27,11 @@ func makeEnvsCommand() *cobra.Command { Short: "list all environments owned by the active user", Long: "List all Coder environments owned by the active user.", RunE: func(cmd *cobra.Command, args []string) error { - entClient := requireAuth() - envs, err := getEnvs(cmd.Context(), entClient, user) + client, err := newClient() + if err != nil { + return err + } + envs, err := getEnvs(cmd.Context(), client, user) if err != nil { return err } diff --git a/internal/cmd/secrets.go b/internal/cmd/secrets.go index 822543de..9d98faac 100644 --- a/internal/cmd/secrets.go +++ b/internal/cmd/secrets.go @@ -80,11 +80,14 @@ coder secrets create aws-credentials --from-file ./credentials.json`, }, RunE: func(cmd *cobra.Command, args []string) error { var ( - client = requireAuth() - name = args[0] - value string - err error + name = args[0] + value string + err error ) + client, err := newClient() + if err != nil { + return err + } if fromLiteral != "" { value = fromLiteral } else if fromFile != "" { @@ -136,7 +139,10 @@ coder secrets create aws-credentials --from-file ./credentials.json`, func listSecrets(userEmail *string) func(cmd *cobra.Command, _ []string) error { return func(cmd *cobra.Command, _ []string) error { - client := requireAuth() + client, err := newClient() + if err != nil { + return err + } user, err := client.UserByEmail(cmd.Context(), *userEmail) if err != nil { return xerrors.Errorf("get user %q by email: %w", *userEmail, err) @@ -167,9 +173,12 @@ func listSecrets(userEmail *string) func(cmd *cobra.Command, _ []string) error { func makeViewSecret(userEmail *string) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { var ( - client = requireAuth() - name = args[0] + name = args[0] ) + client, err := newClient() + if err != nil { + return err + } user, err := client.UserByEmail(cmd.Context(), *userEmail) if err != nil { return xerrors.Errorf("get user %q by email: %w", *userEmail, err) @@ -190,9 +199,10 @@ func makeViewSecret(userEmail *string) func(cmd *cobra.Command, args []string) e func makeRemoveSecrets(userEmail *string) func(c *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - var ( - client = requireAuth() - ) + client, err := newClient() + if err != nil { + return err + } user, err := client.UserByEmail(cmd.Context(), *userEmail) if err != nil { return xerrors.Errorf("get user %q by email: %w", *userEmail, err) diff --git a/internal/cmd/shell.go b/internal/cmd/shell.go index bc61e109..ceb8c88f 100644 --- a/internal/cmd/shell.go +++ b/internal/cmd/shell.go @@ -97,9 +97,11 @@ func sendResizeEvents(ctx context.Context, termFD uintptr, process wsep.Process) } func runCommand(ctx context.Context, envName, command string, args []string) error { - entClient := requireAuth() - - env, err := findEnv(ctx, entClient, envName, coder.Me) + client, err := newClient() + if err != nil { + return err + } + env, err := findEnv(ctx, client, envName, coder.Me) if err != nil { return xerrors.Errorf("find environment: %w", err) } @@ -125,7 +127,7 @@ func runCommand(ctx context.Context, envName, command string, args []string) err ctx, cancel := context.WithCancel(ctx) defer cancel() - conn, err := entClient.DialWsep(ctx, env) + conn, err := client.DialWsep(ctx, env) if err != nil { return xerrors.Errorf("dial websocket: %w", err) } @@ -165,7 +167,7 @@ func runCommand(ctx context.Context, envName, command string, args []string) err stdin := process.Stdin() defer func() { _ = stdin.Close() }() // Best effort. - ap := activity.NewPusher(entClient, env.ID, sshActivityName) + ap := activity.NewPusher(client, env.ID, sshActivityName) wr := ap.Writer(stdin) if _, err := io.Copy(wr, os.Stdin); err != nil { cancel() diff --git a/internal/cmd/sync.go b/internal/cmd/sync.go index 7507d76a..0ba32095 100644 --- a/internal/cmd/sync.go +++ b/internal/cmd/sync.go @@ -52,7 +52,10 @@ func makeRunSync(init *bool) func(cmd *cobra.Command, args []string) error { remote = args[1] ) - entClient := requireAuth() + client, err := newClient() + if err != nil { + return err + } info, err := os.Stat(local) if err != nil { @@ -64,21 +67,21 @@ func makeRunSync(init *bool) func(cmd *cobra.Command, args []string) error { remoteTokens := strings.SplitN(remote, ":", 2) if len(remoteTokens) != 2 { - flog.Fatal("remote misformatted") + return xerrors.New("remote misformatted") } var ( envName = remoteTokens[0] remoteDir = remoteTokens[1] ) - env, err := findEnv(cmd.Context(), entClient, envName, coder.Me) + env, err := findEnv(cmd.Context(), client, envName, coder.Me) if err != nil { return err } absLocal, err := filepath.Abs(local) if err != nil { - flog.Fatal("make abs path out of %v: %v", local, absLocal) + return xerrors.Errorf("make abs path out of %s, %s: %w", local, absLocal, err) } s := sync.Sync{ @@ -86,7 +89,7 @@ func makeRunSync(init *bool) func(cmd *cobra.Command, args []string) error { Env: *env, RemoteDir: remoteDir, LocalDir: absLocal, - Client: entClient, + Client: client, } localVersion := rsyncVersion() @@ -95,7 +98,7 @@ func makeRunSync(init *bool) func(cmd *cobra.Command, args []string) error { if rsyncErr != nil { flog.Info("Unable to determine remote rsync version. Proceeding cautiously.") } else if localVersion != remoteVersion { - flog.Fatal("rsync protocol mismatch: local = %v, remote = %v", localVersion, rsyncErr) + return xerrors.Errorf("rsync protocol mismatch: local = %s, remote = %s", localVersion, remoteVersion) } for err == nil || err == sync.ErrRestartSync { diff --git a/internal/cmd/urls.go b/internal/cmd/urls.go index 5e54c8c7..7a3300fc 100644 --- a/internal/cmd/urls.go +++ b/internal/cmd/urls.go @@ -152,9 +152,12 @@ func makeCreateDevURL() *cobra.Command { if urlname != "" && !devURLNameValidRx.MatchString(urlname) { return xerrors.New("update devurl: name must be < 64 chars in length, begin with a letter and only contain letters or digits.") } - entClient := requireAuth() + client, err := newClient() + if err != nil { + return err + } - env, err := findEnv(cmd.Context(), entClient, envName, coder.Me) + env, err := findEnv(cmd.Context(), client, envName, coder.Me) if err != nil { return err } @@ -167,13 +170,13 @@ func makeCreateDevURL() *cobra.Command { urlID, found := devURLID(portNum, urls) if found { flog.Info("Updating devurl for port %v", port) - err := entClient.UpdateDevURL(cmd.Context(), env.ID, urlID, portNum, urlname, access) + err := client.UpdateDevURL(cmd.Context(), env.ID, urlID, portNum, urlname, access) if err != nil { return xerrors.Errorf("update DevURL: %w", err) } } else { flog.Info("Adding devurl for port %v", port) - err := entClient.InsertDevURL(cmd.Context(), env.ID, portNum, urlname, access) + err := client.InsertDevURL(cmd.Context(), env.ID, portNum, urlname, access) if err != nil { return xerrors.Errorf("insert DevURL: %w", err) } @@ -218,8 +221,11 @@ func removeDevURL(cmd *cobra.Command, args []string) error { return xerrors.Errorf("validate port: %w", err) } - entClient := requireAuth() - env, err := findEnv(cmd.Context(), entClient, envName, coder.Me) + client, err := newClient() + if err != nil { + return err + } + env, err := findEnv(cmd.Context(), client, envName, coder.Me) if err != nil { return err } @@ -236,7 +242,7 @@ func removeDevURL(cmd *cobra.Command, args []string) error { return xerrors.Errorf("No devurl found for port %v", port) } - if err := entClient.DelDevURL(cmd.Context(), env.ID, urlID); err != nil { + if err := client.DelDevURL(cmd.Context(), env.ID, urlID); err != nil { return xerrors.Errorf("delete DevURL: %w", err) } return nil @@ -244,14 +250,17 @@ func removeDevURL(cmd *cobra.Command, args []string) error { // urlList returns the list of active devURLs from the cemanager. func urlList(ctx context.Context, envName string) ([]DevURL, error) { - entClient := requireAuth() - env, err := findEnv(ctx, entClient, envName, coder.Me) + client, err := newClient() + if err != nil { + return nil, err + } + env, err := findEnv(ctx, client, envName, coder.Me) if err != nil { return nil, err } reqString := "%s/api/environments/%s/devurls?session_token=%s" - reqURL := fmt.Sprintf(reqString, entClient.BaseURL, env.ID, entClient.Token) + reqURL := fmt.Sprintf(reqString, client.BaseURL, env.ID, client.Token) resp, err := http.Get(reqURL) if err != nil { diff --git a/internal/cmd/users.go b/internal/cmd/users.go index ed892f45..b74b1758 100644 --- a/internal/cmd/users.go +++ b/internal/cmd/users.go @@ -32,9 +32,12 @@ coder users ls -o json | jq .[] | jq -r .email`, func listUsers(outputFmt *string) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - entClient := requireAuth() + client, err := newClient() + if err != nil { + return err + } - users, err := entClient.Users(cmd.Context()) + users, err := client.Users(cmd.Context()) if err != nil { return xerrors.Errorf("get users: %w", err) }