From db106431e804fe2dd915391eca366a8cd2f1ff1d Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Tue, 16 Jan 2024 22:15:38 +0000 Subject: [PATCH 1/2] feat: automatically activate dormant workspaces when manually started --- cli/start.go | 10 +++++++++ enterprise/cli/start_test.go | 42 ++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/cli/start.go b/cli/start.go index a2daebde3c0cc..2e1ef45914b54 100644 --- a/cli/start.go +++ b/cli/start.go @@ -125,6 +125,16 @@ func buildWorkspaceStartRequest(inv *clibase.Invocation, client *codersdk.Client } func startWorkspace(inv *clibase.Invocation, client *codersdk.Client, workspace codersdk.Workspace, parameterFlags workspaceParameterFlags, action WorkspaceCLIAction) (codersdk.WorkspaceBuild, error) { + if workspace.DormantAt != nil { + _, _ = fmt.Fprint(inv.Stdout, "Activating dormant workspace...") + err := client.UpdateWorkspaceDormancy(inv.Context(), workspace.ID, codersdk.UpdateWorkspaceDormancy{ + Dormant: false, + }) + if err != nil { + return codersdk.WorkspaceBuild{}, xerrors.Errorf("activate workspace: %w", err) + } + _, _ = fmt.Fprintln(inv.Stdout, "OK") + } req, err := buildWorkspaceStartRequest(inv, client, workspace, parameterFlags, action) if err != nil { return codersdk.WorkspaceBuild{}, err diff --git a/enterprise/cli/start_test.go b/enterprise/cli/start_test.go index 8f3903dd6357c..f80efdf8fe502 100644 --- a/enterprise/cli/start_test.go +++ b/enterprise/cli/start_test.go @@ -167,4 +167,46 @@ func TestStart(t *testing.T) { }) } }) + + t.Run("StartActivatesDormant", func(t *testing.T) { + t.Parallel() + + ctx := testutil.Context(t, testutil.WaitMedium) + ownerClient, owner := coderdenttest.New(t, &coderdenttest.Options{ + Options: &coderdtest.Options{ + IncludeProvisionerDaemon: true, + }, + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureAdvancedTemplateScheduling: 1, + }, + }, + }) + + version := coderdtest.CreateTemplateVersion(t, ownerClient, owner.OrganizationID, nil) + _ = coderdtest.AwaitTemplateVersionJobCompleted(t, ownerClient, version.ID) + template := coderdtest.CreateTemplate(t, ownerClient, owner.OrganizationID, version.ID) + + memberClient, _ := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID) + workspace := coderdtest.CreateWorkspace(t, memberClient, owner.OrganizationID, template.ID) + _ = coderdtest.AwaitWorkspaceBuildJobCompleted(t, memberClient, workspace.LatestBuild.ID) + _ = coderdtest.MustTransitionWorkspace(t, memberClient, workspace.ID, database.WorkspaceTransitionStart, database.WorkspaceTransitionStop) + err := memberClient.UpdateWorkspaceDormancy(ctx, workspace.ID, codersdk.UpdateWorkspaceDormancy{ + Dormant: true, + }) + require.NoError(t, err) + + inv, root := newCLI(t, "start", workspace.Name) + clitest.SetupConfig(t, memberClient, root) + + var buf bytes.Buffer + inv.Stdout = &buf + + err = inv.Run() + require.NoError(t, err) + require.Contains(t, buf.String(), "Activating dormant workspace...OK") + + workspace = coderdtest.MustWorkspace(t, memberClient, workspace.ID) + require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition) + }) } From 5fe02b41d8d6f508442a033599bb38d6505b9c04 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Tue, 16 Jan 2024 22:32:07 +0000 Subject: [PATCH 2/2] output formatting --- cli/start.go | 3 +-- enterprise/cli/start_test.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cli/start.go b/cli/start.go index 2e1ef45914b54..1c5e489a820ec 100644 --- a/cli/start.go +++ b/cli/start.go @@ -126,14 +126,13 @@ func buildWorkspaceStartRequest(inv *clibase.Invocation, client *codersdk.Client func startWorkspace(inv *clibase.Invocation, client *codersdk.Client, workspace codersdk.Workspace, parameterFlags workspaceParameterFlags, action WorkspaceCLIAction) (codersdk.WorkspaceBuild, error) { if workspace.DormantAt != nil { - _, _ = fmt.Fprint(inv.Stdout, "Activating dormant workspace...") + _, _ = fmt.Fprintln(inv.Stdout, "Activating dormant workspace...") err := client.UpdateWorkspaceDormancy(inv.Context(), workspace.ID, codersdk.UpdateWorkspaceDormancy{ Dormant: false, }) if err != nil { return codersdk.WorkspaceBuild{}, xerrors.Errorf("activate workspace: %w", err) } - _, _ = fmt.Fprintln(inv.Stdout, "OK") } req, err := buildWorkspaceStartRequest(inv, client, workspace, parameterFlags, action) if err != nil { diff --git a/enterprise/cli/start_test.go b/enterprise/cli/start_test.go index f80efdf8fe502..1972ada2072bb 100644 --- a/enterprise/cli/start_test.go +++ b/enterprise/cli/start_test.go @@ -204,7 +204,7 @@ func TestStart(t *testing.T) { err = inv.Run() require.NoError(t, err) - require.Contains(t, buf.String(), "Activating dormant workspace...OK") + require.Contains(t, buf.String(), "Activating dormant workspace...") workspace = coderdtest.MustWorkspace(t, memberClient, workspace.ID) require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition)