diff --git a/coderd/database/db2sdk/db2sdk.go b/coderd/database/db2sdk/db2sdk.go index 4a7871f21d15d..e926844d2b156 100644 --- a/coderd/database/db2sdk/db2sdk.go +++ b/coderd/database/db2sdk/db2sdk.go @@ -21,6 +21,7 @@ import ( "github.com/coder/coder/v2/coderd/rbac" "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/render" + "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/coderd/workspaceapps/appurl" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/provisionersdk/proto" @@ -96,6 +97,49 @@ func TemplateVersionParameters(params []database.TemplateVersionParameter) ([]co return out, nil } +func TemplateVersionParameterFromPreview(param previewtypes.Parameter) (codersdk.TemplateVersionParameter, error) { + descriptionPlaintext, err := render.PlaintextFromMarkdown(param.Description) + if err != nil { + return codersdk.TemplateVersionParameter{}, err + } + + sdkParam := codersdk.TemplateVersionParameter{ + Name: param.Name, + DisplayName: param.DisplayName, + Description: param.Description, + DescriptionPlaintext: descriptionPlaintext, + Type: string(param.Type), + FormType: string(param.FormType), + Mutable: param.Mutable, + DefaultValue: param.DefaultValue.AsString(), + Icon: param.Icon, + Required: param.Required, + Ephemeral: param.Ephemeral, + Options: List(param.Options, TemplateVersionParameterOptionFromPreview), + // Validation set after + } + if len(param.Validations) > 0 { + validation := param.Validations[0] + sdkParam.ValidationError = validation.Error + if validation.Monotonic != nil { + sdkParam.ValidationMonotonic = codersdk.ValidationMonotonicOrder(*validation.Monotonic) + } + if validation.Regex != nil { + sdkParam.ValidationRegex = *validation.Regex + } + if validation.Min != nil { + //nolint:gosec // No other choice + sdkParam.ValidationMin = ptr.Ref(int32(*validation.Min)) + } + if validation.Max != nil { + //nolint:gosec // No other choice + sdkParam.ValidationMax = ptr.Ref(int32(*validation.Max)) + } + } + + return sdkParam, nil +} + func TemplateVersionParameter(param database.TemplateVersionParameter) (codersdk.TemplateVersionParameter, error) { options, err := templateVersionParameterOptions(param.Options) if err != nil { @@ -299,6 +343,15 @@ func templateVersionParameterOptions(rawOptions json.RawMessage) ([]codersdk.Tem return options, nil } +func TemplateVersionParameterOptionFromPreview(option *previewtypes.ParameterOption) codersdk.TemplateVersionParameterOption { + return codersdk.TemplateVersionParameterOption{ + Name: option.Name, + Description: option.Description, + Value: option.Value.AsString(), + Icon: option.Icon, + } +} + func OAuth2ProviderApp(accessURL *url.URL, dbApp database.OAuth2ProviderApp) codersdk.OAuth2ProviderApp { return codersdk.OAuth2ProviderApp{ ID: dbApp.ID, diff --git a/coderd/dynamicparameters/static.go b/coderd/dynamicparameters/static.go index 14988a2d162c0..fec5de2581aef 100644 --- a/coderd/dynamicparameters/static.go +++ b/coderd/dynamicparameters/static.go @@ -28,6 +28,12 @@ func (r *loader) staticRender(ctx context.Context, db database.Store) (*staticRe } params := db2sdk.List(dbTemplateVersionParameters, TemplateVersionParameter) + + for i, param := range params { + // Update the diagnostics to validate the 'default' value. + // We do not have a user supplied value yet, so we use the default. + params[i].Diagnostics = append(params[i].Diagnostics, previewtypes.Diagnostics(param.Valid(param.Value))...) + } return &staticRender{ staticParams: params, }, nil @@ -137,7 +143,5 @@ func TemplateVersionParameter(it database.TemplateVersionParameter) previewtypes // unfortunate we have to do this, but it will return the default form_type // for a given set of conditions. _, param.FormType, _ = provider.ValidateFormType(provider.OptionType(param.Type), len(param.Options), param.FormType) - - param.Diagnostics = append(param.Diagnostics, previewtypes.Diagnostics(param.Valid(param.Value))...) return param } diff --git a/coderd/wsbuilder/wsbuilder.go b/coderd/wsbuilder/wsbuilder.go index a996d1594a50d..577ec5eca4577 100644 --- a/coderd/wsbuilder/wsbuilder.go +++ b/coderd/wsbuilder/wsbuilder.go @@ -14,11 +14,13 @@ import ( "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/coder/coder/v2/apiversion" + "github.com/coder/coder/v2/coderd/dynamicparameters" "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/provisioner/terraform/tfparse" "github.com/coder/coder/v2/provisionersdk" sdkproto "github.com/coder/coder/v2/provisionersdk/proto" + previewtypes "github.com/coder/preview/types" "github.com/google/uuid" "github.com/sqlc-dev/pqtype" @@ -71,7 +73,7 @@ type Builder struct { templateVersion *database.TemplateVersion templateVersionJob *database.ProvisionerJob terraformValues *database.TemplateVersionTerraformValue - templateVersionParameters *[]database.TemplateVersionParameter + templateVersionParameters *[]previewtypes.Parameter templateVersionVariables *[]database.TemplateVersionVariable templateVersionWorkspaceTags *[]database.TemplateVersionWorkspaceTag lastBuild *database.WorkspaceBuild @@ -716,7 +718,7 @@ func (b *Builder) getParameters() (names, values []string, err error) { } for _, templateVersionParameter := range templateVersionParameters { - tvp, err := db2sdk.TemplateVersionParameter(templateVersionParameter) + tvp, err := db2sdk.TemplateVersionParameterFromPreview(templateVersionParameter) if err != nil { return nil, nil, BuildError{http.StatusInternalServerError, "failed to convert template version parameter", err} } @@ -780,7 +782,7 @@ func (b *Builder) getLastBuildParameters() ([]database.WorkspaceBuildParameter, return values, nil } -func (b *Builder) getTemplateVersionParameters() ([]database.TemplateVersionParameter, error) { +func (b *Builder) getTemplateVersionParameters() ([]previewtypes.Parameter, error) { if b.templateVersionParameters != nil { return *b.templateVersionParameters, nil } @@ -792,8 +794,8 @@ func (b *Builder) getTemplateVersionParameters() ([]database.TemplateVersionPara if err != nil && !xerrors.Is(err, sql.ErrNoRows) { return nil, xerrors.Errorf("get template version %s parameters: %w", tvID, err) } - b.templateVersionParameters = &tvp - return tvp, nil + b.templateVersionParameters = ptr.Ref(db2sdk.List(tvp, dynamicparameters.TemplateVersionParameter)) + return *b.templateVersionParameters, nil } func (b *Builder) getTemplateVersionVariables() ([]database.TemplateVersionVariable, error) {