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

Skip to content

Commit 125d861

Browse files
committed
feat: Validate workspace build parameters
1 parent 6dbd044 commit 125d861

File tree

4 files changed

+135
-14
lines changed

4 files changed

+135
-14
lines changed

coderd/templateversions.go

+22-13
Original file line numberDiff line numberDiff line change
@@ -223,27 +223,24 @@ func (api *API) templateVersionRichParameters(rw http.ResponseWriter, r *http.Re
223223
})
224224
return
225225
}
226-
dbParameters, err := api.Database.GetTemplateVersionParameters(ctx, templateVersion.ID)
226+
dbTemplateVersionParameters, err := api.Database.GetTemplateVersionParameters(ctx, templateVersion.ID)
227227
if err != nil {
228228
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
229229
Message: "Internal error fetching template version parameters.",
230230
Detail: err.Error(),
231231
})
232232
return
233233
}
234-
params := make([]codersdk.TemplateVersionParameter, 0)
235-
for _, dbParameter := range dbParameters {
236-
param, err := convertTemplateVersionParameter(dbParameter)
237-
if err != nil {
238-
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
239-
Message: "Internal error converting template version parameter.",
240-
Detail: err.Error(),
241-
})
242-
return
243-
}
244-
params = append(params, param)
234+
235+
templateVersionParameters, err := convertTemplateVersionParameters(dbTemplateVersionParameters)
236+
if err != nil {
237+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
238+
Message: "Internal error converting template version parameter.",
239+
Detail: err.Error(),
240+
})
241+
return
245242
}
246-
httpapi.Write(ctx, rw, http.StatusOK, params)
243+
httpapi.Write(ctx, rw, http.StatusOK, templateVersionParameters)
247244
}
248245

249246
// @Summary Get parameters by template version
@@ -1379,6 +1376,18 @@ func convertTemplateVersion(version database.TemplateVersion, job codersdk.Provi
13791376
}
13801377
}
13811378

1379+
func convertTemplateVersionParameters(dbParams []database.TemplateVersionParameter) ([]codersdk.TemplateVersionParameter, error) {
1380+
params := make([]codersdk.TemplateVersionParameter, 0)
1381+
for _, dbParameter := range dbParams {
1382+
param, err := convertTemplateVersionParameter(dbParameter)
1383+
if err != nil {
1384+
return nil, err
1385+
}
1386+
params = append(params, param)
1387+
}
1388+
return params, nil
1389+
}
1390+
13821391
func convertTemplateVersionParameter(param database.TemplateVersionParameter) (codersdk.TemplateVersionParameter, error) {
13831392
var protoOptions []*sdkproto.RichParameterOption
13841393
err := json.Unmarshal(param.Options, &protoOptions)

coderd/workspacebuilds.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -449,14 +449,31 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
449449
state = priorHistory.ProvisionerState
450450
}
451451

452-
templateVersionParameters, err := api.Database.GetTemplateVersionParameters(ctx, createBuild.TemplateVersionID)
452+
dbTemplateVersionParameters, err := api.Database.GetTemplateVersionParameters(ctx, createBuild.TemplateVersionID)
453453
if err != nil {
454454
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
455455
Message: "Internal error fetching template version parameters.",
456456
Detail: err.Error(),
457457
})
458458
return
459459
}
460+
templateVersionParameters, err := convertTemplateVersionParameters(dbTemplateVersionParameters)
461+
if err != nil {
462+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
463+
Message: "Internal error converting template version parameters.",
464+
Detail: err.Error(),
465+
})
466+
return
467+
}
468+
469+
err = codersdk.ValidateWorkspaceBuildParameters(templateVersionParameters, createBuild.RichParameterValues)
470+
if err != nil {
471+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
472+
Message: "Error validating workspace build parameters.",
473+
Detail: err.Error(),
474+
})
475+
return
476+
}
460477

461478
lastBuildParameters, err := api.Database.GetWorkspaceBuildParameters(ctx, priorHistory.ID)
462479
if err != nil {

coderd/workspaces.go

+28
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,34 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
390390
})
391391
return
392392
}
393+
394+
dbTemplateVersionParameters, err := api.Database.GetTemplateVersionParameters(ctx, templateVersion.ID)
395+
if err != nil {
396+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
397+
Message: "Internal error fetching template version parameters.",
398+
Detail: err.Error(),
399+
})
400+
return
401+
}
402+
403+
templateVersionParameters, err := convertTemplateVersionParameters(dbTemplateVersionParameters)
404+
if err != nil {
405+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
406+
Message: "Internal error converting template version parameters.",
407+
Detail: err.Error(),
408+
})
409+
return
410+
}
411+
412+
err = codersdk.ValidateWorkspaceBuildParameters(templateVersionParameters, createWorkspace.RichParameterValues)
413+
if err != nil {
414+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
415+
Message: "Error validating workspace build parameters.",
416+
Detail: err.Error(),
417+
})
418+
return
419+
}
420+
393421
templateVersionJob, err := api.Database.GetProvisionerJobByID(ctx, templateVersion.JobID)
394422
if err != nil {
395423
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{

codersdk/richparameters.go

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package codersdk
2+
3+
import (
4+
"golang.org/x/xerrors"
5+
6+
"github.com/coder/terraform-provider-coder/provider"
7+
)
8+
9+
func ValidateWorkspaceBuildParameters(richParameters []TemplateVersionParameter, buildParameters []WorkspaceBuildParameter) error {
10+
for _, buildParameter := range buildParameters {
11+
richParameter, found := findTemplateVersionParameter(richParameters, buildParameter.Name)
12+
if !found {
13+
return xerrors.Errorf(`workspace build parameter is not defined in the template ("coder_parameter")`)
14+
}
15+
16+
err := ValidateWorkspaceBuildParameter(*richParameter, buildParameter)
17+
if err != nil {
18+
return xerrors.Errorf("can't validate build parameter %q: %w", buildParameter.Name, err)
19+
}
20+
}
21+
return nil
22+
}
23+
24+
func ValidateWorkspaceBuildParameter(richParameter TemplateVersionParameter, buildParameter WorkspaceBuildParameter) error {
25+
if buildParameter.Value == "" {
26+
return xerrors.Errorf("parameter value can't be empty")
27+
}
28+
29+
if len(richParameter.Options) > 0 {
30+
var matched bool
31+
for _, opt := range richParameter.Options {
32+
if opt.Value == buildParameter.Value {
33+
matched = true
34+
break
35+
}
36+
}
37+
38+
if !matched {
39+
return xerrors.Errorf("parameter value must match one of options: %s", parameterValuesAsArray(richParameter.Options))
40+
}
41+
return nil
42+
}
43+
44+
validation := &provider.Validation{
45+
Min: int(richParameter.ValidationMin),
46+
Max: int(richParameter.ValidationMax),
47+
Regex: richParameter.ValidationRegex,
48+
}
49+
return validation.Valid(richParameter.Type, buildParameter.Value)
50+
}
51+
52+
func findTemplateVersionParameter(params []TemplateVersionParameter, parameterName string) (*TemplateVersionParameter, bool) {
53+
for _, p := range params {
54+
if p.Name == parameterName {
55+
return &p, true
56+
}
57+
}
58+
return nil, false
59+
}
60+
61+
func parameterValuesAsArray(options []TemplateVersionParameterOption) []string {
62+
var arr []string
63+
for _, opt := range options {
64+
arr = append(arr, opt.Value)
65+
}
66+
return arr
67+
}

0 commit comments

Comments
 (0)