Skip to content

Commit 6cc4cfa

Browse files
authored
feat: allow for default presets (#18445)
1 parent 3fb5d0b commit 6cc4cfa

File tree

54 files changed

+2183
-655
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2183
-655
lines changed

CLAUDE.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,4 @@ Read [cursor rules](.cursorrules).
103103

104104
The frontend is contained in the site folder.
105105

106-
For building Frontend refer to [this document](docs/contributing/frontend.md)
107106
For building Frontend refer to [this document](docs/about/contributing/frontend.md)

coderd/apidoc/docs.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbfake/dbfake.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse {
416416
DesiredInstances: preset.DesiredInstances,
417417
InvalidateAfterSecs: preset.InvalidateAfterSecs,
418418
SchedulingTimezone: preset.SchedulingTimezone,
419+
IsDefault: false,
419420
})
420421
}
421422

coderd/database/dbgen/dbgen.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,6 +1303,7 @@ func Preset(t testing.TB, db database.Store, seed database.InsertPresetParams) d
13031303
DesiredInstances: seed.DesiredInstances,
13041304
InvalidateAfterSecs: seed.InvalidateAfterSecs,
13051305
SchedulingTimezone: seed.SchedulingTimezone,
1306+
IsDefault: seed.IsDefault,
13061307
})
13071308
require.NoError(t, err, "insert preset")
13081309
return preset

coderd/database/dbmem/dbmem.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9198,6 +9198,7 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP
91989198
Valid: true,
91999199
},
92009200
PrebuildStatus: database.PrebuildStatusHealthy,
9201+
IsDefault: arg.IsDefault,
92019202
}
92029203
q.presets = append(q.presets, preset)
92039204
return preset, nil

coderd/database/dump.sql

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
DROP INDEX IF EXISTS idx_template_version_presets_default;
2+
ALTER TABLE template_version_presets DROP COLUMN IF EXISTS is_default;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
ALTER TABLE template_version_presets ADD COLUMN is_default BOOLEAN NOT NULL DEFAULT FALSE;
2+
3+
-- Add a unique constraint to ensure only one default preset per template version
4+
CREATE UNIQUE INDEX idx_template_version_presets_default
5+
ON template_version_presets (template_version_id)
6+
WHERE is_default = TRUE;

coderd/database/models.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 15 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/presets.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ INSERT INTO template_version_presets (
66
created_at,
77
desired_instances,
88
invalidate_after_secs,
9-
scheduling_timezone
9+
scheduling_timezone,
10+
is_default
1011
)
1112
VALUES (
1213
@id,
@@ -15,7 +16,8 @@ VALUES (
1516
@created_at,
1617
@desired_instances,
1718
@invalidate_after_secs,
18-
@scheduling_timezone
19+
@scheduling_timezone,
20+
@is_default
1921
) RETURNING *;
2022

2123
-- name: InsertPresetParameters :many

coderd/database/unique_constraint.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/presets.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request)
4141
var res []codersdk.Preset
4242
for _, preset := range presets {
4343
sdkPreset := codersdk.Preset{
44-
ID: preset.ID,
45-
Name: preset.Name,
44+
ID: preset.ID,
45+
Name: preset.Name,
46+
Default: preset.IsDefault,
4647
}
4748
for _, presetParam := range presetParams {
4849
if presetParam.TemplateVersionPresetID != preset.ID {

coderd/presets_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package coderd_test
22

33
import (
4+
"slices"
45
"testing"
56

7+
"github.com/stretchr/testify/assert"
68
"github.com/stretchr/testify/require"
79

810
"github.com/coder/coder/v2/coderd/coderdtest"
@@ -137,3 +139,93 @@ func TestTemplateVersionPresets(t *testing.T) {
137139
})
138140
}
139141
}
142+
143+
func TestTemplateVersionPresetsDefault(t *testing.T) {
144+
t.Parallel()
145+
146+
type expectedPreset struct {
147+
name string
148+
isDefault bool
149+
}
150+
151+
cases := []struct {
152+
name string
153+
presets []database.InsertPresetParams
154+
expected []expectedPreset
155+
}{
156+
{
157+
name: "no presets",
158+
presets: nil,
159+
expected: nil,
160+
},
161+
{
162+
name: "single default preset",
163+
presets: []database.InsertPresetParams{
164+
{Name: "Default Preset", IsDefault: true},
165+
},
166+
expected: []expectedPreset{
167+
{name: "Default Preset", isDefault: true},
168+
},
169+
},
170+
{
171+
name: "single non-default preset",
172+
presets: []database.InsertPresetParams{
173+
{Name: "Regular Preset", IsDefault: false},
174+
},
175+
expected: []expectedPreset{
176+
{name: "Regular Preset", isDefault: false},
177+
},
178+
},
179+
{
180+
name: "mixed presets",
181+
presets: []database.InsertPresetParams{
182+
{Name: "Default Preset", IsDefault: true},
183+
{Name: "Regular Preset", IsDefault: false},
184+
},
185+
expected: []expectedPreset{
186+
{name: "Default Preset", isDefault: true},
187+
{name: "Regular Preset", isDefault: false},
188+
},
189+
},
190+
}
191+
192+
for _, tc := range cases {
193+
tc := tc
194+
t.Run(tc.name, func(t *testing.T) {
195+
t.Parallel()
196+
ctx := testutil.Context(t, testutil.WaitShort)
197+
198+
client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
199+
user := coderdtest.CreateFirstUser(t, client)
200+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
201+
202+
// Create presets
203+
for _, preset := range tc.presets {
204+
preset.TemplateVersionID = version.ID
205+
_ = dbgen.Preset(t, db, preset)
206+
}
207+
208+
// Get presets via API
209+
userSubject, _, err := httpmw.UserRBACSubject(ctx, db, user.UserID, rbac.ScopeAll)
210+
require.NoError(t, err)
211+
userCtx := dbauthz.As(ctx, userSubject)
212+
213+
gotPresets, err := client.TemplateVersionPresets(userCtx, version.ID)
214+
require.NoError(t, err)
215+
216+
// Verify results
217+
require.Len(t, gotPresets, len(tc.expected))
218+
219+
for _, expected := range tc.expected {
220+
found := slices.ContainsFunc(gotPresets, func(preset codersdk.Preset) bool {
221+
if preset.Name != expected.name {
222+
return false
223+
}
224+
225+
return assert.Equal(t, expected.isDefault, preset.Default)
226+
})
227+
require.True(t, found, "Expected preset %s not found", expected.name)
228+
}
229+
})
230+
}
231+
}

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2230,6 +2230,7 @@ func InsertWorkspacePresetAndParameters(ctx context.Context, db database.Store,
22302230
DesiredInstances: desiredInstances,
22312231
InvalidateAfterSecs: ttl,
22322232
SchedulingTimezone: schedulingTimezone,
2233+
IsDefault: protoPreset.GetDefault(),
22332234
})
22342235
if err != nil {
22352236
return xerrors.Errorf("insert preset: %w", err)

codersdk/presets.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type Preset struct {
1414
ID uuid.UUID
1515
Name string
1616
Parameters []PresetParameter
17+
Default bool
1718
}
1819

1920
type PresetParameter struct {

docs/reference/api/schemas.md

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)