From 672319e8b063a6635b6fa5d738b1fb8aba740255 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 25 Mar 2025 13:11:56 +0100 Subject: [PATCH 1/2] feat(cli): start workspace in no-wait mode --- cli/start.go | 17 ++++++++++++++++- cli/start_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/cli/start.go b/cli/start.go index 0e8c36da0380d..94f1a42ef7ac4 100644 --- a/cli/start.go +++ b/cli/start.go @@ -17,6 +17,8 @@ func (r *RootCmd) start() *serpent.Command { var ( parameterFlags workspaceParameterFlags bflags buildFlags + + noWait bool ) client := new(codersdk.Client) @@ -28,7 +30,15 @@ func (r *RootCmd) start() *serpent.Command { serpent.RequireNArgs(1), r.InitClient(client), ), - Options: serpent.OptionSet{cliui.SkipPromptOption()}, + Options: serpent.OptionSet{ + { + Flag: "no-wait", + Description: "Return immediately after starting the workspace.", + Value: serpent.BoolOf(&noWait), + Hidden: false, + }, + cliui.SkipPromptOption(), + }, Handler: func(inv *serpent.Invocation) error { workspace, err := namedWorkspace(inv.Context(), client, inv.Args[0]) if err != nil { @@ -80,6 +90,11 @@ func (r *RootCmd) start() *serpent.Command { } } + if noWait { + _, _ = fmt.Fprintf(inv.Stdout, "The %s workspace has been started in no-wait mode. Workspace is building in the background.\n", cliui.Keyword(workspace.Name)) + return nil + } + err = cliui.WorkspaceBuild(inv.Context(), inv.Stdout, client, build.ID) if err != nil { return err diff --git a/cli/start_test.go b/cli/start_test.go index da5fb74cacf72..48d4a1e74b416 100644 --- a/cli/start_test.go +++ b/cli/start_test.go @@ -441,3 +441,36 @@ func TestStart_Starting(t *testing.T) { _ = testutil.RequireRecvCtx(ctx, t, doneChan) } + +func TestStart_NoWait(t *testing.T) { + t.Parallel() + ctx := testutil.Context(t, testutil.WaitShort) + + // Prepare user, template, workspace + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + version1 := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version1.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version1.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + + // Stop the workspace + build := coderdtest.CreateWorkspaceBuild(t, member, workspace, database.WorkspaceTransitionStop) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, build.ID) + + // Start in no-wait mode + inv, root := clitest.New(t, "start", workspace.Name, "--no-wait") + clitest.SetupConfig(t, member, root) + doneChan := make(chan struct{}) + pty := ptytest.New(t).Attach(inv) + go func() { + defer close(doneChan) + err := inv.Run() + assert.NoError(t, err) + }() + + pty.ExpectMatch("workspace has been started in no-wait mode") + _ = testutil.RequireRecvCtx(ctx, t, doneChan) +} From 9678ff497abbf83dce8f47f306af58960a2ddd67 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Tue, 25 Mar 2025 12:31:29 +0000 Subject: [PATCH 2/2] make gen --- cli/testdata/coder_start_--help.golden | 3 +++ docs/reference/cli/start.md | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/cli/testdata/coder_start_--help.golden b/cli/testdata/coder_start_--help.golden index be40782eb5ebf..ce1134626c486 100644 --- a/cli/testdata/coder_start_--help.golden +++ b/cli/testdata/coder_start_--help.golden @@ -22,6 +22,9 @@ OPTIONS: Set the value of ephemeral parameters defined in the template. The format is "name=value". + --no-wait bool + Return immediately after starting the workspace. + --parameter string-array, $CODER_RICH_PARAMETER Rich parameter value in the format "name=value". diff --git a/docs/reference/cli/start.md b/docs/reference/cli/start.md index 1ab6df5a9c891..9f0f30cdfa8c2 100644 --- a/docs/reference/cli/start.md +++ b/docs/reference/cli/start.md @@ -11,6 +11,14 @@ coder start [flags] ## Options +### --no-wait + +| | | +|------|-------------------| +| Type | bool | + +Return immediately after starting the workspace. + ### -y, --yes | | |