mirror of
https://github.com/coder/coder.git
synced 2025-07-18 14:17:22 +00:00
chore: fix TestWorkspaceAutobuild/DormancyThresholdOK flake (#11251)
This commit is contained in:
@ -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.
|
||||||
|
Reference in New Issue
Block a user