Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e9a218c

Browse files
committed
feat: full implementation
Signed-off-by: Danny Kopping <[email protected]>
1 parent 0fb3743 commit e9a218c

File tree

15 files changed

+153
-14
lines changed

15 files changed

+153
-14
lines changed

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/dbmem/dbmem.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9135,6 +9135,7 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP
91359135
Valid: true,
91369136
},
91379137
PrebuildStatus: database.PrebuildStatusHealthy,
9138+
IsDefault: arg.IsDefault,
91389139
}
91399140
q.presets = append(q.presets, preset)
91409141
return preset, nil

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

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.

docs/reference/api/templates.md

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

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ replace github.com/aquasecurity/trivy => github.com/coder/trivy v0.0.0-202505271
7272
// https://github.com/spf13/afero/pull/487
7373
replace github.com/spf13/afero => github.com/aslilac/afero v0.0.0-20250403163713-f06e86036696
7474

75+
// TODO: replace once we cut release.
76+
replace github.com/coder/terraform-provider-coder/v2 => github.com/coder/terraform-provider-coder/v2 v2.5.4-0.20250618121935-71097ea9c886
77+
7578
require (
7679
cdr.dev/slog v1.6.2-0.20241112041820-0ec81e6e67bb
7780
cloud.google.com/go/compute/metadata v0.7.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -928,8 +928,8 @@ github.com/coder/tailscale v1.1.1-0.20250611020837-f14d20d23d8c h1:d/qBIi3Ez7Kko
928928
github.com/coder/tailscale v1.1.1-0.20250611020837-f14d20d23d8c/go.mod h1:l7ml5uu7lFh5hY28lGYM4b/oFSmuPHYX6uk4RAu23Lc=
929929
github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e h1:JNLPDi2P73laR1oAclY6jWzAbucf70ASAvf5mh2cME0=
930930
github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e/go.mod h1:Gz/z9Hbn+4KSp8A2FBtNszfLSdT2Tn/uAKGuVqqWmDI=
931-
github.com/coder/terraform-provider-coder/v2 v2.5.3 h1:EwqIIQKe/j8bsR4WyDJ3bD0dVdkfVqJ43TwClyGneUU=
932-
github.com/coder/terraform-provider-coder/v2 v2.5.3/go.mod h1:kqP2MW/OF5u3QBRPDt84vn1izKjncICFfv26nSb781I=
931+
github.com/coder/terraform-provider-coder/v2 v2.5.4-0.20250618121935-71097ea9c886 h1:Oo9rlMzBaI+dCr/LQhTQF0H4IJes24tGb+7XRN2aiD4=
932+
github.com/coder/terraform-provider-coder/v2 v2.5.4-0.20250618121935-71097ea9c886/go.mod h1:WrdLSbihuzH1RZhwrU+qmkqEhUbdZT/sjHHdarm5b5g=
933933
github.com/coder/trivy v0.0.0-20250527170238-9416a59d7019 h1:MHkv/W7l9eRAN9gOG0qZ1TLRGWIIfNi92273vPAQ8Fs=
934934
github.com/coder/trivy v0.0.0-20250527170238-9416a59d7019/go.mod h1:eqk+w9RLBmbd/cB5XfPZFuVn77cf/A6fB7qmEVeSmXk=
935935
github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE=

site/e2e/provisionerGenerated.ts

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

site/src/api/typesGenerated.ts

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

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ export const PresetsButNoneSelected: Story = {
125125
{
126126
ID: "preset-1",
127127
Name: "Preset 1",
128+
Default: false,
128129
Parameters: [
129130
{
130131
Name: MockTemplateVersionParameter1.name,
@@ -135,6 +136,7 @@ export const PresetsButNoneSelected: Story = {
135136
{
136137
ID: "preset-2",
137138
Name: "Preset 2",
139+
Default: true,
138140
Parameters: [
139141
{
140142
Name: MockTemplateVersionParameter2.name,

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,24 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
156156
setPresetOptions([
157157
{ label: "None", value: "" },
158158
...presets.map((preset) => ({
159-
label: preset.Name,
159+
label: preset.Default ? `${preset.Name} (Default)` : preset.Name,
160160
value: preset.ID,
161161
})),
162162
]);
163163
}, [presets]);
164164

165165
const [selectedPresetIndex, setSelectedPresetIndex] = useState(0);
166+
167+
// Set default preset when presets are loaded
168+
useEffect(() => {
169+
const defaultPreset = presets.find((preset) => preset.Default);
170+
if (defaultPreset) {
171+
// +1 because "None" is at index 0
172+
const defaultIndex =
173+
presets.findIndex((preset) => preset.ID === defaultPreset.ID) + 1;
174+
setSelectedPresetIndex(defaultIndex);
175+
}
176+
}, [presets]);
166177
const [presetParameterNames, setPresetParameterNames] = useState<string[]>(
167178
[],
168179
);

site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,25 @@ export const CreateWorkspacePageViewExperimental: FC<
190190
setPresetOptions([
191191
{ label: "None", value: "None" },
192192
...presets.map((preset) => ({
193-
label: preset.Name,
193+
label: preset.Default ? `${preset.Name} (Default)` : preset.Name,
194194
value: preset.ID,
195195
})),
196196
]);
197197
}, [presets]);
198198

199199
const [selectedPresetIndex, setSelectedPresetIndex] = useState(0);
200+
201+
// Set default preset when presets are loaded
202+
useEffect(() => {
203+
const defaultPreset = presets.find((preset) => preset.Default);
204+
if (defaultPreset) {
205+
// +1 because "None" is at index 0
206+
const defaultIndex =
207+
presets.findIndex((preset) => preset.ID === defaultPreset.ID) + 1;
208+
setSelectedPresetIndex(defaultIndex);
209+
}
210+
}, [presets]);
211+
200212
const [presetParameterNames, setPresetParameterNames] = useState<string[]>(
201213
[],
202214
);
@@ -555,6 +567,7 @@ export const CreateWorkspacePageViewExperimental: FC<
555567
<div className="flex flex-col gap-4">
556568
<div className="max-w-lg">
557569
<Select
570+
value={presetOptions[selectedPresetIndex]?.value}
558571
onValueChange={(option) => {
559572
const index = presetOptions.findIndex(
560573
(preset) => preset.value === option,

0 commit comments

Comments
 (0)