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:
Jon Ayers
2023-08-24 13:25:54 -05:00
committed by GitHub
parent ebd878b6b5
commit 7f14b50dbe
67 changed files with 1174 additions and 1206 deletions

View File

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