chore: loosen static validation when using dynamic parameters (#17516)

Co-authored-by: Steven Masley <stevenmasley@gmail.com>
This commit is contained in:
ケイラ
2025-04-23 10:15:49 -06:00
committed by GitHub
co-authored by Steven Masley
parent 3b4343ddf3
commit 36a72a2b25
10 changed files with 64 additions and 13 deletions
+3
View File
@@ -11453,6 +11453,9 @@ const docTemplate = `{
"autostart_schedule": {
"type": "string"
},
"enable_dynamic_parameters": {
"type": "boolean"
},
"name": {
"type": "string"
},
+3
View File
@@ -10211,6 +10211,9 @@
"autostart_schedule": {
"type": "string"
},
"enable_dynamic_parameters": {
"type": "boolean"
},
"name": {
"type": "string"
},
+3
View File
@@ -676,6 +676,9 @@ func createWorkspace(
if req.TemplateVersionID != uuid.Nil {
builder = builder.VersionID(req.TemplateVersionID)
}
if req.EnableDynamicParameters && api.Experiments.Enabled(codersdk.ExperimentDynamicParameters) {
builder = builder.UsingDynamicParameters()
}
workspaceBuild, provisionerJob, provisionerDaemons, err = builder.Build(
ctx,
+28 -13
View File
@@ -51,10 +51,11 @@ type Builder struct {
logLevel string
deploymentValues *codersdk.DeploymentValues
richParameterValues []codersdk.WorkspaceBuildParameter
initiator uuid.UUID
reason database.BuildReason
templateVersionPresetID uuid.UUID
richParameterValues []codersdk.WorkspaceBuildParameter
dynamicParametersEnabled bool
initiator uuid.UUID
reason database.BuildReason
templateVersionPresetID uuid.UUID
// used during build, makes function arguments less verbose
ctx context.Context
@@ -178,6 +179,11 @@ func (b Builder) MarkPrebuild() Builder {
return b
}
func (b Builder) UsingDynamicParameters() Builder {
b.dynamicParametersEnabled = true
return b
}
// SetLastWorkspaceBuildInTx prepopulates the Builder's cache with the last workspace build. This allows us
// to avoid a repeated database query when the Builder's caller also needs the workspace build, e.g. auto-start &
// auto-stop.
@@ -578,6 +584,7 @@ func (b *Builder) getParameters() (names, values []string, err error) {
if err != nil {
return nil, nil, BuildError{http.StatusBadRequest, "Unable to build workspace with unsupported parameters", err}
}
resolver := codersdk.ParameterResolver{
Rich: db2sdk.WorkspaceBuildParameters(lastBuildParameters),
}
@@ -586,16 +593,24 @@ func (b *Builder) getParameters() (names, values []string, err error) {
if err != nil {
return nil, nil, BuildError{http.StatusInternalServerError, "failed to convert template version parameter", err}
}
value, err := resolver.ValidateResolve(
tvp,
b.findNewBuildParameterValue(templateVersionParameter.Name),
)
if err != nil {
// At this point, we've queried all the data we need from the database,
// so the only errors are problems with the request (missing data, failed
// validation, immutable parameters, etc.)
return nil, nil, BuildError{http.StatusBadRequest, fmt.Sprintf("Unable to validate parameter %q", templateVersionParameter.Name), err}
var value string
if !b.dynamicParametersEnabled {
var err error
value, err = resolver.ValidateResolve(
tvp,
b.findNewBuildParameterValue(templateVersionParameter.Name),
)
if err != nil {
// At this point, we've queried all the data we need from the database,
// so the only errors are problems with the request (missing data, failed
// validation, immutable parameters, etc.)
return nil, nil, BuildError{http.StatusBadRequest, fmt.Sprintf("Unable to validate parameter %q", templateVersionParameter.Name), err}
}
} else {
value = resolver.Resolve(tvp, b.findNewBuildParameterValue(templateVersionParameter.Name))
}
names = append(names, templateVersionParameter.Name)
values = append(values, value)
}