Skip to content

Commit 1196f83

Browse files
authored
feat: automatically activate dormant workspaces when manually started (coder#11655)
1 parent d74aae7 commit 1196f83

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

cli/start.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ func buildWorkspaceStartRequest(inv *clibase.Invocation, client *codersdk.Client
125125
}
126126

127127
func startWorkspace(inv *clibase.Invocation, client *codersdk.Client, workspace codersdk.Workspace, parameterFlags workspaceParameterFlags, action WorkspaceCLIAction) (codersdk.WorkspaceBuild, error) {
128+
if workspace.DormantAt != nil {
129+
_, _ = fmt.Fprintln(inv.Stdout, "Activating dormant workspace...")
130+
err := client.UpdateWorkspaceDormancy(inv.Context(), workspace.ID, codersdk.UpdateWorkspaceDormancy{
131+
Dormant: false,
132+
})
133+
if err != nil {
134+
return codersdk.WorkspaceBuild{}, xerrors.Errorf("activate workspace: %w", err)
135+
}
136+
}
128137
req, err := buildWorkspaceStartRequest(inv, client, workspace, parameterFlags, action)
129138
if err != nil {
130139
return codersdk.WorkspaceBuild{}, err

enterprise/cli/start_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,4 +167,46 @@ func TestStart(t *testing.T) {
167167
})
168168
}
169169
})
170+
171+
t.Run("StartActivatesDormant", func(t *testing.T) {
172+
t.Parallel()
173+
174+
ctx := testutil.Context(t, testutil.WaitMedium)
175+
ownerClient, owner := coderdenttest.New(t, &coderdenttest.Options{
176+
Options: &coderdtest.Options{
177+
IncludeProvisionerDaemon: true,
178+
},
179+
LicenseOptions: &coderdenttest.LicenseOptions{
180+
Features: license.Features{
181+
codersdk.FeatureAdvancedTemplateScheduling: 1,
182+
},
183+
},
184+
})
185+
186+
version := coderdtest.CreateTemplateVersion(t, ownerClient, owner.OrganizationID, nil)
187+
_ = coderdtest.AwaitTemplateVersionJobCompleted(t, ownerClient, version.ID)
188+
template := coderdtest.CreateTemplate(t, ownerClient, owner.OrganizationID, version.ID)
189+
190+
memberClient, _ := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID)
191+
workspace := coderdtest.CreateWorkspace(t, memberClient, owner.OrganizationID, template.ID)
192+
_ = coderdtest.AwaitWorkspaceBuildJobCompleted(t, memberClient, workspace.LatestBuild.ID)
193+
_ = coderdtest.MustTransitionWorkspace(t, memberClient, workspace.ID, database.WorkspaceTransitionStart, database.WorkspaceTransitionStop)
194+
err := memberClient.UpdateWorkspaceDormancy(ctx, workspace.ID, codersdk.UpdateWorkspaceDormancy{
195+
Dormant: true,
196+
})
197+
require.NoError(t, err)
198+
199+
inv, root := newCLI(t, "start", workspace.Name)
200+
clitest.SetupConfig(t, memberClient, root)
201+
202+
var buf bytes.Buffer
203+
inv.Stdout = &buf
204+
205+
err = inv.Run()
206+
require.NoError(t, err)
207+
require.Contains(t, buf.String(), "Activating dormant workspace...")
208+
209+
workspace = coderdtest.MustWorkspace(t, memberClient, workspace.ID)
210+
require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
211+
})
170212
}

0 commit comments

Comments
 (0)