Skip to content

Commit 320cd3f

Browse files
authored
feat(cli): Add restart subcommand (coder#5799)
Fixes coder#2464
1 parent 8e5aefb commit 320cd3f

File tree

5 files changed

+143
-0
lines changed

5 files changed

+143
-0
lines changed

cli/restart.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package cli
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/spf13/cobra"
8+
9+
"github.com/coder/coder/cli/cliui"
10+
"github.com/coder/coder/codersdk"
11+
)
12+
13+
func restart() *cobra.Command {
14+
cmd := &cobra.Command{
15+
Annotations: workspaceCommand,
16+
Use: "restart <workspace>",
17+
Short: "Restart a workspace",
18+
Args: cobra.ExactArgs(1),
19+
RunE: func(cmd *cobra.Command, args []string) error {
20+
ctx := cmd.Context()
21+
out := cmd.OutOrStdout()
22+
23+
_, err := cliui.Prompt(cmd, cliui.PromptOptions{
24+
Text: "Confirm restart workspace?",
25+
IsConfirm: true,
26+
})
27+
if err != nil {
28+
return err
29+
}
30+
31+
client, err := CreateClient(cmd)
32+
if err != nil {
33+
return err
34+
}
35+
workspace, err := namedWorkspace(cmd, client, args[0])
36+
if err != nil {
37+
return err
38+
}
39+
40+
build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
41+
Transition: codersdk.WorkspaceTransitionStop,
42+
})
43+
if err != nil {
44+
return err
45+
}
46+
err = cliui.WorkspaceBuild(ctx, out, client, build.ID)
47+
if err != nil {
48+
return err
49+
}
50+
51+
build, err = client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
52+
Transition: codersdk.WorkspaceTransitionStart,
53+
})
54+
if err != nil {
55+
return err
56+
}
57+
err = cliui.WorkspaceBuild(ctx, out, client, build.ID)
58+
if err != nil {
59+
return err
60+
}
61+
62+
_, _ = fmt.Fprintf(out, "\nThe %s workspace has been restarted at %s!\n", cliui.Styles.Keyword.Render(workspace.Name), cliui.Styles.DateTimeStamp.Render(time.Now().Format(time.Stamp)))
63+
return nil
64+
},
65+
}
66+
cliui.AllowSkipPrompt(cmd)
67+
return cmd
68+
}

cli/restart_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package cli_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
8+
"github.com/coder/coder/cli/clitest"
9+
"github.com/coder/coder/coderd/coderdtest"
10+
"github.com/coder/coder/pty/ptytest"
11+
"github.com/coder/coder/testutil"
12+
)
13+
14+
func TestRestart(t *testing.T) {
15+
t.Parallel()
16+
17+
t.Run("OK", func(t *testing.T) {
18+
t.Parallel()
19+
20+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
21+
user := coderdtest.CreateFirstUser(t, client)
22+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
23+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
24+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
25+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
26+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
27+
28+
ctx, _ := testutil.Context(t)
29+
30+
cmd, root := clitest.New(t, "restart", workspace.Name, "--yes")
31+
clitest.SetupConfig(t, client, root)
32+
33+
pty := ptytest.New(t)
34+
cmd.SetIn(pty.Input())
35+
cmd.SetOut(pty.Output())
36+
37+
done := make(chan error, 1)
38+
go func() {
39+
done <- cmd.ExecuteContext(ctx)
40+
}()
41+
pty.ExpectMatch("Stopping workspace")
42+
pty.ExpectMatch("Starting workspace")
43+
pty.ExpectMatch("workspace has been restarted")
44+
45+
err := <-done
46+
require.NoError(t, err, "execute failed")
47+
})
48+
}

cli/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ func Core() []*cobra.Command {
9595
start(),
9696
state(),
9797
stop(),
98+
restart(),
9899
templates(),
99100
tokens(),
100101
update(),

cli/testdata/coder_--help.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Workspace Commands:
3737
delete Delete a workspace
3838
list List workspaces
3939
rename Rename a workspace
40+
restart Restart a workspace
4041
schedule Schedule automated start and stop times for workspaces
4142
show Display details of a workspace's resources and agents
4243
speedtest Run upload and download tests from your machine to a workspace
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Restart a workspace
2+
3+
Usage:
4+
coder restart <workspace> [flags]
5+
6+
Flags:
7+
-h, --help help for restart
8+
-y, --yes Bypass prompts
9+
10+
Global Flags:
11+
--global-config coder Path to the global coder config directory.
12+
Consumes $CODER_CONFIG_DIR (default "/tmp/coder-cli-test-config")
13+
--header stringArray HTTP headers added to all requests. Provide as "Key=Value".
14+
Consumes $CODER_HEADER
15+
--no-feature-warning Suppress warnings about unlicensed features.
16+
Consumes $CODER_NO_FEATURE_WARNING
17+
--no-version-warning Suppress warning when client and server versions do not match.
18+
Consumes $CODER_NO_VERSION_WARNING
19+
--token string Specify an authentication token. For security reasons setting
20+
CODER_SESSION_TOKEN is preferred.
21+
Consumes $CODER_SESSION_TOKEN
22+
--url string URL to a deployment.
23+
Consumes $CODER_URL
24+
-v, --verbose Enable verbose output.
25+
Consumes $CODER_VERBOSE

0 commit comments

Comments
 (0)