mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
chore: rename locked to dormant (#9290)
* chore: rename locked to dormant - The following columns have been updated: - workspace.locked_at -> dormant_at - template.inactivity_ttl -> time_til_dormant - template.locked_ttl -> time_til_dormant_autodelete This change has also been reflected in the SDK. A route has also been updated from /workspaces/<id>/lock to /workspaces/<id>/dormant
This commit is contained in:
@ -217,9 +217,9 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
})
|
||||
// Create a template without setting a failure_ttl.
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||
require.Zero(t, template.InactivityTTLMillis)
|
||||
require.Zero(t, template.TimeTilDormantMillis)
|
||||
require.Zero(t, template.FailureTTLMillis)
|
||||
require.Zero(t, template.LockedTTLMillis)
|
||||
require.Zero(t, template.TimeTilDormantAutoDeleteMillis)
|
||||
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
|
||||
@ -259,7 +259,7 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
ProvisionApply: echo.ProvisionComplete,
|
||||
})
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.InactivityTTLMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
|
||||
ctr.TimeTilDormantMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
|
||||
@ -275,12 +275,12 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
require.Len(t, stats.Transitions, 1)
|
||||
require.Equal(t, stats.Transitions[ws.ID], database.WorkspaceTransitionStop)
|
||||
|
||||
// The workspace should be locked.
|
||||
// The workspace should be dormant.
|
||||
ws = coderdtest.MustWorkspace(t, client, ws.ID)
|
||||
require.NotNil(t, ws.LockedAt)
|
||||
require.NotNil(t, ws.DormantAt)
|
||||
lastUsedAt := ws.LastUsedAt
|
||||
|
||||
err := client.UpdateWorkspaceLock(ctx, ws.ID, codersdk.UpdateWorkspaceLock{Lock: false})
|
||||
err := client.UpdateWorkspaceDormancy(ctx, ws.ID, codersdk.UpdateWorkspaceDormancy{Dormant: false})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Assert that we updated our last_used_at so that we don't immediately
|
||||
@ -315,7 +315,7 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
ProvisionApply: echo.ProvisionComplete,
|
||||
})
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.InactivityTTLMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
|
||||
ctr.TimeTilDormantMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
|
||||
@ -331,13 +331,13 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
// This is kind of a dumb test but it exists to offer some marginal
|
||||
// confidence that a bug in the auto-deletion logic doesn't delete running
|
||||
// workspaces.
|
||||
t.Run("UnlockedWorkspacesNotDeleted", func(t *testing.T) {
|
||||
t.Run("ActiveWorkspacesNotDeleted", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var (
|
||||
ticker = make(chan time.Time)
|
||||
statCh = make(chan autobuild.Stats)
|
||||
lockedTTL = time.Minute
|
||||
ticker = make(chan time.Time)
|
||||
statCh = make(chan autobuild.Stats)
|
||||
autoDeleteTTL = time.Minute
|
||||
)
|
||||
|
||||
client, user := coderdenttest.New(t, &coderdenttest.Options{
|
||||
@ -357,16 +357,16 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
ProvisionApply: echo.ProvisionComplete,
|
||||
})
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.LockedTTLMillis = ptr.Ref[int64](lockedTTL.Milliseconds())
|
||||
ctr.TimeTilDormantAutoDeleteMillis = ptr.Ref[int64](autoDeleteTTL.Milliseconds())
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
|
||||
build := coderdtest.AwaitWorkspaceBuildJob(t, client, ws.LatestBuild.ID)
|
||||
require.Nil(t, ws.LockedAt)
|
||||
require.Nil(t, ws.DormantAt)
|
||||
require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status)
|
||||
ticker <- ws.LastUsedAt.Add(lockedTTL * 2)
|
||||
ticker <- ws.LastUsedAt.Add(autoDeleteTTL * 2)
|
||||
stats := <-statCh
|
||||
// Expect no transitions since workspace is unlocked.
|
||||
// Expect no transitions since workspace is active.
|
||||
require.Len(t, stats.Transitions, 0)
|
||||
})
|
||||
|
||||
@ -399,7 +399,7 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
ProvisionApply: echo.ProvisionComplete,
|
||||
})
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.InactivityTTLMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
|
||||
ctr.TimeTilDormantMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
|
||||
@ -417,13 +417,13 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
// Expect no transitions since workspace is stopped.
|
||||
require.Len(t, stats.Transitions, 0)
|
||||
ws = coderdtest.MustWorkspace(t, client, ws.ID)
|
||||
// The workspace should still be locked even though we didn't
|
||||
// The workspace should still be dormant even though we didn't
|
||||
// transition the workspace.
|
||||
require.NotNil(t, ws.LockedAt)
|
||||
require.NotNil(t, ws.DormantAt)
|
||||
})
|
||||
|
||||
// Test the flow of a workspace transitioning from
|
||||
// inactive -> locked -> deleted.
|
||||
// inactive -> dormant -> deleted.
|
||||
t.Run("WorkspaceInactiveDeleteTransition", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
@ -451,8 +451,8 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
ProvisionApply: echo.ProvisionComplete,
|
||||
})
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.InactivityTTLMillis = ptr.Ref[int64](transitionTTL.Milliseconds())
|
||||
ctr.LockedTTLMillis = ptr.Ref[int64](transitionTTL.Milliseconds())
|
||||
ctr.TimeTilDormantMillis = ptr.Ref[int64](transitionTTL.Milliseconds())
|
||||
ctr.TimeTilDormantAutoDeleteMillis = ptr.Ref[int64](transitionTTL.Milliseconds())
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
|
||||
@ -469,14 +469,14 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
require.Equal(t, stats.Transitions[ws.ID], database.WorkspaceTransitionStop)
|
||||
|
||||
ws = coderdtest.MustWorkspace(t, client, ws.ID)
|
||||
// The workspace should be locked.
|
||||
require.NotNil(t, ws.LockedAt)
|
||||
// The workspace should be dormant.
|
||||
require.NotNil(t, ws.DormantAt)
|
||||
|
||||
// Wait for the autobuilder to stop the workspace.
|
||||
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, ws.LatestBuild.ID)
|
||||
|
||||
// Simulate the workspace being locked beyond the threshold.
|
||||
ticker <- ws.LockedAt.Add(2 * transitionTTL)
|
||||
// Simulate the workspace being dormant beyond the threshold.
|
||||
ticker <- ws.DormantAt.Add(2 * transitionTTL)
|
||||
stats = <-statCh
|
||||
require.Len(t, stats.Transitions, 1)
|
||||
// The workspace should be scheduled for deletion.
|
||||
@ -494,13 +494,13 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
require.Equal(t, http.StatusGone, cerr.StatusCode())
|
||||
})
|
||||
|
||||
t.Run("LockedTTTooEarly", func(t *testing.T) {
|
||||
t.Run("DormantTTLTooEarly", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var (
|
||||
ticker = make(chan time.Time)
|
||||
statCh = make(chan autobuild.Stats)
|
||||
lockedTTL = time.Minute
|
||||
ticker = make(chan time.Time)
|
||||
statCh = make(chan autobuild.Stats)
|
||||
dormantTTL = time.Minute
|
||||
)
|
||||
|
||||
client, user := coderdenttest.New(t, &coderdenttest.Options{
|
||||
@ -520,7 +520,7 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
ProvisionApply: echo.ProvisionComplete,
|
||||
})
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.LockedTTLMillis = ptr.Ref[int64](lockedTTL.Milliseconds())
|
||||
ctr.TimeTilDormantAutoDeleteMillis = ptr.Ref[int64](dormantTTL.Milliseconds())
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
|
||||
@ -528,34 +528,34 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status)
|
||||
|
||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||
err := client.UpdateWorkspaceLock(ctx, ws.ID, codersdk.UpdateWorkspaceLock{
|
||||
Lock: true,
|
||||
err := client.UpdateWorkspaceDormancy(ctx, ws.ID, codersdk.UpdateWorkspaceDormancy{
|
||||
Dormant: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
ws = coderdtest.MustWorkspace(t, client, ws.ID)
|
||||
require.NotNil(t, ws.LockedAt)
|
||||
require.NotNil(t, ws.DormantAt)
|
||||
|
||||
// Ensure we haven't breached our threshold.
|
||||
ticker <- ws.LockedAt.Add(-lockedTTL * 2)
|
||||
ticker <- ws.DormantAt.Add(-dormantTTL * 2)
|
||||
stats := <-statCh
|
||||
// Expect no transitions since not enough time has elapsed.
|
||||
require.Len(t, stats.Transitions, 0)
|
||||
|
||||
_, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
|
||||
LockedTTLMillis: lockedTTL.Milliseconds(),
|
||||
TimeTilDormantAutoDeleteMillis: dormantTTL.Milliseconds(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Simlute the workspace breaching the threshold.
|
||||
ticker <- ws.LockedAt.Add(lockedTTL * 2)
|
||||
ticker <- ws.DormantAt.Add(dormantTTL * 2)
|
||||
stats = <-statCh
|
||||
require.Len(t, stats.Transitions, 1)
|
||||
require.Equal(t, database.WorkspaceTransitionDelete, stats.Transitions[ws.ID])
|
||||
})
|
||||
|
||||
// Assert that a locked workspace does not autostart.
|
||||
t.Run("LockedNoAutostart", func(t *testing.T) {
|
||||
// Assert that a dormant workspace does not autostart.
|
||||
t.Run("DormantNoAutostart", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var (
|
||||
@ -594,7 +594,7 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
coderdtest.AwaitWorkspaceBuildJob(t, client, ws.LatestBuild.ID)
|
||||
coderdtest.MustTransitionWorkspace(t, client, ws.ID, database.WorkspaceTransitionStart, database.WorkspaceTransitionStop)
|
||||
|
||||
// Assert that autostart works when the workspace isn't locked..
|
||||
// Assert that autostart works when the workspace isn't dormant..
|
||||
tickCh <- sched.Next(ws.LatestBuild.CreatedAt)
|
||||
stats := <-statsCh
|
||||
require.NoError(t, stats.Error)
|
||||
@ -606,9 +606,9 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
coderdtest.AwaitWorkspaceBuildJob(t, client, ws.LatestBuild.ID)
|
||||
|
||||
// Now that we've validated that the workspace is eligible for autostart
|
||||
// lets cause it to become locked.
|
||||
// lets cause it to become dormant.
|
||||
_, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
|
||||
InactivityTTLMillis: inactiveTTL.Milliseconds(),
|
||||
TimeTilDormantMillis: inactiveTTL.Milliseconds(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
@ -620,12 +620,12 @@ func TestWorkspaceAutobuild(t *testing.T) {
|
||||
require.Contains(t, stats.Transitions, ws.ID)
|
||||
require.Equal(t, database.WorkspaceTransitionStop, stats.Transitions[ws.ID])
|
||||
|
||||
// The workspace should be locked now.
|
||||
// The workspace should be dormant now.
|
||||
ws = coderdtest.MustWorkspace(t, client, ws.ID)
|
||||
coderdtest.AwaitWorkspaceBuildJob(t, client, ws.LatestBuild.ID)
|
||||
require.NotNil(t, ws.LockedAt)
|
||||
require.NotNil(t, ws.DormantAt)
|
||||
|
||||
// Assert that autostart is no longer triggered since workspace is locked.
|
||||
// Assert that autostart is no longer triggered since workspace is dormant.
|
||||
tickCh <- sched.Next(ws.LatestBuild.CreatedAt)
|
||||
stats = <-statsCh
|
||||
require.Len(t, stats.Transitions, 0)
|
||||
@ -638,7 +638,7 @@ func TestWorkspacesFiltering(t *testing.T) {
|
||||
t.Run("DeletingBy", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
lockedTTL := 24 * time.Hour
|
||||
dormantTTL := 24 * time.Hour
|
||||
|
||||
client, user := coderdenttest.New(t, &coderdenttest.Options{
|
||||
Options: &coderdtest.Options{
|
||||
@ -660,10 +660,10 @@ func TestWorkspacesFiltering(t *testing.T) {
|
||||
defer cancel()
|
||||
|
||||
template, err := client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
|
||||
LockedTTLMillis: lockedTTL.Milliseconds(),
|
||||
TimeTilDormantAutoDeleteMillis: dormantTTL.Milliseconds(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, lockedTTL.Milliseconds(), template.LockedTTLMillis)
|
||||
require.Equal(t, dormantTTL.Milliseconds(), template.TimeTilDormantAutoDeleteMillis)
|
||||
|
||||
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
|
||||
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
|
||||
@ -671,8 +671,8 @@ func TestWorkspacesFiltering(t *testing.T) {
|
||||
// stop build so workspace is inactive
|
||||
stopBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop)
|
||||
coderdtest.AwaitWorkspaceBuildJob(t, client, stopBuild.ID)
|
||||
err = client.UpdateWorkspaceLock(ctx, workspace.ID, codersdk.UpdateWorkspaceLock{
|
||||
Lock: true,
|
||||
err = client.UpdateWorkspaceDormancy(ctx, workspace.ID, codersdk.UpdateWorkspaceDormancy{
|
||||
Dormant: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
workspace = coderdtest.MustWorkspace(t, client, workspace.ID)
|
||||
@ -680,7 +680,7 @@ func TestWorkspacesFiltering(t *testing.T) {
|
||||
|
||||
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
|
||||
// adding a second to time.Now() to give some buffer in case test runs quickly
|
||||
FilterQuery: fmt.Sprintf("deleting_by:%s", time.Now().Add(time.Second).Add(lockedTTL).Format("2006-01-02")),
|
||||
FilterQuery: fmt.Sprintf("deleting_by:%s", time.Now().Add(time.Second).Add(dormantTTL).Format("2006-01-02")),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Len(t, res.Workspaces, 1)
|
||||
@ -746,7 +746,7 @@ func TestWorkspacesWithoutTemplatePerms(t *testing.T) {
|
||||
func TestWorkspaceLock(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
t.Run("TemplateLockedTTL", func(t *testing.T) {
|
||||
t.Run("TemplateTimeTilDormantAutoDelete", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
var (
|
||||
client, user = coderdenttest.New(t, &coderdenttest.Options{
|
||||
@ -761,13 +761,13 @@ func TestWorkspaceLock(t *testing.T) {
|
||||
},
|
||||
})
|
||||
|
||||
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
|
||||
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
lockedTTL = time.Minute
|
||||
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
|
||||
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||
dormantTTL = time.Minute
|
||||
)
|
||||
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
|
||||
ctr.LockedTTLMillis = ptr.Ref[int64](lockedTTL.Milliseconds())
|
||||
ctr.TimeTilDormantAutoDeleteMillis = ptr.Ref[int64](dormantTTL.Milliseconds())
|
||||
})
|
||||
|
||||
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
|
||||
@ -777,30 +777,30 @@ func TestWorkspaceLock(t *testing.T) {
|
||||
defer cancel()
|
||||
|
||||
lastUsedAt := workspace.LastUsedAt
|
||||
err := client.UpdateWorkspaceLock(ctx, workspace.ID, codersdk.UpdateWorkspaceLock{
|
||||
Lock: true,
|
||||
err := client.UpdateWorkspaceDormancy(ctx, workspace.ID, codersdk.UpdateWorkspaceDormancy{
|
||||
Dormant: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
workspace = coderdtest.MustWorkspace(t, client, workspace.ID)
|
||||
require.NoError(t, err, "fetch provisioned workspace")
|
||||
require.NotNil(t, workspace.DeletingAt)
|
||||
require.NotNil(t, workspace.LockedAt)
|
||||
require.Equal(t, workspace.LockedAt.Add(lockedTTL), *workspace.DeletingAt)
|
||||
require.WithinRange(t, *workspace.LockedAt, time.Now().Add(-time.Second*10), time.Now())
|
||||
require.NotNil(t, workspace.DormantAt)
|
||||
require.Equal(t, workspace.DormantAt.Add(dormantTTL), *workspace.DeletingAt)
|
||||
require.WithinRange(t, *workspace.DormantAt, time.Now().Add(-time.Second*10), time.Now())
|
||||
// Locking a workspace shouldn't update the last_used_at.
|
||||
require.Equal(t, lastUsedAt, workspace.LastUsedAt)
|
||||
|
||||
workspace = coderdtest.MustWorkspace(t, client, workspace.ID)
|
||||
lastUsedAt = workspace.LastUsedAt
|
||||
err = client.UpdateWorkspaceLock(ctx, workspace.ID, codersdk.UpdateWorkspaceLock{
|
||||
Lock: false,
|
||||
err = client.UpdateWorkspaceDormancy(ctx, workspace.ID, codersdk.UpdateWorkspaceDormancy{
|
||||
Dormant: false,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
workspace, err = client.Workspace(ctx, workspace.ID)
|
||||
require.NoError(t, err, "fetch provisioned workspace")
|
||||
require.Nil(t, workspace.LockedAt)
|
||||
require.Nil(t, workspace.DormantAt)
|
||||
// Unlocking a workspace should cause the deleting_at to be unset.
|
||||
require.Nil(t, workspace.DeletingAt)
|
||||
// The last_used_at should get updated when we unlock the workspace.
|
||||
|
Reference in New Issue
Block a user