feat(coderd/database): add support for presets (#16509)

This pull requests adds the necessary migrations and queries to support
presets within the coderd database. Future PRs will build functionality
to the provisioners and the frontend.
This commit is contained in:
Sas Swart
2025-02-11 13:55:09 +02:00
committed by GitHub
parent 0e728a7a9b
commit 34b46f9205
20 changed files with 948 additions and 144 deletions
+102
View File
@@ -90,6 +90,8 @@ func New() database.Store {
runtimeConfig: map[string]string{},
userStatusChanges: make([]database.UserStatusChange, 0),
telemetryItems: make([]database.TelemetryItem, 0),
presets: make([]database.TemplateVersionPreset, 0),
presetParameters: make([]database.TemplateVersionPresetParameter, 0),
},
}
// Always start with a default org. Matching migration 198.
@@ -262,6 +264,8 @@ type data struct {
defaultProxyIconURL string
userStatusChanges []database.UserStatusChange
telemetryItems []database.TelemetryItem
presets []database.TemplateVersionPreset
presetParameters []database.TemplateVersionPresetParameter
}
func tryPercentile(fs []float64, p float64) float64 {
@@ -3776,6 +3780,61 @@ func (q *FakeQuerier) GetParameterSchemasByJobID(_ context.Context, jobID uuid.U
return parameters, nil
}
func (q *FakeQuerier) GetPresetByWorkspaceBuildID(_ context.Context, workspaceBuildID uuid.UUID) (database.TemplateVersionPreset, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()
for _, workspaceBuild := range q.workspaceBuilds {
if workspaceBuild.ID != workspaceBuildID {
continue
}
for _, preset := range q.presets {
if preset.TemplateVersionID == workspaceBuild.TemplateVersionID {
return preset, nil
}
}
}
return database.TemplateVersionPreset{}, sql.ErrNoRows
}
func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()
presets := make([]database.TemplateVersionPreset, 0)
parameters := make([]database.TemplateVersionPresetParameter, 0)
for _, preset := range q.presets {
if preset.TemplateVersionID != templateVersionID {
continue
}
presets = append(presets, preset)
}
for _, parameter := range q.presetParameters {
for _, preset := range presets {
if parameter.TemplateVersionPresetID != preset.ID {
continue
}
parameters = append(parameters, parameter)
break
}
}
return parameters, nil
}
func (q *FakeQuerier) GetPresetsByTemplateVersionID(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPreset, error) {
q.mutex.RLock()
defer q.mutex.RUnlock()
presets := make([]database.TemplateVersionPreset, 0)
for _, preset := range q.presets {
if preset.TemplateVersionID == templateVersionID {
presets = append(presets, preset)
}
}
return presets, nil
}
func (q *FakeQuerier) GetPreviousTemplateVersion(_ context.Context, arg database.GetPreviousTemplateVersionParams) (database.TemplateVersion, error) {
if err := validateDatabaseType(arg); err != nil {
return database.TemplateVersion{}, err
@@ -8081,6 +8140,49 @@ func (q *FakeQuerier) InsertOrganizationMember(_ context.Context, arg database.I
return organizationMember, nil
}
func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetParams) (database.TemplateVersionPreset, error) {
err := validateDatabaseType(arg)
if err != nil {
return database.TemplateVersionPreset{}, err
}
q.mutex.Lock()
defer q.mutex.Unlock()
preset := database.TemplateVersionPreset{
ID: uuid.New(),
TemplateVersionID: arg.TemplateVersionID,
Name: arg.Name,
CreatedAt: arg.CreatedAt,
}
q.presets = append(q.presets, preset)
return preset, nil
}
func (q *FakeQuerier) InsertPresetParameters(_ context.Context, arg database.InsertPresetParametersParams) ([]database.TemplateVersionPresetParameter, error) {
err := validateDatabaseType(arg)
if err != nil {
return nil, err
}
q.mutex.Lock()
defer q.mutex.Unlock()
presetParameters := make([]database.TemplateVersionPresetParameter, 0, len(arg.Names))
for i, v := range arg.Names {
presetParameter := database.TemplateVersionPresetParameter{
ID: uuid.New(),
TemplateVersionPresetID: arg.TemplateVersionPresetID,
Name: v,
Value: arg.Values[i],
}
presetParameters = append(presetParameters, presetParameter)
q.presetParameters = append(q.presetParameters, presetParameter)
}
return presetParameters, nil
}
func (q *FakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
if err := validateDatabaseType(arg); err != nil {
return database.ProvisionerJob{}, err