diff --git a/docs/coder_envs.md b/docs/coder_envs.md index 5730eb52..af394d16 100644 --- a/docs/coder_envs.md +++ b/docs/coder_envs.md @@ -23,4 +23,4 @@ Perform operations on the Coder environments owned by the active user. * [coder](coder.md) - coder provides a CLI for working with an existing Coder Enterprise installation * [coder envs ls](coder_envs_ls.md) - list all environments owned by the active user -* [coder envs stop](coder_envs_stop.md) - stop a Coder environment by name +* [coder envs stop](coder_envs_stop.md) - stop Coder environments by name diff --git a/docs/coder_envs_stop.md b/docs/coder_envs_stop.md index 3ed3b2ee..1348a14c 100644 --- a/docs/coder_envs_stop.md +++ b/docs/coder_envs_stop.md @@ -1,13 +1,28 @@ ## coder envs stop -stop a Coder environment by name +stop Coder environments by name ### Synopsis -Stop a Coder environment by name +Stop Coder environments by name ``` -coder envs stop [environment_name] [flags] +coder envs stop [...environment_names] [flags] +``` + +### Examples + +``` +coder envs stop front-end-env +coder envs stop front-end-env backend-env + +# stop all of your environments +coder envs ls -o json | jq -c '.[].name' | xargs coder envs stop + +# stop all environments for a given user +coder envs --user charlie@coder.com ls -o json \ + | jq -c '.[].name' \ + | xargs coder envs --user charlie@coder.com stop ``` ### Options diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index ca6ecdad..665a0456 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -24,7 +24,7 @@ func Make() *cobra.Command { makeUsersCmd(), makeConfigSSHCmd(), makeSecretsCmd(), - makeEnvsCommand(), + envsCommand(), makeSyncCmd(), makeURLCmd(), makeResourceCmd(), diff --git a/internal/cmd/envs.go b/internal/cmd/envs.go index 49c05005..35f9435e 100644 --- a/internal/cmd/envs.go +++ b/internal/cmd/envs.go @@ -7,12 +7,13 @@ import ( "cdr.dev/coder-cli/coder-sdk" "cdr.dev/coder-cli/internal/x/xtabwriter" "github.com/spf13/cobra" + "golang.org/x/sync/errgroup" "golang.org/x/xerrors" "go.coder.com/flog" ) -func makeEnvsCommand() *cobra.Command { +func envsCommand() *cobra.Command { var outputFmt string var user string cmd := &cobra.Command{ @@ -68,26 +69,48 @@ func makeEnvsCommand() *cobra.Command { func stopEnvCommand(user *string) *cobra.Command { return &cobra.Command{ - Use: "stop [environment_name]", - Short: "stop a Coder environment by name", - Long: "Stop a Coder environment by name", - Args: cobra.ExactArgs(1), + Use: "stop [...environment_names]", + Short: "stop Coder environments by name", + Long: "Stop Coder environments by name", + Example: `coder envs stop front-end-env +coder envs stop front-end-env backend-env + +# stop all of your environments +coder envs ls -o json | jq -c '.[].name' | xargs coder envs stop + +# stop all environments for a given user +coder envs --user charlie@coder.com ls -o json \ + | jq -c '.[].name' \ + | xargs coder envs --user charlie@coder.com stop`, + Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { client, err := newClient() if err != nil { return xerrors.Errorf("new client: %w", err) } - envName := args[0] - env, err := findEnv(cmd.Context(), client, envName, *user) - if err != nil { - return xerrors.Errorf("find environment by name: %w", err) + var egroup errgroup.Group + for _, envName := range args { + envName := envName + egroup.Go(func() error { + env, err := findEnv(cmd.Context(), client, envName, *user) + if err != nil { + flog.Error("failed to find environment by name \"%s\": %v", env.Name, err) + return xerrors.Errorf("find environment by name: %w", err) + } + + if err = client.StopEnvironment(cmd.Context(), env.ID); err != nil { + flog.Error("failed to stop environment \"%s\": %v", env.Name, err) + return xerrors.Errorf("stop environment: %w", err) + } + flog.Success("Successfully stopped environment %q", envName) + return nil + }) } - if err = client.StopEnvironment(cmd.Context(), env.ID); err != nil { - return xerrors.Errorf("stop environment: %w", err) + if err = egroup.Wait(); err != nil { + return xerrors.Errorf("some stop operations failed: %w", err) } - flog.Success("Successfully stopped environment %q", envName) return nil }, } 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