Skip to content

Commit dcf47ab

Browse files
committed
feat(coderd): add support for presets to the coder API
1 parent 34b46f9 commit dcf47ab

File tree

10 files changed

+544
-17
lines changed

10 files changed

+544
-17
lines changed

coderd/apidoc/docs.go

Lines changed: 101 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: 93 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,10 @@ func New(options *Options) *API {
10571057
r.Get("/rich-parameters", api.templateVersionRichParameters)
10581058
r.Get("/external-auth", api.templateVersionExternalAuth)
10591059
r.Get("/variables", api.templateVersionVariables)
1060+
r.Route("/presets", func(r chi.Router) {
1061+
r.Get("/", api.templateVersionPresets)
1062+
r.Get("/parameters", api.templateVersionPresetParameters)
1063+
})
10601064
r.Get("/resources", api.templateVersionResources)
10611065
r.Get("/logs", api.templateVersionLogs)
10621066
r.Route("/dry-run", func(r chi.Router) {

coderd/presets.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package coderd
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/coder/coder/v2/coderd/httpapi"
7+
"github.com/coder/coder/v2/coderd/httpmw"
8+
"github.com/coder/coder/v2/codersdk"
9+
)
10+
11+
// @Summary Get template version presets
12+
// @ID get-template-version-presets
13+
// @Security CoderSessionToken
14+
// @Produce json
15+
// @Tags Templates
16+
// @Param templateversion path string true "Template version ID" format(uuid)
17+
// @Success 200 {array} codersdk.Preset
18+
// @Router /templateversions/{templateversion}/presets [get]
19+
func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request) {
20+
ctx := r.Context()
21+
templateVersion := httpmw.TemplateVersionParam(r)
22+
23+
presets, err := api.Database.GetPresetsByTemplateVersionID(ctx, templateVersion.ID)
24+
if err != nil {
25+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
26+
Message: "Internal error fetching template version presets.",
27+
Detail: err.Error(),
28+
})
29+
return
30+
}
31+
32+
var res []codersdk.Preset
33+
for _, preset := range presets {
34+
res = append(res, codersdk.Preset{
35+
ID: preset.ID,
36+
Name: preset.Name,
37+
})
38+
}
39+
40+
httpapi.Write(ctx, rw, http.StatusOK, res)
41+
}
42+
43+
// @Summary Get template version preset parameters
44+
// @ID get-template-version-preset-parameters
45+
// @Security CoderSessionToken
46+
// @Produce json
47+
// @Tags Templates
48+
// @Param templateversion path string true "Template version ID" format(uuid)
49+
// @Success 200 {array} codersdk.PresetParameter
50+
// @Router /templateversions/{templateversion}/presets/parameters [get]
51+
func (api *API) templateVersionPresetParameters(rw http.ResponseWriter, r *http.Request) {
52+
ctx := r.Context()
53+
templateVersion := httpmw.TemplateVersionParam(r)
54+
55+
// TODO (sasswart): Test case: what if a user tries to read presets or preset parameters from a different org?
56+
// TODO (sasswart): Do a prelim auth check here.
57+
58+
presetParams, err := api.Database.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID)
59+
if err != nil {
60+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
61+
Message: "Internal error fetching template version presets.",
62+
Detail: err.Error(),
63+
})
64+
return
65+
}
66+
67+
var res []codersdk.PresetParameter
68+
for _, presetParam := range presetParams {
69+
res = append(res, codersdk.PresetParameter{
70+
PresetID: presetParam.TemplateVersionPresetID,
71+
Name: presetParam.Name,
72+
Value: presetParam.Value,
73+
})
74+
}
75+
76+
httpapi.Write(ctx, rw, http.StatusOK, res)
77+
}

coderd/presets_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package coderd_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/coder/coder/v2/coderd/coderdtest"
10+
"github.com/coder/coder/v2/coderd/database"
11+
"github.com/coder/coder/v2/coderd/database/dbauthz"
12+
"github.com/coder/coder/v2/coderd/httpmw"
13+
"github.com/coder/coder/v2/coderd/rbac"
14+
)
15+
16+
func TestTemplateVersionPresets(t *testing.T) {
17+
t.Parallel()
18+
19+
ctx := context.Background()
20+
21+
client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
22+
user := coderdtest.CreateFirstUser(t, client)
23+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
24+
25+
// nolint:gocritic // This is a test
26+
provisionerCtx := dbauthz.AsProvisionerd(ctx)
27+
28+
preset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{
29+
Name: "My Preset",
30+
TemplateVersionID: version.ID,
31+
})
32+
require.NoError(t, err)
33+
_, err = db.InsertPresetParameters(provisionerCtx, database.InsertPresetParametersParams{
34+
TemplateVersionPresetID: preset.ID,
35+
Names: []string{"preset_param1", "preset_param2"},
36+
Values: []string{"A1B2C3", "D4E5F6"},
37+
})
38+
require.NoError(t, err)
39+
40+
userSubject, _, err := httpmw.UserRBACSubject(ctx, db, user.UserID, rbac.ScopeAll)
41+
require.NoError(t, err)
42+
userCtx := dbauthz.As(ctx, userSubject)
43+
44+
presets, err := client.TemplateVersionPresets(userCtx, version.ID)
45+
require.NoError(t, err)
46+
require.Equal(t, 1, len(presets))
47+
require.Equal(t, "My Preset", presets[0].Name)
48+
49+
presetParams, err := client.TemplateVersionPresetParameters(userCtx, version.ID)
50+
require.NoError(t, err)
51+
require.Equal(t, 2, len(presetParams))
52+
require.Equal(t, "preset_param1", presetParams[0].Name)
53+
require.Equal(t, "A1B2C3", presetParams[0].Value)
54+
require.Equal(t, "preset_param2", presetParams[1].Name)
55+
require.Equal(t, "D4E5F6", presetParams[1].Value)
56+
}

0 commit comments

Comments
 (0)