From 49679030d0d1269d98af8e9f4e26ca8bcb17a1bb Mon Sep 17 00:00:00 2001
From: Jon Ayers <jon@coder.com>
Date: Thu, 7 Dec 2023 01:04:53 +0000
Subject: [PATCH] chore: update build_reason 'autolock' -> 'dormancy'

---
 coderd/audit/request.go                       | 10 ++--
 coderd/autobuild/lifecycle_executor.go        | 58 ++++++-------------
 coderd/database/dump.sql                      |  2 +-
 .../000174_rename_autolock.down.sql           |  1 +
 .../migrations/000174_rename_autolock.up.sql  |  1 +
 coderd/database/models.go                     |  6 +-
 .../provisionerdserver/provisionerdserver.go  |  8 +--
 enterprise/coderd/workspaces_test.go          |  2 +-
 8 files changed, 34 insertions(+), 54 deletions(-)
 create mode 100644 coderd/database/migrations/000174_rename_autolock.down.sql
 create mode 100644 coderd/database/migrations/000174_rename_autolock.up.sql

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)