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 | | | 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