mirror of https://github.com/coder/coder.git
83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
package codersdk
|
|
|
|
import (
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/coder/terraform-provider-coder/provider"
|
|
)
|
|
|
|
func ValidateWorkspaceBuildParameters(richParameters []TemplateVersionParameter, buildParameters []WorkspaceBuildParameter) error {
|
|
for _, buildParameter := range buildParameters {
|
|
if buildParameter.Name == "" {
|
|
return xerrors.Errorf(`workspace build parameter name is missing`)
|
|
}
|
|
richParameter, found := findTemplateVersionParameter(richParameters, buildParameter.Name)
|
|
if !found {
|
|
return xerrors.Errorf(`workspace build parameter is not defined in the template ("coder_parameter"): %s`, buildParameter.Name)
|
|
}
|
|
|
|
err := ValidateWorkspaceBuildParameter(*richParameter, buildParameter)
|
|
if err != nil {
|
|
return xerrors.Errorf("can't validate build parameter %q: %w", buildParameter.Name, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ValidateWorkspaceBuildParameter(richParameter TemplateVersionParameter, buildParameter WorkspaceBuildParameter) error {
|
|
value := buildParameter.Value
|
|
if value == "" {
|
|
value = richParameter.DefaultValue
|
|
}
|
|
|
|
if len(richParameter.Options) > 0 {
|
|
var matched bool
|
|
for _, opt := range richParameter.Options {
|
|
if opt.Value == value {
|
|
matched = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !matched {
|
|
return xerrors.Errorf("parameter value must match one of options: %s", parameterValuesAsArray(richParameter.Options))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
if !validationEnabled(richParameter) {
|
|
return nil
|
|
}
|
|
|
|
validation := &provider.Validation{
|
|
Min: int(richParameter.ValidationMin),
|
|
Max: int(richParameter.ValidationMax),
|
|
Regex: richParameter.ValidationRegex,
|
|
Error: richParameter.ValidationError,
|
|
}
|
|
return validation.Valid(richParameter.Type, value)
|
|
}
|
|
|
|
func findTemplateVersionParameter(params []TemplateVersionParameter, parameterName string) (*TemplateVersionParameter, bool) {
|
|
for _, p := range params {
|
|
if p.Name == parameterName {
|
|
return &p, true
|
|
}
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
func parameterValuesAsArray(options []TemplateVersionParameterOption) []string {
|
|
var arr []string
|
|
for _, opt := range options {
|
|
arr = append(arr, opt.Value)
|
|
}
|
|
return arr
|
|
}
|
|
|
|
func validationEnabled(param TemplateVersionParameter) bool {
|
|
return len(param.ValidationRegex) > 0 ||
|
|
(param.ValidationMin != 0 && param.ValidationMax != 0) ||
|
|
param.Type == "bool" // boolean type doesn't have any custom validation rules, but the value must be checked (true/false).
|
|
}
|