feat: mark prebuilds as such and set their preset ids (#16965)

This pull request closes https://github.com/coder/internal/issues/513
This commit is contained in:
Sas Swart
2025-04-14 15:34:50 +02:00
committed by GitHub
parent 73f5af82ad
commit a98605913a
24 changed files with 613 additions and 315 deletions
+36 -17
View File
@@ -51,9 +51,10 @@ type Builder struct {
logLevel string
deploymentValues *codersdk.DeploymentValues
richParameterValues []codersdk.WorkspaceBuildParameter
initiator uuid.UUID
reason database.BuildReason
richParameterValues []codersdk.WorkspaceBuildParameter
initiator uuid.UUID
reason database.BuildReason
templateVersionPresetID uuid.UUID
// used during build, makes function arguments less verbose
ctx context.Context
@@ -73,6 +74,8 @@ type Builder struct {
parameterNames *[]string
parameterValues *[]string
prebuild bool
verifyNoLegacyParametersOnce bool
}
@@ -168,6 +171,12 @@ func (b Builder) RichParameterValues(p []codersdk.WorkspaceBuildParameter) Build
return b
}
func (b Builder) MarkPrebuild() Builder {
// nolint: revive
b.prebuild = true
return b
}
// SetLastWorkspaceBuildInTx prepopulates the Builder's cache with the last workspace build. This allows us
// to avoid a repeated database query when the Builder's caller also needs the workspace build, e.g. auto-start &
// auto-stop.
@@ -192,6 +201,12 @@ func (b Builder) SetLastWorkspaceBuildJobInTx(job *database.ProvisionerJob) Buil
return b
}
func (b Builder) TemplateVersionPresetID(id uuid.UUID) Builder {
// nolint: revive
b.templateVersionPresetID = id
return b
}
type BuildError struct {
// Status is a suitable HTTP status code
Status int
@@ -295,6 +310,7 @@ func (b *Builder) buildTx(authFunc func(action policy.Action, object rbac.Object
input, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{
WorkspaceBuildID: workspaceBuildID,
LogLevel: b.logLevel,
IsPrebuild: b.prebuild,
})
if err != nil {
return nil, nil, nil, BuildError{
@@ -363,20 +379,23 @@ func (b *Builder) buildTx(authFunc func(action policy.Action, object rbac.Object
var workspaceBuild database.WorkspaceBuild
err = b.store.InTx(func(store database.Store) error {
err = store.InsertWorkspaceBuild(b.ctx, database.InsertWorkspaceBuildParams{
ID: workspaceBuildID,
CreatedAt: now,
UpdatedAt: now,
WorkspaceID: b.workspace.ID,
TemplateVersionID: templateVersionID,
BuildNumber: buildNum,
ProvisionerState: state,
InitiatorID: b.initiator,
Transition: b.trans,
JobID: provisionerJob.ID,
Reason: b.reason,
Deadline: time.Time{}, // set by provisioner upon completion
MaxDeadline: time.Time{}, // set by provisioner upon completion
TemplateVersionPresetID: uuid.NullUUID{}, // TODO (sasswart): add this in from the caller
ID: workspaceBuildID,
CreatedAt: now,
UpdatedAt: now,
WorkspaceID: b.workspace.ID,
TemplateVersionID: templateVersionID,
BuildNumber: buildNum,
ProvisionerState: state,
InitiatorID: b.initiator,
Transition: b.trans,
JobID: provisionerJob.ID,
Reason: b.reason,
Deadline: time.Time{}, // set by provisioner upon completion
MaxDeadline: time.Time{}, // set by provisioner upon completion
TemplateVersionPresetID: uuid.NullUUID{
UUID: b.templateVersionPresetID,
Valid: b.templateVersionPresetID != uuid.Nil,
},
})
if err != nil {
code := http.StatusInternalServerError