diff --git a/Makefile b/Makefile index b69e164317..29f8461f48 100644 --- a/Makefile +++ b/Makefile @@ -809,7 +809,7 @@ provisioner/terraform/testdata/version: .PHONY: provisioner/terraform/testdata/version test: - $(GIT_FLAGS) gotestsum --format standard-quiet -- -v -short -count=1 ./... + $(GIT_FLAGS) gotestsum --format standard-quiet -- -v -short -count=1 ./... $(if $(RUN),-run $(RUN)) .PHONY: test test-cli: diff --git a/coderd/coderd.go b/coderd/coderd.go index 3c5363181d..95d9e44ecb 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -1059,7 +1059,6 @@ func New(options *Options) *API { r.Get("/variables", api.templateVersionVariables) r.Route("/presets", func(r chi.Router) { r.Get("/", api.templateVersionPresets) - r.Get("/parameters", api.templateVersionPresetParameters) }) r.Get("/resources", api.templateVersionResources) r.Get("/logs", api.templateVersionLogs) diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index f7c438f4a5..6472d22548 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -3823,7 +3823,6 @@ func (s *MethodTestSuite) TestSystemFunctions() { }) require.NoError(s.T(), err) _, err = db.InsertPresetParameters(ctx, database.InsertPresetParametersParams{ - ID: uuid.New(), TemplateVersionPresetID: preset.ID, Names: []string{"test"}, Values: []string{"test"}, diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 7bd2052a22..39efb1ebb1 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1266,7 +1266,7 @@ COMMENT ON COLUMN template_version_parameters.display_order IS 'Specifies the or COMMENT ON COLUMN template_version_parameters.ephemeral IS 'The value of an ephemeral parameter will not be preserved between consecutive workspace builds.'; CREATE TABLE template_version_preset_parameters ( - id uuid NOT NULL, + id uuid DEFAULT gen_random_uuid() NOT NULL, template_version_preset_id uuid NOT NULL, name text NOT NULL, value text NOT NULL diff --git a/coderd/database/migrations/000292_generate_default_preset_parameter_ids.down.sql b/coderd/database/migrations/000292_generate_default_preset_parameter_ids.down.sql new file mode 100644 index 0000000000..02c4a2401d --- /dev/null +++ b/coderd/database/migrations/000292_generate_default_preset_parameter_ids.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE template_version_preset_parameters +ALTER COLUMN id DROP DEFAULT; diff --git a/coderd/database/migrations/000292_generate_default_preset_parameter_ids.up.sql b/coderd/database/migrations/000292_generate_default_preset_parameter_ids.up.sql new file mode 100644 index 0000000000..a0abfceb19 --- /dev/null +++ b/coderd/database/migrations/000292_generate_default_preset_parameter_ids.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE template_version_preset_parameters +ALTER COLUMN id SET DEFAULT gen_random_uuid(); diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 60f05064b7..9d08dd2899 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -5525,29 +5525,22 @@ func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) ( const insertPresetParameters = `-- name: InsertPresetParameters :many INSERT INTO - template_version_preset_parameters (id, template_version_preset_id, name, value) + template_version_preset_parameters (template_version_preset_id, name, value) SELECT $1, - $2, - unnest($3 :: TEXT[]), - unnest($4 :: TEXT[]) + unnest($2 :: TEXT[]), + unnest($3 :: TEXT[]) RETURNING id, template_version_preset_id, name, value ` type InsertPresetParametersParams struct { - ID uuid.UUID `db:"id" json:"id"` TemplateVersionPresetID uuid.UUID `db:"template_version_preset_id" json:"template_version_preset_id"` Names []string `db:"names" json:"names"` Values []string `db:"values" json:"values"` } func (q *sqlQuerier) InsertPresetParameters(ctx context.Context, arg InsertPresetParametersParams) ([]TemplateVersionPresetParameter, error) { - rows, err := q.db.QueryContext(ctx, insertPresetParameters, - arg.ID, - arg.TemplateVersionPresetID, - pq.Array(arg.Names), - pq.Array(arg.Values), - ) + rows, err := q.db.QueryContext(ctx, insertPresetParameters, arg.TemplateVersionPresetID, pq.Array(arg.Names), pq.Array(arg.Values)) if err != nil { return nil, err } diff --git a/coderd/database/queries/presets.sql b/coderd/database/queries/presets.sql index 6bfe31dc09..988722929a 100644 --- a/coderd/database/queries/presets.sql +++ b/coderd/database/queries/presets.sql @@ -6,9 +6,8 @@ VALUES -- name: InsertPresetParameters :many INSERT INTO - template_version_preset_parameters (id, template_version_preset_id, name, value) + template_version_preset_parameters (template_version_preset_id, name, value) SELECT - @id, @template_version_preset_id, unnest(@names :: TEXT[]), unnest(@values :: TEXT[]) diff --git a/coderd/presets.go b/coderd/presets.go index 742d60f2cf..d1e4469772 100644 --- a/coderd/presets.go +++ b/coderd/presets.go @@ -29,29 +29,6 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request) return } - var res []codersdk.Preset - for _, preset := range presets { - res = append(res, codersdk.Preset{ - ID: preset.ID, - Name: preset.Name, - }) - } - - httpapi.Write(ctx, rw, http.StatusOK, res) -} - -// @Summary Get template version preset parameters -// @ID get-template-version-preset-parameters -// @Security CoderSessionToken -// @Produce json -// @Tags Templates -// @Param templateversion path string true "Template version ID" format(uuid) -// @Success 200 {array} codersdk.PresetParameter -// @Router /templateversions/{templateversion}/presets/parameters [get] -func (api *API) templateVersionPresetParameters(rw http.ResponseWriter, r *http.Request) { - ctx := r.Context() - templateVersion := httpmw.TemplateVersionParam(r) - // TODO (sasswart): Test case: what if a user tries to read presets or preset parameters from a different org? // TODO (sasswart): Do a prelim auth check here. @@ -64,13 +41,21 @@ func (api *API) templateVersionPresetParameters(rw http.ResponseWriter, r *http. return } - var res []codersdk.PresetParameter - for _, presetParam := range presetParams { - res = append(res, codersdk.PresetParameter{ - PresetID: presetParam.TemplateVersionPresetID, - Name: presetParam.Name, - Value: presetParam.Value, - }) + var res []codersdk.Preset + for _, preset := range presets { + sdkPreset := codersdk.Preset{ + ID: preset.ID, + Name: preset.Name, + } + for _, presetParam := range presetParams { + if presetParam.TemplateVersionPresetID == preset.ID { + sdkPreset.Parameters = append(sdkPreset.Parameters, codersdk.PresetParameter{ + Name: presetParam.Name, + Value: presetParam.Value, + }) + } + } + res = append(res, sdkPreset) } httpapi.Write(ctx, rw, http.StatusOK, res) diff --git a/coderd/presets_test.go b/coderd/presets_test.go index 1b59c3a70e..beee4aceea 100644 --- a/coderd/presets_test.go +++ b/coderd/presets_test.go @@ -1,7 +1,6 @@ package coderd_test import ( - "context" "testing" "github.com/google/uuid" @@ -12,12 +11,28 @@ import ( "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/httpmw" "github.com/coder/coder/v2/coderd/rbac" + "github.com/coder/coder/v2/codersdk" + "github.com/coder/coder/v2/testutil" ) func TestTemplateVersionPresets(t *testing.T) { t.Parallel() - ctx := context.Background() + sdkPreset := codersdk.Preset{ + ID: uuid.New(), + Name: "My Preset", + Parameters: []codersdk.PresetParameter{ + { + Name: "preset_param1", + Value: "A1B2C3", + }, + { + Name: "preset_param2", + Value: "D4E5F6", + }, + }, + } + ctx := testutil.Context(t, testutil.WaitShort) client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) user := coderdtest.CreateFirstUser(t, client) @@ -27,16 +42,22 @@ func TestTemplateVersionPresets(t *testing.T) { provisionerCtx := dbauthz.AsProvisionerd(ctx) preset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{ - ID: uuid.New(), - Name: "My Preset", + ID: sdkPreset.ID, + Name: sdkPreset.Name, TemplateVersionID: version.ID, }) require.NoError(t, err) + + var presetParameterNames []string + var presetParameterValues []string + for _, presetParameter := range sdkPreset.Parameters { + presetParameterNames = append(presetParameterNames, presetParameter.Name) + presetParameterValues = append(presetParameterValues, presetParameter.Value) + } _, err = db.InsertPresetParameters(provisionerCtx, database.InsertPresetParametersParams{ - ID: uuid.New(), TemplateVersionPresetID: preset.ID, - Names: []string{"preset_param1", "preset_param2"}, - Values: []string{"A1B2C3", "D4E5F6"}, + Names: presetParameterNames, + Values: presetParameterValues, }) require.NoError(t, err) @@ -46,14 +67,12 @@ func TestTemplateVersionPresets(t *testing.T) { presets, err := client.TemplateVersionPresets(userCtx, version.ID) require.NoError(t, err) - require.Equal(t, 1, len(presets)) - require.Equal(t, "My Preset", presets[0].Name) - presetParams, err := client.TemplateVersionPresetParameters(userCtx, version.ID) - require.NoError(t, err) - require.Equal(t, 2, len(presetParams)) - require.Equal(t, "preset_param1", presetParams[0].Name) - require.Equal(t, "A1B2C3", presetParams[0].Value) - require.Equal(t, "preset_param2", presetParams[1].Name) - require.Equal(t, "D4E5F6", presetParams[1].Value) + require.Equal(t, 1, len(presets)) + require.Equal(t, sdkPreset.ID, presets[0].ID) + require.Equal(t, sdkPreset.Name, presets[0].Name) + + for _, presetParameter := range sdkPreset.Parameters { + require.Contains(t, presets[0].Parameters, presetParameter) + } } diff --git a/codersdk/presets.go b/codersdk/presets.go index cd724a979a..78b186c435 100644 --- a/codersdk/presets.go +++ b/codersdk/presets.go @@ -11,8 +11,9 @@ import ( ) type Preset struct { - ID uuid.UUID - Name string + ID uuid.UUID + Name string + Parameters []PresetParameter } type PresetParameter struct { @@ -34,17 +35,3 @@ func (c *Client) TemplateVersionPresets(ctx context.Context, templateVersionID u var presets []Preset return presets, json.NewDecoder(res.Body).Decode(&presets) } - -// TemplateVersionPresetParameters returns the parameters associated with the given presets. -func (c *Client) TemplateVersionPresetParameters(ctx context.Context, templateVersionID uuid.UUID) ([]PresetParameter, error) { - res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/templateversions/%s/presets/parameters", templateVersionID), nil) - if err != nil { - return nil, xerrors.Errorf("do request: %w", err) - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return nil, ReadBodyAsError(res) - } - var parameters []PresetParameter - return parameters, json.NewDecoder(res.Body).Decode(¶meters) -} diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 9595f22d89..99310a611b 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -1554,6 +1554,7 @@ export interface PprofConfig { export interface Preset { readonly ID: string; readonly Name: string; + readonly Parameters: readonly PresetParameter[]; } // From codersdk/presets.go