diff --git a/coderd/audit/request.go b/coderd/audit/request.go index 6e738f9929bbb..eff3dbce8145c 100644 --- a/coderd/audit/request.go +++ b/coderd/audit/request.go @@ -47,12 +47,12 @@ type Request[T Auditable] struct { Action database.AuditAction } -type BuildAuditParams[T Auditable] struct { +type BackgroundAuditParams[T Auditable] struct { Audit Auditor Log slog.Logger UserID uuid.UUID - JobID uuid.UUID + RequestID uuid.UUID Status int Action database.AuditAction OrganizationID uuid.UUID @@ -255,9 +255,9 @@ func InitRequest[T Auditable](w http.ResponseWriter, p *RequestParams) (*Request } } -// WorkspaceBuildAudit creates an audit log for a workspace build. +// BackgroundAudit creates an audit log for a background event. // The audit log is committed upon invocation. -func WorkspaceBuildAudit[T Auditable](ctx context.Context, p *BuildAuditParams[T]) { +func BackgroundAudit[T Auditable](ctx context.Context, p *BackgroundAuditParams[T]) { ip := parseIP(p.IP) diff := Diff(p.Audit, p.Old, p.New) @@ -285,7 +285,7 @@ func WorkspaceBuildAudit[T Auditable](ctx context.Context, p *BuildAuditParams[T Action: p.Action, Diff: diffRaw, StatusCode: int32(p.Status), - RequestID: p.JobID, + RequestID: p.RequestID, AdditionalFields: p.AdditionalFields, } err = p.Audit.Export(ctx, auditLog) diff --git a/coderd/autobuild/lifecycle_executor.go b/coderd/autobuild/lifecycle_executor.go index 6ebd741a53187..2119ea61ab5ac 100644 --- a/coderd/autobuild/lifecycle_executor.go +++ b/coderd/autobuild/lifecycle_executor.go @@ -3,9 +3,7 @@ package autobuild import ( "context" "database/sql" - "encoding/json" "net/http" - "strconv" "sync" "sync/atomic" "time" @@ -184,7 +182,6 @@ func (e *Executor) runOnce(t time.Time) Stats { return nil } - var build *database.WorkspaceBuild if nextTransition != "" { builder := wsbuilder.New(ws, nextTransition). SetLastWorkspaceBuildInTx(&latestBuild). @@ -197,7 +194,7 @@ func (e *Executor) runOnce(t time.Time) Stats { builder = builder.ActiveVersion() } - build, job, err = builder.Build(e.ctx, tx, nil, audit.WorkspaceBuildBaggage{IP: "127.0.0.1"}) + _, job, err = builder.Build(e.ctx, tx, nil, audit.WorkspaceBuildBaggage{IP: "127.0.0.1"}) if err != nil { return xerrors.Errorf("build workspace with transition %q: %w", nextTransition, err) } @@ -205,7 +202,7 @@ func (e *Executor) runOnce(t time.Time) Stats { // Transition the workspace to dormant if it has breached the template's // threshold for inactivity. - if reason == database.BuildReasonAutolock { + if reason == database.BuildReasonDormancy { wsOld := ws ws, err = tx.UpdateWorkspaceDormantDeletingAt(e.ctx, database.UpdateWorkspaceDormantDeletingAtParams{ ID: ws.ID, @@ -216,11 +213,8 @@ func (e *Executor) runOnce(t time.Time) Stats { }) auditLog = &auditParams{ - Build: build, - Job: latestJob, - Reason: reason, - Old: wsOld, - New: ws, + Old: wsOld, + New: ws, } if err != nil { return xerrors.Errorf("update workspace dormant deleting at: %w", err) @@ -328,11 +322,11 @@ func getNextTransition( case isEligibleForDormantStop(ws, templateSchedule, currentTick): // Only stop started workspaces. if latestBuild.Transition == database.WorkspaceTransitionStart { - return database.WorkspaceTransitionStop, database.BuildReasonAutolock, nil + return database.WorkspaceTransitionStop, database.BuildReasonDormancy, nil } // We shouldn't transition the workspace but we should still // make it dormant. - return "", database.BuildReasonAutolock, nil + return "", database.BuildReasonDormancy, nil case isEligibleForDelete(ws, templateSchedule, latestBuild, latestJob, currentTick): return database.WorkspaceTransitionDelete, database.BuildReasonAutodelete, nil @@ -462,45 +456,29 @@ func isEligibleForFailedStop(build database.WorkspaceBuild, job database.Provisi } type auditParams struct { - Build *database.WorkspaceBuild - Job database.ProvisionerJob - Reason database.BuildReason Old database.Workspace New database.Workspace Success bool } func auditBuild(ctx context.Context, log slog.Logger, auditor audit.Auditor, params auditParams) { - fields := audit.AdditionalFields{ - WorkspaceName: params.New.Name, - BuildReason: params.Reason, - } - - if params.Build != nil { - fields.BuildNumber = strconv.FormatInt(int64(params.Build.BuildNumber), 10) - } - - raw, err := json.Marshal(fields) - if err != nil { - log.Error(ctx, "marshal resource info for successful job", slog.Error(err)) - } - status := http.StatusInternalServerError if params.Success { status = http.StatusOK } - audit.WorkspaceBuildAudit(ctx, &audit.BuildAuditParams[database.Workspace]{ - Audit: auditor, - Log: log, - UserID: params.Job.InitiatorID, - OrganizationID: params.New.OrganizationID, - JobID: params.Job.ID, - Action: database.AuditActionWrite, - Old: params.Old, - New: params.New, - Status: status, - AdditionalFields: raw, + audit.BackgroundAudit(ctx, &audit.BackgroundAuditParams[database.Workspace]{ + Audit: auditor, + Log: log, + UserID: params.New.OwnerID, + OrganizationID: params.New.OrganizationID, + // Right now there's no request associated with an autobuild + // operation. + RequestID: uuid.Nil, + Action: database.AuditActionWrite, + Old: params.Old, + New: params.New, + Status: status, }) } diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 2a439aad78144..01c2930f525ce 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -31,7 +31,7 @@ CREATE TYPE build_reason AS ENUM ( 'initiator', 'autostart', 'autostop', - 'autolock', + 'dormancy', 'failedstop', 'autodelete' ); diff --git a/coderd/database/migrations/000174_rename_autolock.down.sql b/coderd/database/migrations/000174_rename_autolock.down.sql new file mode 100644 index 0000000000000..48fc47c4080b0 --- /dev/null +++ b/coderd/database/migrations/000174_rename_autolock.down.sql @@ -0,0 +1 @@ +ALTER TYPE build_reason RENAME VALUE 'dormancy' TO 'autolock'; diff --git a/coderd/database/migrations/000174_rename_autolock.up.sql b/coderd/database/migrations/000174_rename_autolock.up.sql new file mode 100644 index 0000000000000..d93d724ac4f2e --- /dev/null +++ b/coderd/database/migrations/000174_rename_autolock.up.sql @@ -0,0 +1 @@ +ALTER TYPE build_reason RENAME VALUE 'autolock' TO 'dormancy'; diff --git a/coderd/database/models.go b/coderd/database/models.go index c5b40c66f58ab..4ab748e8d8c12 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -275,7 +275,7 @@ const ( BuildReasonInitiator BuildReason = "initiator" BuildReasonAutostart BuildReason = "autostart" BuildReasonAutostop BuildReason = "autostop" - BuildReasonAutolock BuildReason = "autolock" + BuildReasonDormancy BuildReason = "dormancy" BuildReasonFailedstop BuildReason = "failedstop" BuildReasonAutodelete BuildReason = "autodelete" ) @@ -320,7 +320,7 @@ func (e BuildReason) Valid() bool { case BuildReasonInitiator, BuildReasonAutostart, BuildReasonAutostop, - BuildReasonAutolock, + BuildReasonDormancy, BuildReasonFailedstop, BuildReasonAutodelete: return true @@ -333,7 +333,7 @@ func AllBuildReasonValues() []BuildReason { BuildReasonInitiator, BuildReasonAutostart, BuildReasonAutostop, - BuildReasonAutolock, + BuildReasonDormancy, BuildReasonFailedstop, BuildReasonAutodelete, } diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index cd0443bb183c4..283692d01145f 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -914,12 +914,12 @@ func (s *server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*proto. bag := audit.BaggageFromContext(ctx) - audit.WorkspaceBuildAudit(ctx, &audit.BuildAuditParams[database.WorkspaceBuild]{ + audit.BackgroundAudit(ctx, &audit.BackgroundAuditParams[database.WorkspaceBuild]{ Audit: *auditor, Log: s.Logger, UserID: job.InitiatorID, OrganizationID: workspace.OrganizationID, - JobID: job.ID, + RequestID: job.ID, IP: bag.IP, Action: auditAction, Old: previousBuild, @@ -1271,12 +1271,12 @@ func (s *server) CompleteJob(ctx context.Context, completed *proto.CompletedJob) bag := audit.BaggageFromContext(ctx) - audit.WorkspaceBuildAudit(ctx, &audit.BuildAuditParams[database.WorkspaceBuild]{ + audit.BackgroundAudit(ctx, &audit.BackgroundAuditParams[database.WorkspaceBuild]{ Audit: *auditor, Log: s.Logger, UserID: job.InitiatorID, OrganizationID: workspace.OrganizationID, - JobID: job.ID, + RequestID: job.ID, IP: bag.IP, Action: auditAction, Old: previousBuild, diff --git a/enterprise/coderd/workspaces_test.go b/enterprise/coderd/workspaces_test.go index f168e148a2b40..179c23321f698 100644 --- a/enterprise/coderd/workspaces_test.go +++ b/enterprise/coderd/workspaces_test.go @@ -308,7 +308,7 @@ func TestWorkspaceAutobuild(t *testing.T) { err := json.Unmarshal(alog.AdditionalFields, &fields) require.NoError(t, err) require.Equal(t, ws.Name, fields.WorkspaceName) - require.Equal(t, database.BuildReasonAutolock, fields.BuildReason) + require.Equal(t, database.BuildReasonDormancy, fields.BuildReason) default: t.Fatalf("unexpected audit log (%+v)", alog)