mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
# What does this do?
This does parameter validation for dynamic parameters in `wsbuilder`. All input parameters are validated in `coder/coder` before being sent to terraform.
The heart of this PR is [`ResolveParameters`](b65001e89c/coderd/dynamicparameters/resolver.go (L30-L30)
).
# What else changes?
`wsbuilder` now needs to load the terraform files into memory to succeed. This does add a larger memory requirement to workspace builds.
# Future work
- Sort autostart handling workspaces by template version id. So workspaces with the same template version only load the terraform files once from the db, and store them in the cache.
116 lines
2.2 KiB
HCL
116 lines
2.2 KiB
HCL
terraform {
|
|
required_providers {
|
|
coder = {
|
|
source = "coder/coder"
|
|
}
|
|
}
|
|
}
|
|
|
|
data "coder_workspace_owner" "me" {}
|
|
|
|
locals {
|
|
isAdmin = contains(data.coder_workspace_owner.me.groups, "admin")
|
|
}
|
|
|
|
data "coder_parameter" "isAdmin" {
|
|
name = "isAdmin"
|
|
type = "bool"
|
|
form_type = "switch"
|
|
default = local.isAdmin
|
|
order = 1
|
|
}
|
|
|
|
data "coder_parameter" "adminonly" {
|
|
count = local.isAdmin ? 1 : 0
|
|
name = "adminonly"
|
|
form_type = "input"
|
|
type = "string"
|
|
default = "I am an admin!"
|
|
order = 2
|
|
}
|
|
|
|
|
|
data "coder_parameter" "groups" {
|
|
name = "groups"
|
|
type = "list(string)"
|
|
form_type = "multi-select"
|
|
default = jsonencode([data.coder_workspace_owner.me.groups[0]])
|
|
order = 50
|
|
|
|
dynamic "option" {
|
|
for_each = data.coder_workspace_owner.me.groups
|
|
content {
|
|
name = option.value
|
|
value = option.value
|
|
}
|
|
}
|
|
}
|
|
|
|
locals {
|
|
colors = {
|
|
"red" : ["apple", "ruby"]
|
|
"yellow" : ["banana"]
|
|
"blue" : ["ocean", "sky"]
|
|
"green" : ["grass", "leaf"]
|
|
}
|
|
}
|
|
|
|
data "coder_parameter" "colors" {
|
|
name = "colors"
|
|
type = "list(string)"
|
|
form_type = "multi-select"
|
|
order = 100
|
|
|
|
dynamic "option" {
|
|
for_each = keys(local.colors)
|
|
content {
|
|
name = option.value
|
|
value = option.value
|
|
}
|
|
}
|
|
}
|
|
|
|
locals {
|
|
selected = jsondecode(data.coder_parameter.colors.value)
|
|
things = flatten([
|
|
for color in local.selected : local.colors[color]
|
|
])
|
|
}
|
|
|
|
data "coder_parameter" "thing" {
|
|
name = "thing"
|
|
type = "string"
|
|
form_type = "dropdown"
|
|
order = 101
|
|
|
|
dynamic "option" {
|
|
for_each = local.things
|
|
content {
|
|
name = option.value
|
|
value = option.value
|
|
}
|
|
}
|
|
}
|
|
|
|
// Cool people like blue. Idk what to tell you.
|
|
data "coder_parameter" "cool" {
|
|
count = contains(local.selected, "blue") ? 1 : 0
|
|
name = "cool"
|
|
type = "bool"
|
|
form_type = "switch"
|
|
order = 102
|
|
default = "true"
|
|
}
|
|
|
|
data "coder_parameter" "number" {
|
|
count = contains(local.selected, "green") ? 1 : 0
|
|
name = "number"
|
|
type = "number"
|
|
order = 103
|
|
validation {
|
|
error = "Number must be between 0 and 10"
|
|
min = 0
|
|
max = 10
|
|
}
|
|
}
|