From 5dc02541d77e1705aa4b7fa2730249bddccfb712 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Thu, 30 Nov 2023 21:59:00 +0000 Subject: [PATCH 1/3] fix: fix TestWorkspaceAutobuild/InactiveTTLOK flake --- enterprise/coderd/workspaces_test.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/enterprise/coderd/workspaces_test.go b/enterprise/coderd/workspaces_test.go index b288e4a88f211..37b08383e94da 100644 --- a/enterprise/coderd/workspaces_test.go +++ b/enterprise/coderd/workspaces_test.go @@ -239,7 +239,7 @@ func TestWorkspaceAutobuild(t *testing.T) { require.Len(t, stats.Transitions, 0) }) - t.Run("InactiveTTLOK", func(t *testing.T) { + t.Run("DormancyThresholdOK", func(t *testing.T) { t.Parallel() var ( @@ -274,8 +274,10 @@ func TestWorkspaceAutobuild(t *testing.T) { coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) - require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + // Transition it to the stop state so we don't have to worry + // about the provisioner generating a workspace_build audit log. + ws = coderdtest.MustTransitionWorkspace(t, client, ws.ID, database.WorkspaceTransitionStart, database.WorkspaceTransitionStop) // Reset the audit log so we can verify a log is generated. auditRecorder.ResetLogs() @@ -390,7 +392,7 @@ func TestWorkspaceAutobuild(t *testing.T) { } }) - t.Run("InactiveTTLTooEarly", func(t *testing.T) { + t.Run("DormancyThresholdTooEarly", func(t *testing.T) { t.Parallel() var ( @@ -473,7 +475,7 @@ func TestWorkspaceAutobuild(t *testing.T) { // Assert that a stopped workspace that breaches the inactivity threshold // does not trigger a build transition but is still placed in the - // lock state. + // dormant state. t.Run("InactiveStoppedWorkspaceNoTransition", func(t *testing.T) { t.Parallel() From 26fffdbff86c64e0ecb583e07fe483e19f45678f Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Thu, 30 Nov 2023 23:04:21 +0000 Subject: [PATCH 2/3] check for both audit logs instead --- enterprise/coderd/workspaces_test.go | 45 +++++++++++++++++----------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/enterprise/coderd/workspaces_test.go b/enterprise/coderd/workspaces_test.go index 37b08383e94da..150fdf46241e6 100644 --- a/enterprise/coderd/workspaces_test.go +++ b/enterprise/coderd/workspaces_test.go @@ -274,10 +274,8 @@ func TestWorkspaceAutobuild(t *testing.T) { coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) - // Transition it to the stop state so we don't have to worry - // about the provisioner generating a workspace_build audit log. - ws = coderdtest.MustTransitionWorkspace(t, client, ws.ID, database.WorkspaceTransitionStart, database.WorkspaceTransitionStop) // Reset the audit log so we can verify a log is generated. auditRecorder.ResetLogs() @@ -289,29 +287,42 @@ func TestWorkspaceAutobuild(t *testing.T) { // failure TTL. require.Len(t, stats.Transitions, 1) require.Equal(t, stats.Transitions[ws.ID], database.WorkspaceTransitionStop) - require.Len(t, auditRecorder.AuditLogs(), 1) - - auditLog := auditRecorder.AuditLogs()[0] - require.Equal(t, auditLog.Action, database.AuditActionWrite) - - var fields audit.AdditionalFields - err := json.Unmarshal(auditLog.AdditionalFields, &fields) - require.NoError(t, err) - require.Equal(t, ws.Name, fields.WorkspaceName) - require.Equal(t, database.BuildReasonAutolock, fields.BuildReason) - // The workspace should be dormant. ws = coderdtest.MustWorkspace(t, client, ws.ID) require.NotNil(t, ws.DormantAt) - lastUsedAt := ws.LastUsedAt - err = client.UpdateWorkspaceDormancy(ctx, ws.ID, codersdk.UpdateWorkspaceDormancy{Dormant: false}) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + // We should get 2 audit logs, one for stopping the workspace, and one for + // making it dormant. + alogs := auditRecorder.AuditLogs() + require.Len(t, alogs, 2) + + for _, alog := range alogs { + require.Equal(t, int32(http.StatusOK), alog.StatusCode) + + switch alog.Action { + case database.AuditActionWrite: + require.Equal(t, database.ResourceTypeWorkspace, alog.ResourceType) + case database.AuditActionStop: + var fields audit.AdditionalFields + err := json.Unmarshal(alog.AdditionalFields, &fields) + require.NoError(t, err) + require.Equal(t, ws.Name, fields.WorkspaceName) + require.Equal(t, database.BuildReasonAutolock, fields.BuildReason) + + default: + t.Fatalf("unexpected audit log (%+v)", alog) + } + } + + dormantLastUsedAt := ws.LastUsedAt + 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 // retrigger another lock action. ws = coderdtest.MustWorkspace(t, client, ws.ID) - require.True(t, ws.LastUsedAt.After(lastUsedAt)) + require.True(t, ws.LastUsedAt.After(dormantLastUsedAt)) }) // This test serves as a regression prevention for generating From 8ca76dd5f169a6473be2326e2ef9a053164b8839 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Thu, 30 Nov 2023 23:33:36 +0000 Subject: [PATCH 3/3] lint --- enterprise/coderd/workspaces_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/enterprise/coderd/workspaces_test.go b/enterprise/coderd/workspaces_test.go index 150fdf46241e6..928e545fe6783 100644 --- a/enterprise/coderd/workspaces_test.go +++ b/enterprise/coderd/workspaces_test.go @@ -316,6 +316,7 @@ func TestWorkspaceAutobuild(t *testing.T) { } dormantLastUsedAt := ws.LastUsedAt + // nolint:gocritic // this test is not testing RBAC. err := client.UpdateWorkspaceDormancy(ctx, ws.ID, codersdk.UpdateWorkspaceDormancy{Dormant: false}) require.NoError(t, err)