From dcf47ab30d3a38b274d461f3e8f73e4961eed35d Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Tue, 11 Feb 2025 14:23:14 +0000 Subject: [PATCH 01/11] feat(coderd): add support for presets to the coder API --- coderd/apidoc/docs.go | 101 +++++++++++++++++++++++++++++++ coderd/apidoc/swagger.json | 93 +++++++++++++++++++++++++++++ coderd/coderd.go | 4 ++ coderd/presets.go | 77 ++++++++++++++++++++++++ coderd/presets_test.go | 56 ++++++++++++++++++ coderd/wsbuilder/wsbuilder.go | 31 +++++----- codersdk/presets.go | 50 ++++++++++++++++ docs/reference/api/schemas.md | 34 +++++++++++ docs/reference/api/templates.md | 102 ++++++++++++++++++++++++++++++++ site/src/api/typesGenerated.ts | 13 ++++ 10 files changed, 544 insertions(+), 17 deletions(-) create mode 100644 coderd/presets.go create mode 100644 coderd/presets_test.go create mode 100644 codersdk/presets.go diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 5e4fcb001cc36..3423b696fc743 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -5605,6 +5605,82 @@ const docTemplate = `{ } } }, + "/templateversions/{templateversion}/presets": { + "get": { + "security": [ + { + "CoderSessionToken": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Templates" + ], + "summary": "Get template version presets", + "operationId": "get-template-version-presets", + "parameters": [ + { + "type": "string", + "format": "uuid", + "description": "Template version ID", + "name": "templateversion", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.Preset" + } + } + } + } + } + }, + "/templateversions/{templateversion}/presets/parameters": { + "get": { + "security": [ + { + "CoderSessionToken": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "Templates" + ], + "summary": "Get template version preset parameters", + "operationId": "get-template-version-preset-parameters", + "parameters": [ + { + "type": "string", + "format": "uuid", + "description": "Template version ID", + "name": "templateversion", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.PresetParameter" + } + } + } + } + } + }, "/templateversions/{templateversion}/resources": { "get": { "security": [ @@ -12967,6 +13043,31 @@ const docTemplate = `{ } } }, + "codersdk.Preset": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "codersdk.PresetParameter": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "presetID": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, "codersdk.PrometheusConfig": { "type": "object", "properties": { diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 29658d0a5e7b9..d5a836dcb31c7 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -4951,6 +4951,74 @@ } } }, + "/templateversions/{templateversion}/presets": { + "get": { + "security": [ + { + "CoderSessionToken": [] + } + ], + "produces": ["application/json"], + "tags": ["Templates"], + "summary": "Get template version presets", + "operationId": "get-template-version-presets", + "parameters": [ + { + "type": "string", + "format": "uuid", + "description": "Template version ID", + "name": "templateversion", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.Preset" + } + } + } + } + } + }, + "/templateversions/{templateversion}/presets/parameters": { + "get": { + "security": [ + { + "CoderSessionToken": [] + } + ], + "produces": ["application/json"], + "tags": ["Templates"], + "summary": "Get template version preset parameters", + "operationId": "get-template-version-preset-parameters", + "parameters": [ + { + "type": "string", + "format": "uuid", + "description": "Template version ID", + "name": "templateversion", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.PresetParameter" + } + } + } + } + } + }, "/templateversions/{templateversion}/resources": { "get": { "security": [ @@ -11700,6 +11768,31 @@ } } }, + "codersdk.Preset": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "codersdk.PresetParameter": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "presetID": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, "codersdk.PrometheusConfig": { "type": "object", "properties": { diff --git a/coderd/coderd.go b/coderd/coderd.go index 4603f78acc0d9..3c5363181df1b 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -1057,6 +1057,10 @@ func New(options *Options) *API { r.Get("/rich-parameters", api.templateVersionRichParameters) r.Get("/external-auth", api.templateVersionExternalAuth) 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) r.Route("/dry-run", func(r chi.Router) { diff --git a/coderd/presets.go b/coderd/presets.go new file mode 100644 index 0000000000000..742d60f2cfeeb --- /dev/null +++ b/coderd/presets.go @@ -0,0 +1,77 @@ +package coderd + +import ( + "net/http" + + "github.com/coder/coder/v2/coderd/httpapi" + "github.com/coder/coder/v2/coderd/httpmw" + "github.com/coder/coder/v2/codersdk" +) + +// @Summary Get template version presets +// @ID get-template-version-presets +// @Security CoderSessionToken +// @Produce json +// @Tags Templates +// @Param templateversion path string true "Template version ID" format(uuid) +// @Success 200 {array} codersdk.Preset +// @Router /templateversions/{templateversion}/presets [get] +func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request) { + ctx := r.Context() + templateVersion := httpmw.TemplateVersionParam(r) + + presets, err := api.Database.GetPresetsByTemplateVersionID(ctx, templateVersion.ID) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching template version presets.", + Detail: err.Error(), + }) + 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. + + presetParams, err := api.Database.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching template version presets.", + Detail: err.Error(), + }) + return + } + + var res []codersdk.PresetParameter + for _, presetParam := range presetParams { + res = append(res, codersdk.PresetParameter{ + PresetID: presetParam.TemplateVersionPresetID, + Name: presetParam.Name, + Value: presetParam.Value, + }) + } + + httpapi.Write(ctx, rw, http.StatusOK, res) +} diff --git a/coderd/presets_test.go b/coderd/presets_test.go new file mode 100644 index 0000000000000..a14d8dd50d395 --- /dev/null +++ b/coderd/presets_test.go @@ -0,0 +1,56 @@ +package coderd_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/coder/coder/v2/coderd/coderdtest" + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbauthz" + "github.com/coder/coder/v2/coderd/httpmw" + "github.com/coder/coder/v2/coderd/rbac" +) + +func TestTemplateVersionPresets(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + + // nolint:gocritic // This is a test + provisionerCtx := dbauthz.AsProvisionerd(ctx) + + preset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{ + Name: "My Preset", + TemplateVersionID: version.ID, + }) + require.NoError(t, err) + _, err = db.InsertPresetParameters(provisionerCtx, database.InsertPresetParametersParams{ + TemplateVersionPresetID: preset.ID, + Names: []string{"preset_param1", "preset_param2"}, + Values: []string{"A1B2C3", "D4E5F6"}, + }) + require.NoError(t, err) + + userSubject, _, err := httpmw.UserRBACSubject(ctx, db, user.UserID, rbac.ScopeAll) + require.NoError(t, err) + userCtx := dbauthz.As(ctx, userSubject) + + 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) +} diff --git a/coderd/wsbuilder/wsbuilder.go b/coderd/wsbuilder/wsbuilder.go index 183fdf2d447cc..a31e5eff4686a 100644 --- a/coderd/wsbuilder/wsbuilder.go +++ b/coderd/wsbuilder/wsbuilder.go @@ -363,23 +363,20 @@ func (b *Builder) buildTx(authFunc func(action policy.Action, object rbac.Object var workspaceBuild database.WorkspaceBuild err = b.store.InTx(func(store database.Store) error { err = store.InsertWorkspaceBuild(b.ctx, database.InsertWorkspaceBuildParams{ - ID: workspaceBuildID, - CreatedAt: now, - UpdatedAt: now, - WorkspaceID: b.workspace.ID, - TemplateVersionID: templateVersionID, - BuildNumber: buildNum, - ProvisionerState: state, - InitiatorID: b.initiator, - Transition: b.trans, - JobID: provisionerJob.ID, - Reason: b.reason, - Deadline: time.Time{}, // set by provisioner upon completion - MaxDeadline: time.Time{}, // set by provisioner upon completion - TemplateVersionPresetID: uuid.NullUUID{ - UUID: uuid.Nil, - Valid: false, - }, + ID: workspaceBuildID, + CreatedAt: now, + UpdatedAt: now, + WorkspaceID: b.workspace.ID, + TemplateVersionID: templateVersionID, + BuildNumber: buildNum, + ProvisionerState: state, + InitiatorID: b.initiator, + Transition: b.trans, + JobID: provisionerJob.ID, + Reason: b.reason, + Deadline: time.Time{}, // set by provisioner upon completion + MaxDeadline: time.Time{}, // set by provisioner upon completion + TemplateVersionPresetID: uuid.NullUUID{}, // TODO (sasswart): add this in from the caller }) if err != nil { code := http.StatusInternalServerError diff --git a/codersdk/presets.go b/codersdk/presets.go new file mode 100644 index 0000000000000..cd724a979a74a --- /dev/null +++ b/codersdk/presets.go @@ -0,0 +1,50 @@ +package codersdk + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/google/uuid" + "golang.org/x/xerrors" +) + +type Preset struct { + ID uuid.UUID + Name string +} + +type PresetParameter struct { + PresetID uuid.UUID + Name string + Value string +} + +// TemplateVersionPresets returns the presets associated with a template version. +func (c *Client) TemplateVersionPresets(ctx context.Context, templateVersionID uuid.UUID) ([]Preset, error) { + res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/templateversions/%s/presets", 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 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/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index ebccd362c9c96..d5d471ad46d3d 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -4427,6 +4427,40 @@ Git clone makes use of this by parsing the URL from: 'Username for "https://gith | `address` | [serpent.HostPort](#serpenthostport) | false | | | | `enable` | boolean | false | | | +## codersdk.Preset + +```json +{ + "id": "string", + "name": "string" +} +``` + +### Properties + +| Name | Type | Required | Restrictions | Description | +|--------|--------|----------|--------------|-------------| +| `id` | string | false | | | +| `name` | string | false | | | + +## codersdk.PresetParameter + +```json +{ + "name": "string", + "presetID": "string", + "value": "string" +} +``` + +### Properties + +| Name | Type | Required | Restrictions | Description | +|------------|--------|----------|--------------|-------------| +| `name` | string | false | | | +| `presetID` | string | false | | | +| `value` | string | false | | | + ## codersdk.PrometheusConfig ```json diff --git a/docs/reference/api/templates.md b/docs/reference/api/templates.md index 9a2a35f40f182..57d35a6aab04a 100644 --- a/docs/reference/api/templates.md +++ b/docs/reference/api/templates.md @@ -2672,6 +2672,108 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/p To perform this operation, you must be authenticated. [Learn more](authentication.md). +## Get template version presets + +### Code samples + +```shell +# Example request using curl +curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/presets \ + -H 'Accept: application/json' \ + -H 'Coder-Session-Token: API_KEY' +``` + +`GET /templateversions/{templateversion}/presets` + +### Parameters + +| Name | In | Type | Required | Description | +|-------------------|------|--------------|----------|---------------------| +| `templateversion` | path | string(uuid) | true | Template version ID | + +### Example responses + +> 200 Response + +```json +[ + { + "id": "string", + "name": "string" + } +] +``` + +### Responses + +| Status | Meaning | Description | Schema | +|--------|---------------------------------------------------------|-------------|-------------------------------------------------------| +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | array of [codersdk.Preset](schemas.md#codersdkpreset) | + +

Response Schema

+ +Status Code **200** + +| Name | Type | Required | Restrictions | Description | +|----------------|--------|----------|--------------|-------------| +| `[array item]` | array | false | | | +| `» id` | string | false | | | +| `» name` | string | false | | | + +To perform this operation, you must be authenticated. [Learn more](authentication.md). + +## Get template version preset parameters + +### Code samples + +```shell +# Example request using curl +curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/presets/parameters \ + -H 'Accept: application/json' \ + -H 'Coder-Session-Token: API_KEY' +``` + +`GET /templateversions/{templateversion}/presets/parameters` + +### Parameters + +| Name | In | Type | Required | Description | +|-------------------|------|--------------|----------|---------------------| +| `templateversion` | path | string(uuid) | true | Template version ID | + +### Example responses + +> 200 Response + +```json +[ + { + "name": "string", + "presetID": "string", + "value": "string" + } +] +``` + +### Responses + +| Status | Meaning | Description | Schema | +|--------|---------------------------------------------------------|-------------|-------------------------------------------------------------------------| +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | array of [codersdk.PresetParameter](schemas.md#codersdkpresetparameter) | + +

Response Schema

+ +Status Code **200** + +| Name | Type | Required | Restrictions | Description | +|----------------|--------|----------|--------------|-------------| +| `[array item]` | array | false | | | +| `» name` | string | false | | | +| `» presetID` | string | false | | | +| `» value` | string | false | | | + +To perform this operation, you must be authenticated. [Learn more](authentication.md). + ## Get resources by template version ### Code samples diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 5ad807af38b6e..9595f22d8904c 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -1550,6 +1550,19 @@ export interface PprofConfig { readonly address: string; } +// From codersdk/presets.go +export interface Preset { + readonly ID: string; + readonly Name: string; +} + +// From codersdk/presets.go +export interface PresetParameter { + readonly PresetID: string; + readonly Name: string; + readonly Value: string; +} + // From codersdk/deployment.go export interface PrometheusConfig { readonly enable: boolean; From e4b5f0d2c350ec3ff0b6a266393c2128efbdea9c Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Tue, 11 Feb 2025 14:31:34 +0000 Subject: [PATCH 02/11] fix test --- coderd/presets_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coderd/presets_test.go b/coderd/presets_test.go index a14d8dd50d395..1b59c3a70e627 100644 --- a/coderd/presets_test.go +++ b/coderd/presets_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/google/uuid" "github.com/stretchr/testify/require" "github.com/coder/coder/v2/coderd/coderdtest" @@ -26,11 +27,13 @@ func TestTemplateVersionPresets(t *testing.T) { provisionerCtx := dbauthz.AsProvisionerd(ctx) preset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{ + ID: uuid.New(), Name: "My Preset", TemplateVersionID: version.ID, }) require.NoError(t, err) _, err = db.InsertPresetParameters(provisionerCtx, database.InsertPresetParametersParams{ + ID: uuid.New(), TemplateVersionPresetID: preset.ID, Names: []string{"preset_param1", "preset_param2"}, Values: []string{"A1B2C3", "D4E5F6"}, From 212e536679bb4faea3770e08e3a8d45ceda2f42b Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 07:41:24 +0000 Subject: [PATCH 03/11] consolidate preset API endpoints --- Makefile | 2 +- coderd/coderd.go | 1 - coderd/database/dbauthz/dbauthz_test.go | 1 - coderd/database/dump.sql | 2 +- ...rate_default_preset_parameter_ids.down.sql | 2 + ...nerate_default_preset_parameter_ids.up.sql | 2 + coderd/database/queries.sql.go | 15 ++---- coderd/database/queries/presets.sql | 3 +- coderd/presets.go | 45 ++++++----------- coderd/presets_test.go | 49 +++++++++++++------ codersdk/presets.go | 19 ++----- site/src/api/typesGenerated.ts | 1 + 12 files changed, 64 insertions(+), 78 deletions(-) create mode 100644 coderd/database/migrations/000292_generate_default_preset_parameter_ids.down.sql create mode 100644 coderd/database/migrations/000292_generate_default_preset_parameter_ids.up.sql diff --git a/Makefile b/Makefile index b69e164317f8d..29f8461f48783 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 3c5363181df1b..95d9e44ecb7c4 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 f7c438f4a55e9..6472d225488be 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 7bd2052a2276f..39efb1ebb11d3 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 0000000000000..02c4a2401de98 --- /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 0000000000000..a0abfceb19cc9 --- /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 60f05064b76ee..9d08dd2899738 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 6bfe31dc09ceb..988722929afb6 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 742d60f2cfeeb..d1e44697725cf 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 1b59c3a70e627..beee4aceea5c5 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) + require.Equal(t, sdkPreset.ID, presets[0].ID) + require.Equal(t, sdkPreset.Name, 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) + for _, presetParameter := range sdkPreset.Parameters { + require.Contains(t, presets[0].Parameters, presetParameter) + } } diff --git a/codersdk/presets.go b/codersdk/presets.go index cd724a979a74a..78b186c435f11 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 9595f22d8904c..99310a611b728 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 From 257988757b9f72afd4a5c716dcbc9b9ab0e193cf Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 07:54:01 +0000 Subject: [PATCH 04/11] remove todos --- coderd/presets.go | 3 --- coderd/presets_test.go | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/coderd/presets.go b/coderd/presets.go index d1e44697725cf..e4c6b30e9d67b 100644 --- a/coderd/presets.go +++ b/coderd/presets.go @@ -29,9 +29,6 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request) return } - // 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. - presetParams, err := api.Database.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID) if err != nil { httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ diff --git a/coderd/presets_test.go b/coderd/presets_test.go index beee4aceea5c5..f3430dfa62207 100644 --- a/coderd/presets_test.go +++ b/coderd/presets_test.go @@ -16,6 +16,8 @@ import ( ) func TestTemplateVersionPresets(t *testing.T) { + // TODO (sasswart): Test case: what if a user tries to read presets or preset parameters from a different org? + t.Parallel() sdkPreset := codersdk.Preset{ From 341c2b4a2bfee9e7059ea136ee06b769f8a8c4f1 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 08:03:34 +0000 Subject: [PATCH 05/11] simplify --- coderd/coderd.go | 4 +--- coderd/presets.go | 10 ++++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/coderd/coderd.go b/coderd/coderd.go index 95d9e44ecb7c4..d503ebb408f73 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -1057,9 +1057,7 @@ func New(options *Options) *API { r.Get("/rich-parameters", api.templateVersionRichParameters) r.Get("/external-auth", api.templateVersionExternalAuth) r.Get("/variables", api.templateVersionVariables) - r.Route("/presets", func(r chi.Router) { - r.Get("/", api.templateVersionPresets) - }) + r.Get("/presets", api.templateVersionPresets) r.Get("/resources", api.templateVersionResources) r.Get("/logs", api.templateVersionLogs) r.Route("/dry-run", func(r chi.Router) { diff --git a/coderd/presets.go b/coderd/presets.go index e4c6b30e9d67b..a2787b63e733d 100644 --- a/coderd/presets.go +++ b/coderd/presets.go @@ -45,12 +45,10 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request) 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, - }) - } + sdkPreset.Parameters = append(sdkPreset.Parameters, codersdk.PresetParameter{ + Name: presetParam.Name, + Value: presetParam.Value, + }) } res = append(res, sdkPreset) } From 4fa66746add72e871b4f83f046624e602fbe2bbb Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 08:25:09 +0000 Subject: [PATCH 06/11] make -B gen --- coderd/apidoc/docs.go | 44 +++------------------- coderd/apidoc/swagger.json | 40 +++----------------- docs/reference/api/schemas.md | 18 ++++++--- docs/reference/api/templates.md | 65 ++++++--------------------------- 4 files changed, 37 insertions(+), 130 deletions(-) diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 3423b696fc743..59e04bb35ed19 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -5643,44 +5643,6 @@ const docTemplate = `{ } } }, - "/templateversions/{templateversion}/presets/parameters": { - "get": { - "security": [ - { - "CoderSessionToken": [] - } - ], - "produces": [ - "application/json" - ], - "tags": [ - "Templates" - ], - "summary": "Get template version preset parameters", - "operationId": "get-template-version-preset-parameters", - "parameters": [ - { - "type": "string", - "format": "uuid", - "description": "Template version ID", - "name": "templateversion", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/codersdk.PresetParameter" - } - } - } - } - } - }, "/templateversions/{templateversion}/resources": { "get": { "security": [ @@ -13051,6 +13013,12 @@ const docTemplate = `{ }, "name": { "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.PresetParameter" + } } } }, diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index d5a836dcb31c7..625aa64aabe82 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -4985,40 +4985,6 @@ } } }, - "/templateversions/{templateversion}/presets/parameters": { - "get": { - "security": [ - { - "CoderSessionToken": [] - } - ], - "produces": ["application/json"], - "tags": ["Templates"], - "summary": "Get template version preset parameters", - "operationId": "get-template-version-preset-parameters", - "parameters": [ - { - "type": "string", - "format": "uuid", - "description": "Template version ID", - "name": "templateversion", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/codersdk.PresetParameter" - } - } - } - } - } - }, "/templateversions/{templateversion}/resources": { "get": { "security": [ @@ -11776,6 +11742,12 @@ }, "name": { "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.PresetParameter" + } } } }, diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index d5d471ad46d3d..ec9d8e0cafeb0 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -4432,16 +4432,24 @@ Git clone makes use of this by parsing the URL from: 'Username for "https://gith ```json { "id": "string", - "name": "string" + "name": "string", + "parameters": [ + { + "name": "string", + "presetID": "string", + "value": "string" + } + ] } ``` ### Properties -| Name | Type | Required | Restrictions | Description | -|--------|--------|----------|--------------|-------------| -| `id` | string | false | | | -| `name` | string | false | | | +| Name | Type | Required | Restrictions | Description | +|--------------|---------------------------------------------------------------|----------|--------------|-------------| +| `id` | string | false | | | +| `name` | string | false | | | +| `parameters` | array of [codersdk.PresetParameter](#codersdkpresetparameter) | false | | | ## codersdk.PresetParameter diff --git a/docs/reference/api/templates.md b/docs/reference/api/templates.md index 57d35a6aab04a..6f3fb7fa8860f 100644 --- a/docs/reference/api/templates.md +++ b/docs/reference/api/templates.md @@ -2699,7 +2699,14 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/p [ { "id": "string", - "name": "string" + "name": "string", + "parameters": [ + { + "name": "string", + "presetID": "string", + "value": "string" + } + ] } ] ``` @@ -2719,58 +2726,10 @@ Status Code **200** | `[array item]` | array | false | | | | `» id` | string | false | | | | `» name` | string | false | | | - -To perform this operation, you must be authenticated. [Learn more](authentication.md). - -## Get template version preset parameters - -### Code samples - -```shell -# Example request using curl -curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/presets/parameters \ - -H 'Accept: application/json' \ - -H 'Coder-Session-Token: API_KEY' -``` - -`GET /templateversions/{templateversion}/presets/parameters` - -### Parameters - -| Name | In | Type | Required | Description | -|-------------------|------|--------------|----------|---------------------| -| `templateversion` | path | string(uuid) | true | Template version ID | - -### Example responses - -> 200 Response - -```json -[ - { - "name": "string", - "presetID": "string", - "value": "string" - } -] -``` - -### Responses - -| Status | Meaning | Description | Schema | -|--------|---------------------------------------------------------|-------------|-------------------------------------------------------------------------| -| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | array of [codersdk.PresetParameter](schemas.md#codersdkpresetparameter) | - -

Response Schema

- -Status Code **200** - -| Name | Type | Required | Restrictions | Description | -|----------------|--------|----------|--------------|-------------| -| `[array item]` | array | false | | | -| `» name` | string | false | | | -| `» presetID` | string | false | | | -| `» value` | string | false | | | +| `» parameters` | array | false | | | +| `»» name` | string | false | | | +| `»» presetID` | string | false | | | +| `»» value` | string | false | | | To perform this operation, you must be authenticated. [Learn more](authentication.md). From c31ee7b263fcbc193ad18d20503e8c917ea47524 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 08:39:17 +0000 Subject: [PATCH 07/11] fix test --- coderd/database/dbmem/dbmem.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 8d68054a49444..1db4934ef3d55 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -8149,8 +8149,9 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP q.mutex.Lock() defer q.mutex.Unlock() + //nolint:gosimple // arg needs to keep its type for interface reasons and that type is not appropriate for preset below. preset := database.TemplateVersionPreset{ - ID: uuid.New(), + ID: arg.ID, TemplateVersionID: arg.TemplateVersionID, Name: arg.Name, CreatedAt: arg.CreatedAt, From ce2956d1a78e070afdf200edd60e06298b7d8830 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 10:13:43 +0000 Subject: [PATCH 08/11] generate ids for presets by default --- coderd/database/dbauthz/dbauthz_test.go | 2 -- coderd/database/dbmem/dbmem.go | 2 +- coderd/database/dump.sql | 2 +- ...92_generate_default_preset_parameter_ids.down.sql | 3 +++ ...0292_generate_default_preset_parameter_ids.up.sql | 3 +++ coderd/database/queries.sql.go | 12 +++--------- coderd/database/queries/presets.sql | 4 ++-- coderd/presets_test.go | 1 - 8 files changed, 13 insertions(+), 16 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index 6472d225488be..46aa96bf1f7a9 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -886,7 +886,6 @@ func (s *MethodTestSuite) TestOrganization() { JobID: job.ID, }) insertPresetParams := database.InsertPresetParams{ - ID: uuid.New(), TemplateVersionID: workspaceBuild.TemplateVersionID, Name: "test", } @@ -3817,7 +3816,6 @@ func (s *MethodTestSuite) TestSystemFunctions() { CreatedBy: user.ID, }) preset, err := db.InsertPreset(ctx, database.InsertPresetParams{ - ID: uuid.New(), TemplateVersionID: templateVersion.ID, Name: "test", }) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 1db4934ef3d55..21c40233718ef 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -8151,7 +8151,7 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP //nolint:gosimple // arg needs to keep its type for interface reasons and that type is not appropriate for preset below. preset := database.TemplateVersionPreset{ - ID: arg.ID, + ID: uuid.New(), TemplateVersionID: arg.TemplateVersionID, Name: arg.Name, CreatedAt: arg.CreatedAt, diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 39efb1ebb11d3..20e7d14b57d01 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1273,7 +1273,7 @@ CREATE TABLE template_version_preset_parameters ( ); CREATE TABLE template_version_presets ( - id uuid NOT NULL, + id uuid DEFAULT gen_random_uuid() NOT NULL, template_version_id uuid NOT NULL, name text NOT NULL, created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP 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 index 02c4a2401de98..0cb92a2619d22 100644 --- a/coderd/database/migrations/000292_generate_default_preset_parameter_ids.down.sql +++ b/coderd/database/migrations/000292_generate_default_preset_parameter_ids.down.sql @@ -1,2 +1,5 @@ +ALTER TABLE template_version_presets +ALTER COLUMN id DROP DEFAULT; + 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 index a0abfceb19cc9..9801d1f37cdc5 100644 --- a/coderd/database/migrations/000292_generate_default_preset_parameter_ids.up.sql +++ b/coderd/database/migrations/000292_generate_default_preset_parameter_ids.up.sql @@ -1,2 +1,5 @@ +ALTER TABLE template_version_presets +ALTER COLUMN id SET DEFAULT gen_random_uuid(); + 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 9d08dd2899738..6030f4a60fa09 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -5494,25 +5494,19 @@ func (q *sqlQuerier) GetPresetsByTemplateVersionID(ctx context.Context, template const insertPreset = `-- name: InsertPreset :one INSERT INTO - template_version_presets (id, template_version_id, name, created_at) + template_version_presets (template_version_id, name, created_at) VALUES - ($1, $2, $3, $4) RETURNING id, template_version_id, name, created_at + ($1, $2, $3) RETURNING id, template_version_id, name, created_at ` type InsertPresetParams struct { - ID uuid.UUID `db:"id" json:"id"` TemplateVersionID uuid.UUID `db:"template_version_id" json:"template_version_id"` Name string `db:"name" json:"name"` CreatedAt time.Time `db:"created_at" json:"created_at"` } func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) (TemplateVersionPreset, error) { - row := q.db.QueryRowContext(ctx, insertPreset, - arg.ID, - arg.TemplateVersionID, - arg.Name, - arg.CreatedAt, - ) + row := q.db.QueryRowContext(ctx, insertPreset, arg.TemplateVersionID, arg.Name, arg.CreatedAt) var i TemplateVersionPreset err := row.Scan( &i.ID, diff --git a/coderd/database/queries/presets.sql b/coderd/database/queries/presets.sql index 988722929afb6..8e648fce6ca88 100644 --- a/coderd/database/queries/presets.sql +++ b/coderd/database/queries/presets.sql @@ -1,8 +1,8 @@ -- name: InsertPreset :one INSERT INTO - template_version_presets (id, template_version_id, name, created_at) + template_version_presets (template_version_id, name, created_at) VALUES - (@id, @template_version_id, @name, @created_at) RETURNING *; + (@template_version_id, @name, @created_at) RETURNING *; -- name: InsertPresetParameters :many INSERT INTO diff --git a/coderd/presets_test.go b/coderd/presets_test.go index f3430dfa62207..1bbc72431b519 100644 --- a/coderd/presets_test.go +++ b/coderd/presets_test.go @@ -44,7 +44,6 @@ func TestTemplateVersionPresets(t *testing.T) { provisionerCtx := dbauthz.AsProvisionerd(ctx) preset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{ - ID: sdkPreset.ID, Name: sdkPreset.Name, TemplateVersionID: version.ID, }) From 63b57707eb5139e8081816e429c01f202668111e Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 12:03:59 +0000 Subject: [PATCH 09/11] fix test --- coderd/presets_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/coderd/presets_test.go b/coderd/presets_test.go index 1bbc72431b519..c7df021180af5 100644 --- a/coderd/presets_test.go +++ b/coderd/presets_test.go @@ -3,7 +3,6 @@ package coderd_test import ( "testing" - "github.com/google/uuid" "github.com/stretchr/testify/require" "github.com/coder/coder/v2/coderd/coderdtest" @@ -21,7 +20,6 @@ func TestTemplateVersionPresets(t *testing.T) { t.Parallel() sdkPreset := codersdk.Preset{ - ID: uuid.New(), Name: "My Preset", Parameters: []codersdk.PresetParameter{ { @@ -70,7 +68,6 @@ func TestTemplateVersionPresets(t *testing.T) { require.NoError(t, err) 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 { From ce013a52aad307cf013b923b589adca5346a303a Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 12:11:41 +0000 Subject: [PATCH 10/11] improve test --- coderd/presets_test.go | 20 ++++++++++---------- codersdk/presets.go | 5 ++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/coderd/presets_test.go b/coderd/presets_test.go index c7df021180af5..ffe51787d5f5c 100644 --- a/coderd/presets_test.go +++ b/coderd/presets_test.go @@ -19,7 +19,7 @@ func TestTemplateVersionPresets(t *testing.T) { t.Parallel() - sdkPreset := codersdk.Preset{ + givenPreset := codersdk.Preset{ Name: "My Preset", Parameters: []codersdk.PresetParameter{ { @@ -41,20 +41,20 @@ func TestTemplateVersionPresets(t *testing.T) { // nolint:gocritic // This is a test provisionerCtx := dbauthz.AsProvisionerd(ctx) - preset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{ - Name: sdkPreset.Name, + dbPreset, err := db.InsertPreset(provisionerCtx, database.InsertPresetParams{ + Name: givenPreset.Name, TemplateVersionID: version.ID, }) require.NoError(t, err) var presetParameterNames []string var presetParameterValues []string - for _, presetParameter := range sdkPreset.Parameters { + for _, presetParameter := range givenPreset.Parameters { presetParameterNames = append(presetParameterNames, presetParameter.Name) presetParameterValues = append(presetParameterValues, presetParameter.Value) } _, err = db.InsertPresetParameters(provisionerCtx, database.InsertPresetParametersParams{ - TemplateVersionPresetID: preset.ID, + TemplateVersionPresetID: dbPreset.ID, Names: presetParameterNames, Values: presetParameterValues, }) @@ -64,13 +64,13 @@ func TestTemplateVersionPresets(t *testing.T) { require.NoError(t, err) userCtx := dbauthz.As(ctx, userSubject) - presets, err := client.TemplateVersionPresets(userCtx, version.ID) + gotPresets, err := client.TemplateVersionPresets(userCtx, version.ID) require.NoError(t, err) - require.Equal(t, 1, len(presets)) - require.Equal(t, sdkPreset.Name, presets[0].Name) + require.Equal(t, 1, len(gotPresets)) + require.Equal(t, givenPreset.Name, gotPresets[0].Name) - for _, presetParameter := range sdkPreset.Parameters { - require.Contains(t, presets[0].Parameters, presetParameter) + for _, presetParameter := range givenPreset.Parameters { + require.Contains(t, gotPresets[0].Parameters, presetParameter) } } diff --git a/codersdk/presets.go b/codersdk/presets.go index 78b186c435f11..110f6c605f026 100644 --- a/codersdk/presets.go +++ b/codersdk/presets.go @@ -17,9 +17,8 @@ type Preset struct { } type PresetParameter struct { - PresetID uuid.UUID - Name string - Value string + Name string + Value string } // TemplateVersionPresets returns the presets associated with a template version. From af4eb7f754d4e65fecdd5e0d609b54cb59b07d58 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 12 Feb 2025 12:29:07 +0000 Subject: [PATCH 11/11] make -B gen --- coderd/apidoc/docs.go | 3 --- coderd/apidoc/swagger.json | 3 --- docs/reference/api/schemas.md | 11 ++++------- docs/reference/api/templates.md | 2 -- site/src/api/typesGenerated.ts | 1 - 5 files changed, 4 insertions(+), 16 deletions(-) diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index af4587483de84..2e48634c7de13 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -13028,9 +13028,6 @@ const docTemplate = `{ "name": { "type": "string" }, - "presetID": { - "type": "string" - }, "value": { "type": "string" } diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 2167ebb8cc572..0e03555da4720 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -11757,9 +11757,6 @@ "name": { "type": "string" }, - "presetID": { - "type": "string" - }, "value": { "type": "string" } diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index a6ae7287b39f8..7b2759e281f8e 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -4436,7 +4436,6 @@ Git clone makes use of this by parsing the URL from: 'Username for "https://gith "parameters": [ { "name": "string", - "presetID": "string", "value": "string" } ] @@ -4456,18 +4455,16 @@ Git clone makes use of this by parsing the URL from: 'Username for "https://gith ```json { "name": "string", - "presetID": "string", "value": "string" } ``` ### Properties -| Name | Type | Required | Restrictions | Description | -|------------|--------|----------|--------------|-------------| -| `name` | string | false | | | -| `presetID` | string | false | | | -| `value` | string | false | | | +| Name | Type | Required | Restrictions | Description | +|---------|--------|----------|--------------|-------------| +| `name` | string | false | | | +| `value` | string | false | | | ## codersdk.PrometheusConfig diff --git a/docs/reference/api/templates.md b/docs/reference/api/templates.md index 6f3fb7fa8860f..ab8b4f1b7c131 100644 --- a/docs/reference/api/templates.md +++ b/docs/reference/api/templates.md @@ -2703,7 +2703,6 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/p "parameters": [ { "name": "string", - "presetID": "string", "value": "string" } ] @@ -2728,7 +2727,6 @@ Status Code **200** | `» name` | string | false | | | | `» parameters` | array | false | | | | `»» name` | string | false | | | -| `»» presetID` | string | false | | | | `»» value` | string | false | | | To perform this operation, you must be authenticated. [Learn more](authentication.md). diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 5ef38e89ec5ae..09541c9767b89 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -1559,7 +1559,6 @@ export interface Preset { // From codersdk/presets.go export interface PresetParameter { - readonly PresetID: string; readonly Name: string; readonly Value: string; }