chore: fix TestWorkspaceAutobuild/DormancyThresholdOK flake (#11251)

This commit is contained in:
Jon Ayers
2023-12-18 09:23:06 -06:00
committed by GitHub
parent 45e9d93d37
commit 56cbd47082

View File

@ -2,7 +2,6 @@ package coderd_test
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"sync/atomic" "sync/atomic"
"testing" "testing"
@ -250,10 +249,9 @@ func TestWorkspaceAutobuild(t *testing.T) {
auditRecorder = audit.NewMock() auditRecorder = audit.NewMock()
) )
client, user := coderdenttest.New(t, &coderdenttest.Options{ client, db, user := coderdenttest.NewWithDatabase(t, &coderdenttest.Options{
Options: &coderdtest.Options{ Options: &coderdtest.Options{
AutobuildTicker: ticker, AutobuildTicker: ticker,
IncludeProvisionerDaemon: true,
AutobuildStats: statCh, AutobuildStats: statCh,
TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()), TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()),
Auditor: auditRecorder, Auditor: auditRecorder,
@ -263,57 +261,45 @@ func TestWorkspaceAutobuild(t *testing.T) {
}, },
}) })
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ tpl := dbfake.TemplateVersion(t, db).Seed(database.TemplateVersion{
Parse: echo.ParseComplete, OrganizationID: user.OrganizationID,
ProvisionPlan: echo.PlanComplete, CreatedBy: user.UserID,
ProvisionApply: echo.ApplyComplete, }).Do().Template
template := coderdtest.UpdateTemplateMeta(t, client, tpl.ID, codersdk.UpdateTemplateMeta{
TimeTilDormantMillis: inactiveTTL.Milliseconds(),
}) })
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
ctr.TimeTilDormantMillis = ptr.Ref[int64](inactiveTTL.Milliseconds())
})
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
ws := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) resp := dbfake.WorkspaceBuild(t, db, database.Workspace{
OrganizationID: user.OrganizationID,
OwnerID: user.UserID,
TemplateID: template.ID,
}).Seed(database.WorkspaceBuild{
Transition: database.WorkspaceTransitionStart,
}).Do()
require.Equal(t, database.WorkspaceTransitionStart, resp.Build.Transition)
workspace := resp.Workspace
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID)
// Reset the audit log so we can verify a log is generated.
auditRecorder.ResetLogs() auditRecorder.ResetLogs()
// Simulate being inactive. // Simulate being inactive.
ticker <- ws.LastUsedAt.Add(inactiveTTL * 2) ticker <- workspace.LastUsedAt.Add(inactiveTTL * 2)
stats := <-statCh stats := <-statCh
// Expect workspace to transition to stopped state for breaching // Expect workspace to transition to stopped state for breaching
// failure TTL. // failure TTL.
require.Len(t, stats.Transitions, 1) require.Len(t, stats.Transitions, 1)
require.Equal(t, stats.Transitions[ws.ID], database.WorkspaceTransitionStop) require.Equal(t, stats.Transitions[workspace.ID], database.WorkspaceTransitionStop)
ws = coderdtest.MustWorkspace(t, client, ws.ID) ws := coderdtest.MustWorkspace(t, client, workspace.ID)
// Should be dormant now.
require.NotNil(t, ws.DormantAt) require.NotNil(t, ws.DormantAt)
// Should be transitioned to stop.
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) require.Equal(t, codersdk.WorkspaceTransitionStop, ws.LatestBuild.Transition)
// We should get 2 audit logs, one for stopping the workspace, and one for require.Len(t, auditRecorder.AuditLogs(), 1)
// making it dormant. alog := auditRecorder.AuditLogs()[0]
alogs := auditRecorder.AuditLogs()
require.Len(t, alogs, 2)
for _, alog := range alogs {
require.Equal(t, int32(http.StatusOK), alog.StatusCode) require.Equal(t, int32(http.StatusOK), alog.StatusCode)
require.Equal(t, database.AuditActionWrite, alog.Action)
switch alog.Action { require.Equal(t, workspace.Name, alog.ResourceTarget)
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.BuildReasonDormancy, fields.BuildReason)
default:
t.Fatalf("unexpected audit log (%+v)", alog)
}
}
dormantLastUsedAt := ws.LastUsedAt dormantLastUsedAt := ws.LastUsedAt
// nolint:gocritic // this test is not testing RBAC. // nolint:gocritic // this test is not testing RBAC.