Persisting presets defined with prebuilds to DB

Signed-off-by: Danny Kopping <danny@coder.com>
This commit is contained in:
Danny Kopping
2025-02-04 14:41:07 +00:00
parent 0ba8f89df1
commit b60f2f66c6
20 changed files with 896 additions and 650 deletions

View File

@ -3150,6 +3150,13 @@ func (q *querier) InsertPresetParameters(ctx context.Context, arg database.Inser
return q.db.InsertPresetParameters(ctx, arg)
}
func (q *querier) InsertPresetPrebuild(ctx context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
return database.TemplateVersionPresetPrebuild{}, err
}
return q.db.InsertPresetPrebuild(ctx, arg)
}
// TODO: We need to create a ProvisionerJob resource type
func (q *querier) InsertProvisionerJob(ctx context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
// if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {

View File

@ -8195,6 +8195,15 @@ func (q *FakeQuerier) InsertPresetParameters(_ context.Context, arg database.Ins
return presetParameters, nil
}
func (q *FakeQuerier) InsertPresetPrebuild(ctx context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
err := validateDatabaseType(arg)
if err != nil {
return database.TemplateVersionPresetPrebuild{}, err
}
panic("not implemented")
}
func (q *FakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
if err := validateDatabaseType(arg); err != nil {
return database.ProvisionerJob{}, err

View File

@ -1960,6 +1960,13 @@ func (m queryMetricsStore) InsertPresetParameters(ctx context.Context, arg datab
return r0, r1
}
func (m queryMetricsStore) InsertPresetPrebuild(ctx context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
start := time.Now()
r0, r1 := m.s.InsertPresetPrebuild(ctx, arg)
m.queryLatencies.WithLabelValues("InsertPresetPrebuild").Observe(time.Since(start).Seconds())
return r0, r1
}
func (m queryMetricsStore) InsertProvisionerJob(ctx context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
start := time.Now()
job, err := m.s.InsertProvisionerJob(ctx, arg)

View File

@ -190,6 +190,21 @@ func (mr *MockStoreMockRecorder) BulkMarkNotificationMessagesSent(ctx, arg any)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BulkMarkNotificationMessagesSent", reflect.TypeOf((*MockStore)(nil).BulkMarkNotificationMessagesSent), ctx, arg)
}
// ClaimPrebuild mocks base method.
func (m *MockStore) ClaimPrebuild(ctx context.Context, arg database.ClaimPrebuildParams) (database.ClaimPrebuildRow, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ClaimPrebuild", ctx, arg)
ret0, _ := ret[0].(database.ClaimPrebuildRow)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ClaimPrebuild indicates an expected call of ClaimPrebuild.
func (mr *MockStoreMockRecorder) ClaimPrebuild(ctx, arg any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClaimPrebuild", reflect.TypeOf((*MockStore)(nil).ClaimPrebuild), ctx, arg)
}
// CleanTailnetCoordinators mocks base method.
func (m *MockStore) CleanTailnetCoordinators(ctx context.Context) error {
m.ctrl.T.Helper()
@ -2616,6 +2631,21 @@ func (mr *MockStoreMockRecorder) GetTemplateParameterInsights(ctx, arg any) *gom
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTemplateParameterInsights", reflect.TypeOf((*MockStore)(nil).GetTemplateParameterInsights), ctx, arg)
}
// GetTemplatePrebuildState mocks base method.
func (m *MockStore) GetTemplatePrebuildState(ctx context.Context, templateID uuid.UUID) ([]database.GetTemplatePrebuildStateRow, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetTemplatePrebuildState", ctx, templateID)
ret0, _ := ret[0].([]database.GetTemplatePrebuildStateRow)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetTemplatePrebuildState indicates an expected call of GetTemplatePrebuildState.
func (mr *MockStoreMockRecorder) GetTemplatePrebuildState(ctx, templateID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTemplatePrebuildState", reflect.TypeOf((*MockStore)(nil).GetTemplatePrebuildState), ctx, templateID)
}
// GetTemplateUsageStats mocks base method.
func (m *MockStore) GetTemplateUsageStats(ctx context.Context, arg database.GetTemplateUsageStatsParams) ([]database.TemplateUsageStat, error) {
m.ctrl.T.Helper()
@ -4126,6 +4156,21 @@ func (mr *MockStoreMockRecorder) InsertPresetParameters(ctx, arg any) *gomock.Ca
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertPresetParameters", reflect.TypeOf((*MockStore)(nil).InsertPresetParameters), ctx, arg)
}
// InsertPresetPrebuild mocks base method.
func (m *MockStore) InsertPresetPrebuild(ctx context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "InsertPresetPrebuild", ctx, arg)
ret0, _ := ret[0].(database.TemplateVersionPresetPrebuild)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// InsertPresetPrebuild indicates an expected call of InsertPresetPrebuild.
func (mr *MockStoreMockRecorder) InsertPresetPrebuild(ctx, arg any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertPresetPrebuild", reflect.TypeOf((*MockStore)(nil).InsertPresetPrebuild), ctx, arg)
}
// InsertProvisionerJob mocks base method.
func (m *MockStore) InsertProvisionerJob(ctx context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
m.ctrl.T.Helper()

View File

@ -60,6 +60,7 @@ type sqlcQuerier interface {
BatchUpdateWorkspaceNextStartAt(ctx context.Context, arg BatchUpdateWorkspaceNextStartAtParams) error
BulkMarkNotificationMessagesFailed(ctx context.Context, arg BulkMarkNotificationMessagesFailedParams) (int64, error)
BulkMarkNotificationMessagesSent(ctx context.Context, arg BulkMarkNotificationMessagesSentParams) (int64, error)
// TODO: rewrite to use named CTE instead?
ClaimPrebuild(ctx context.Context, arg ClaimPrebuildParams) (ClaimPrebuildRow, error)
CleanTailnetCoordinators(ctx context.Context) error
CleanTailnetLostPeers(ctx context.Context) error
@ -411,6 +412,7 @@ type sqlcQuerier interface {
InsertOrganizationMember(ctx context.Context, arg InsertOrganizationMemberParams) (OrganizationMember, error)
InsertPreset(ctx context.Context, arg InsertPresetParams) (TemplateVersionPreset, error)
InsertPresetParameters(ctx context.Context, arg InsertPresetParametersParams) ([]TemplateVersionPresetParameter, error)
InsertPresetPrebuild(ctx context.Context, arg InsertPresetPrebuildParams) (TemplateVersionPresetPrebuild, error)
InsertProvisionerJob(ctx context.Context, arg InsertProvisionerJobParams) (ProvisionerJob, error)
InsertProvisionerJobLogs(ctx context.Context, arg InsertProvisionerJobLogsParams) ([]ProvisionerJobLog, error)
InsertProvisionerJobTimings(ctx context.Context, arg InsertProvisionerJobTimingsParams) ([]ProvisionerJobTiming, error)

View File

@ -5423,6 +5423,7 @@ type ClaimPrebuildRow struct {
Name string `db:"name" json:"name"`
}
// TODO: rewrite to use named CTE instead?
func (q *sqlQuerier) ClaimPrebuild(ctx context.Context, arg ClaimPrebuildParams) (ClaimPrebuildRow, error) {
row := q.db.QueryRowContext(ctx, claimPrebuild, arg.NewUserID, arg.NewName)
var i ClaimPrebuildRow
@ -5557,6 +5558,36 @@ func (q *sqlQuerier) GetTemplatePrebuildState(ctx context.Context, templateID uu
return items, nil
}
const insertPresetPrebuild = `-- name: InsertPresetPrebuild :one
INSERT INTO template_version_preset_prebuilds (id, preset_id, desired_instances, invalidate_after_secs)
VALUES ($1::uuid, $2::uuid, $3::int, $4::int)
RETURNING id, preset_id, desired_instances, invalidate_after_secs
`
type InsertPresetPrebuildParams struct {
ID uuid.UUID `db:"id" json:"id"`
PresetID uuid.UUID `db:"preset_id" json:"preset_id"`
DesiredInstances int32 `db:"desired_instances" json:"desired_instances"`
InvalidateAfterSecs int32 `db:"invalidate_after_secs" json:"invalidate_after_secs"`
}
func (q *sqlQuerier) InsertPresetPrebuild(ctx context.Context, arg InsertPresetPrebuildParams) (TemplateVersionPresetPrebuild, error) {
row := q.db.QueryRowContext(ctx, insertPresetPrebuild,
arg.ID,
arg.PresetID,
arg.DesiredInstances,
arg.InvalidateAfterSecs,
)
var i TemplateVersionPresetPrebuild
err := row.Scan(
&i.ID,
&i.PresetID,
&i.DesiredInstances,
&i.InvalidateAfterSecs,
)
return i, err
}
const getPresetByWorkspaceBuildID = `-- name: GetPresetByWorkspaceBuildID :one
SELECT
template_version_presets.id, template_version_presets.template_version_id, template_version_presets.name, template_version_presets.created_at

View File

@ -72,6 +72,7 @@ GROUP BY t.using_active_version, t.template_id, t.template_version_id, p.count,
p.template_version_id, t.deleted, t.deprecated;
-- name: ClaimPrebuild :one
-- TODO: rewrite to use named CTE instead?
UPDATE workspaces w
SET owner_id = @new_user_id::uuid,
name = @new_name::text,
@ -87,3 +88,8 @@ WHERE w.id IN (SELECT p.id
ORDER BY random()
LIMIT 1 FOR UPDATE OF p SKIP LOCKED)
RETURNING w.id, w.name;
-- name: InsertPresetPrebuild :one
INSERT INTO template_version_preset_prebuilds (id, preset_id, desired_instances, invalidate_after_secs)
VALUES (@id::uuid, @preset_id::uuid, @desired_instances::int, @invalidate_after_secs::int)
RETURNING *;