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

Skip to content

Commit bc92134

Browse files
kylecarbsjohnstcn
andcommitted
feat: Expose the values contained in an HCL validation string to the API (#1587)
* feat: Expose the values contained in an HCL validation string to the API This allows the frontend to render inputs displaying these values! * Update codersdk/parameters.go Co-authored-by: Cian Johnston <[email protected]> * Call a spade a space * Fix linting errors with type conversion Co-authored-by: Cian Johnston <[email protected]>
1 parent b6b0aaf commit bc92134

File tree

9 files changed

+144
-54
lines changed

9 files changed

+144
-54
lines changed

cli/cliui/parameter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/coder/coder/codersdk"
1111
)
1212

13-
func ParameterSchema(cmd *cobra.Command, parameterSchema codersdk.TemplateVersionParameterSchema) (string, error) {
13+
func ParameterSchema(cmd *cobra.Command, parameterSchema codersdk.ParameterSchema) (string, error) {
1414
_, _ = fmt.Fprintln(cmd.OutOrStdout(), Styles.Bold.Render("var."+parameterSchema.Name))
1515
if parameterSchema.Description != "" {
1616
_, _ = fmt.Fprintln(cmd.OutOrStdout(), " "+strings.TrimSpace(strings.Join(strings.Split(parameterSchema.Description, "\n"), "\n "))+"\n")

cli/create.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func create() *cobra.Command {
135135
Name: parameterSchema.Name,
136136
SourceValue: value,
137137
SourceScheme: database.ParameterSourceSchemeData,
138-
DestinationScheme: parameterSchema.DefaultDestinationScheme,
138+
DestinationScheme: database.ParameterDestinationScheme(parameterSchema.DefaultDestinationScheme),
139139
})
140140
}
141141
_, _ = fmt.Fprintln(cmd.OutOrStdout())

cli/templatecreate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, org
175175
sort.Slice(parameterSchemas, func(i, j int) bool {
176176
return parameterSchemas[i].Name < parameterSchemas[j].Name
177177
})
178-
missingSchemas := make([]codersdk.TemplateVersionParameterSchema, 0)
178+
missingSchemas := make([]codersdk.ParameterSchema, 0)
179179
for _, parameterSchema := range parameterSchemas {
180180
_, ok := valuesBySchemaID[parameterSchema.ID.String()]
181181
if ok {
@@ -193,7 +193,7 @@ func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, org
193193
Name: parameterSchema.Name,
194194
SourceValue: value,
195195
SourceScheme: database.ParameterSourceSchemeData,
196-
DestinationScheme: parameterSchema.DefaultDestinationScheme,
196+
DestinationScheme: database.ParameterDestinationScheme(parameterSchema.DefaultDestinationScheme),
197197
})
198198
_, _ = fmt.Fprintln(cmd.OutOrStdout())
199199
}

coderd/parameters.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import (
88

99
"github.com/go-chi/chi/v5"
1010
"github.com/google/uuid"
11+
"golang.org/x/xerrors"
1112

1213
"github.com/coder/coder/coderd/database"
1314
"github.com/coder/coder/coderd/httpapi"
15+
"github.com/coder/coder/coderd/parameter"
1416
"github.com/coder/coder/codersdk"
1517
)
1618

@@ -122,6 +124,37 @@ func (api *api) deleteParameter(rw http.ResponseWriter, r *http.Request) {
122124
})
123125
}
124126

127+
func convertParameterSchema(parameterSchema database.ParameterSchema) (codersdk.ParameterSchema, error) {
128+
contains := []string{}
129+
if parameterSchema.ValidationCondition != "" {
130+
var err error
131+
contains, _, err = parameter.Contains(parameterSchema.ValidationCondition)
132+
if err != nil {
133+
return codersdk.ParameterSchema{}, xerrors.Errorf("parse validation condition for %q: %w", parameterSchema.Name, err)
134+
}
135+
}
136+
137+
return codersdk.ParameterSchema{
138+
ID: parameterSchema.ID,
139+
CreatedAt: parameterSchema.CreatedAt,
140+
JobID: parameterSchema.JobID,
141+
Name: parameterSchema.Name,
142+
Description: parameterSchema.Description,
143+
DefaultSourceScheme: string(parameterSchema.DefaultSourceScheme),
144+
DefaultSourceValue: parameterSchema.DefaultSourceValue,
145+
AllowOverrideSource: parameterSchema.AllowOverrideSource,
146+
DefaultDestinationScheme: string(parameterSchema.DefaultDestinationScheme),
147+
AllowOverrideDestination: parameterSchema.AllowOverrideDestination,
148+
DefaultRefresh: parameterSchema.DefaultRefresh,
149+
RedisplayValue: parameterSchema.RedisplayValue,
150+
ValidationError: parameterSchema.ValidationError,
151+
ValidationCondition: parameterSchema.ValidationCondition,
152+
ValidationTypeSystem: string(parameterSchema.ValidationTypeSystem),
153+
ValidationValueType: parameterSchema.ValidationValueType,
154+
ValidationContains: contains,
155+
}, nil
156+
}
157+
125158
func convertParameterValue(parameterValue database.ParameterValue) codersdk.Parameter {
126159
return codersdk.Parameter{
127160
ID: parameterValue.ID,

coderd/templateversions.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,18 @@ func (api *api) templateVersionSchema(rw http.ResponseWriter, r *http.Request) {
9595
})
9696
return
9797
}
98-
if schemas == nil {
99-
schemas = []database.ParameterSchema{}
98+
apiSchemas := make([]codersdk.ParameterSchema, 0)
99+
for _, schema := range schemas {
100+
apiSchema, err := convertParameterSchema(schema)
101+
if err != nil {
102+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
103+
Message: fmt.Sprintf("convert: %s", err),
104+
})
105+
return
106+
}
107+
apiSchemas = append(apiSchemas, apiSchema)
100108
}
101-
102-
httpapi.Write(rw, http.StatusOK, schemas)
109+
httpapi.Write(rw, http.StatusOK, apiSchemas)
103110
}
104111

105112
func (api *api) templateVersionParameters(rw http.ResponseWriter, r *http.Request) {

coderd/templateversions_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,36 @@ func TestTemplateVersionSchema(t *testing.T) {
198198
require.NotNil(t, schemas)
199199
require.Len(t, schemas, 1)
200200
})
201+
t.Run("ListContains", func(t *testing.T) {
202+
t.Parallel()
203+
client := coderdtest.New(t, nil)
204+
user := coderdtest.CreateFirstUser(t, client)
205+
coderdtest.NewProvisionerDaemon(t, client)
206+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
207+
Parse: []*proto.Parse_Response{{
208+
Type: &proto.Parse_Response_Complete{
209+
Complete: &proto.Parse_Complete{
210+
ParameterSchemas: []*proto.ParameterSchema{{
211+
Name: "example",
212+
ValidationTypeSystem: proto.ParameterSchema_HCL,
213+
ValidationValueType: "string",
214+
ValidationCondition: `contains(["first", "second"], var.example)`,
215+
DefaultDestination: &proto.ParameterDestination{
216+
Scheme: proto.ParameterDestination_PROVISIONER_VARIABLE,
217+
},
218+
}},
219+
},
220+
},
221+
}},
222+
Provision: echo.ProvisionComplete,
223+
})
224+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
225+
schemas, err := client.TemplateVersionSchema(context.Background(), version.ID)
226+
require.NoError(t, err)
227+
require.NotNil(t, schemas)
228+
require.Len(t, schemas, 1)
229+
require.Equal(t, []string{"first", "second"}, schemas[0].ValidationContains)
230+
})
201231
}
202232

203233
func TestTemplateVersionParameters(t *testing.T) {

codersdk/parameters.go

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,37 @@ const (
2424

2525
// Parameter represents a set value for the scope.
2626
type Parameter struct {
27-
ID uuid.UUID `db:"id" json:"id"`
28-
CreatedAt time.Time `db:"created_at" json:"created_at"`
29-
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
30-
Scope ParameterScope `db:"scope" json:"scope"`
31-
ScopeID uuid.UUID `db:"scope_id" json:"scope_id"`
32-
Name string `db:"name" json:"name"`
33-
SourceScheme database.ParameterSourceScheme `db:"source_scheme" json:"source_scheme"`
34-
DestinationScheme database.ParameterDestinationScheme `db:"destination_scheme" json:"destination_scheme"`
27+
ID uuid.UUID `json:"id"`
28+
CreatedAt time.Time `json:"created_at"`
29+
UpdatedAt time.Time `json:"updated_at"`
30+
Scope ParameterScope `json:"scope"`
31+
ScopeID uuid.UUID `json:"scope_id"`
32+
Name string `json:"name"`
33+
SourceScheme database.ParameterSourceScheme `json:"source_scheme"`
34+
DestinationScheme database.ParameterDestinationScheme `json:"destination_scheme"`
35+
}
36+
37+
type ParameterSchema struct {
38+
ID uuid.UUID `json:"id"`
39+
CreatedAt time.Time `json:"created_at"`
40+
JobID uuid.UUID `json:"job_id"`
41+
Name string `json:"name"`
42+
Description string `json:"description"`
43+
DefaultSourceScheme string `json:"default_source_scheme"`
44+
DefaultSourceValue string `json:"default_source_value"`
45+
AllowOverrideSource bool `json:"allow_override_source"`
46+
DefaultDestinationScheme string `json:"default_destination_scheme"`
47+
AllowOverrideDestination bool `json:"allow_override_destination"`
48+
DefaultRefresh string `json:"default_refresh"`
49+
RedisplayValue bool `json:"redisplay_value"`
50+
ValidationError string `json:"validation_error"`
51+
ValidationCondition string `json:"validation_condition"`
52+
ValidationTypeSystem string `json:"validation_type_system"`
53+
ValidationValueType string `json:"validation_value_type"`
54+
55+
// This is a special array of items provided if the validation condition
56+
// explicitly states the value must be one of a set.
57+
ValidationContains []string `json:"validation_contains"`
3558
}
3659

3760
// CreateParameterRequest is used to create a new parameter value for a scope.

codersdk/templateversions.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99

1010
"github.com/google/uuid"
1111

12-
"github.com/coder/coder/coderd/database"
1312
"github.com/coder/coder/coderd/parameter"
1413
)
1514

@@ -24,9 +23,6 @@ type TemplateVersion struct {
2423
Readme string `json:"readme"`
2524
}
2625

27-
// TemplateVersionParameterSchema represents a parameter parsed from template version source.
28-
type TemplateVersionParameterSchema database.ParameterSchema
29-
3026
// TemplateVersionParameter represents a computed parameter value.
3127
type TemplateVersionParameter parameter.ComputedValue
3228

@@ -58,7 +54,7 @@ func (c *Client) CancelTemplateVersion(ctx context.Context, version uuid.UUID) e
5854
}
5955

6056
// TemplateVersionSchema returns schemas for a template version by ID.
61-
func (c *Client) TemplateVersionSchema(ctx context.Context, version uuid.UUID) ([]TemplateVersionParameterSchema, error) {
57+
func (c *Client) TemplateVersionSchema(ctx context.Context, version uuid.UUID) ([]ParameterSchema, error) {
6258
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/templateversions/%s/schema", version), nil)
6359
if err != nil {
6460
return nil, err
@@ -67,7 +63,7 @@ func (c *Client) TemplateVersionSchema(ctx context.Context, version uuid.UUID) (
6763
if res.StatusCode != http.StatusOK {
6864
return nil, readBodyAsError(res)
6965
}
70-
var params []TemplateVersionParameterSchema
66+
var params []ParameterSchema
7167
return params, json.NewDecoder(res.Body).Decode(&params)
7268
}
7369

site/src/api/typesGenerated.ts

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export interface CreateOrganizationRequest {
4949
readonly name: string
5050
}
5151

52-
// From codersdk/parameters.go:38:6
52+
// From codersdk/parameters.go:61:6
5353
export interface CreateParameterRequest {
5454
readonly name: string
5555
readonly source_value: string
@@ -86,7 +86,7 @@ export interface CreateUserRequest {
8686
readonly organization_id: string
8787
}
8888

89-
// From codersdk/workspaces.go:34:6
89+
// From codersdk/workspaces.go:36:6
9090
export interface CreateWorkspaceBuildRequest {
9191
readonly template_version_id?: string
9292
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.WorkspaceTransition")
@@ -169,6 +169,30 @@ export interface Parameter {
169169
readonly destination_scheme: string
170170
}
171171

172+
// From codersdk/parameters.go:37:6
173+
export interface ParameterSchema {
174+
readonly id: string
175+
readonly created_at: string
176+
readonly job_id: string
177+
readonly name: string
178+
readonly description: string
179+
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterSourceScheme")
180+
readonly default_source_scheme: string
181+
readonly default_source_value: string
182+
readonly allow_override_source: boolean
183+
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterDestinationScheme")
184+
readonly default_destination_scheme: string
185+
readonly allow_override_destination: boolean
186+
readonly default_refresh: string
187+
readonly redisplay_value: boolean
188+
readonly validation_error: string
189+
readonly validation_condition: string
190+
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterTypeSystem")
191+
readonly validation_type_system: string
192+
readonly validation_value_type: string
193+
readonly validation_contains: string[]
194+
}
195+
172196
// From codersdk/provisionerdaemons.go:23:6
173197
export interface ProvisionerDaemon {
174198
readonly id: string
@@ -223,7 +247,7 @@ export interface Template {
223247
readonly description: string
224248
}
225249

226-
// From codersdk/templateversions.go:17:6
250+
// From codersdk/templateversions.go:16:6
227251
export interface TemplateVersion {
228252
readonly id: string
229253
readonly template_id?: string
@@ -234,7 +258,7 @@ export interface TemplateVersion {
234258
readonly readme: string
235259
}
236260

237-
// From codersdk/templateversions.go:31:6
261+
// From codersdk/templateversions.go:27:6
238262
export interface TemplateVersionParameter {
239263
// Named type "github.com/coder/coder/coderd/database.ParameterValue" unknown, using "any"
240264
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -243,29 +267,6 @@ export interface TemplateVersionParameter {
243267
readonly default_source_value: boolean
244268
}
245269

246-
// From codersdk/templateversions.go:28:6
247-
export interface TemplateVersionParameterSchema {
248-
readonly id: string
249-
readonly created_at: string
250-
readonly job_id: string
251-
readonly name: string
252-
readonly description: string
253-
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterSourceScheme")
254-
readonly default_source_scheme: string
255-
readonly default_source_value: string
256-
readonly allow_override_source: boolean
257-
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterDestinationScheme")
258-
readonly default_destination_scheme: string
259-
readonly allow_override_destination: boolean
260-
readonly default_refresh: string
261-
readonly redisplay_value: boolean
262-
readonly validation_error: string
263-
readonly validation_condition: string
264-
// This is likely an enum in an external package ("github.com/coder/coder/coderd/database.ParameterTypeSystem")
265-
readonly validation_type_system: string
266-
readonly validation_value_type: string
267-
}
268-
269270
// From codersdk/templates.go:75:6
270271
export interface TemplateVersionsByTemplateRequest extends Pagination {
271272
readonly template_id: string
@@ -292,12 +293,12 @@ export interface UpdateUserProfileRequest {
292293
readonly username: string
293294
}
294295

295-
// From codersdk/workspaces.go:102:6
296+
// From codersdk/workspaces.go:134:6
296297
export interface UpdateWorkspaceAutostartRequest {
297298
readonly schedule: string
298299
}
299300

300-
// From codersdk/workspaces.go:122:6
301+
// From codersdk/workspaces.go:154:6
301302
export interface UpdateWorkspaceAutostopRequest {
302303
readonly schedule: string
303304
}
@@ -352,7 +353,7 @@ export interface UsersRequest extends Pagination {
352353
readonly status?: string
353354
}
354355

355-
// From codersdk/workspaces.go:18:6
356+
// From codersdk/workspaces.go:20:6
356357
export interface Workspace {
357358
readonly id: string
358359
readonly created_at: string
@@ -429,12 +430,12 @@ export interface WorkspaceBuild {
429430
readonly job: ProvisionerJob
430431
}
431432

432-
// From codersdk/workspaces.go:55:6
433+
// From codersdk/workspaces.go:57:6
433434
export interface WorkspaceBuildsRequest extends Pagination {
434435
readonly WorkspaceID: string
435436
}
436437

437-
// From codersdk/workspaces.go:141:6
438+
// From codersdk/workspaces.go:173:6
438439
export interface WorkspaceFilter {
439440
readonly OrganizationID: string
440441
readonly Owner: string

0 commit comments

Comments
 (0)