mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
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:
@@ -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
|
||||
|
||||
@@ -41,6 +41,7 @@ var (
|
||||
lastBuildID = uuid.MustParse("12341234-0000-0000-000b-000000000000")
|
||||
lastBuildJobID = uuid.MustParse("12341234-0000-0000-000c-000000000000")
|
||||
otherUserID = uuid.MustParse("12341234-0000-0000-000d-000000000000")
|
||||
presetID = uuid.MustParse("12341234-0000-0000-000e-000000000000")
|
||||
)
|
||||
|
||||
func TestBuilder_NoOptions(t *testing.T) {
|
||||
@@ -773,6 +774,67 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestWorkspaceBuildWithPreset(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
req := require.New(t)
|
||||
asrt := assert.New(t)
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
var buildID uuid.UUID
|
||||
|
||||
mDB := expectDB(t,
|
||||
// Inputs
|
||||
withTemplate,
|
||||
withActiveVersion(nil),
|
||||
withLastBuildNotFound,
|
||||
withTemplateVersionVariables(activeVersionID, nil),
|
||||
withParameterSchemas(activeJobID, nil),
|
||||
withWorkspaceTags(activeVersionID, nil),
|
||||
withProvisionerDaemons([]database.GetEligibleProvisionerDaemonsByProvisionerJobIDsRow{}),
|
||||
|
||||
// Outputs
|
||||
expectProvisionerJob(func(job database.InsertProvisionerJobParams) {
|
||||
asrt.Equal(userID, job.InitiatorID)
|
||||
asrt.Equal(activeFileID, job.FileID)
|
||||
input := provisionerdserver.WorkspaceProvisionJob{}
|
||||
err := json.Unmarshal(job.Input, &input)
|
||||
req.NoError(err)
|
||||
// store build ID for later
|
||||
buildID = input.WorkspaceBuildID
|
||||
}),
|
||||
|
||||
withInTx,
|
||||
expectBuild(func(bld database.InsertWorkspaceBuildParams) {
|
||||
asrt.Equal(activeVersionID, bld.TemplateVersionID)
|
||||
asrt.Equal(workspaceID, bld.WorkspaceID)
|
||||
asrt.Equal(int32(1), bld.BuildNumber)
|
||||
asrt.Equal(userID, bld.InitiatorID)
|
||||
asrt.Equal(database.WorkspaceTransitionStart, bld.Transition)
|
||||
asrt.Equal(database.BuildReasonInitiator, bld.Reason)
|
||||
asrt.Equal(buildID, bld.ID)
|
||||
asrt.True(bld.TemplateVersionPresetID.Valid)
|
||||
asrt.Equal(presetID, bld.TemplateVersionPresetID.UUID)
|
||||
}),
|
||||
withBuild,
|
||||
expectBuildParameters(func(params database.InsertWorkspaceBuildParametersParams) {
|
||||
asrt.Equal(buildID, params.WorkspaceBuildID)
|
||||
asrt.Empty(params.Name)
|
||||
asrt.Empty(params.Value)
|
||||
}),
|
||||
)
|
||||
|
||||
ws := database.Workspace{ID: workspaceID, TemplateID: templateID, OwnerID: userID}
|
||||
uut := wsbuilder.New(ws, database.WorkspaceTransitionStart).
|
||||
ActiveVersion().
|
||||
TemplateVersionPresetID(presetID)
|
||||
// nolint: dogsled
|
||||
_, _, _, err := uut.Build(ctx, mDB, nil, audit.WorkspaceBuildBaggage{})
|
||||
req.NoError(err)
|
||||
}
|
||||
|
||||
type txExpect func(mTx *dbmock.MockStore)
|
||||
|
||||
func expectDB(t *testing.T, opts ...txExpect) *dbmock.MockStore {
|
||||
|
||||
Reference in New Issue
Block a user