diff --git a/codersdk/richparameters.go b/codersdk/richparameters.go index e7f3c83ca2..8785cba3db 100644 --- a/codersdk/richparameters.go +++ b/codersdk/richparameters.go @@ -78,24 +78,26 @@ func ValidateWorkspaceBuildParameter(richParameter TemplateVersionParameter, bui return nil } + var min, max int + if richParameter.ValidationMin != nil { + min = int(*richParameter.ValidationMin) + } + if richParameter.ValidationMax != nil { + max = int(*richParameter.ValidationMax) + } + validation := &provider.Validation{ - Min: ptrInt(richParameter.ValidationMin), - Max: ptrInt(richParameter.ValidationMax), - Regex: richParameter.ValidationRegex, - Error: richParameter.ValidationError, - Monotonic: string(richParameter.ValidationMonotonic), + Min: min, + Max: max, + MinDisabled: richParameter.ValidationMin == nil, + MaxDisabled: richParameter.ValidationMax == nil, + Regex: richParameter.ValidationRegex, + Error: richParameter.ValidationError, + Monotonic: string(richParameter.ValidationMonotonic), } return validation.Valid(richParameter.Type, value) } -func ptrInt(number *int32) *int { - if number == nil { - return nil - } - n := int(*number) - return &n -} - func findBuildParameter(params []WorkspaceBuildParameter, parameterName string) (*WorkspaceBuildParameter, bool) { if params == nil { return nil, false diff --git a/codersdk/richparameters_test.go b/codersdk/richparameters_test.go index 950a4d9e63..b92439b2af 100644 --- a/codersdk/richparameters_test.go +++ b/codersdk/richparameters_test.go @@ -187,6 +187,18 @@ func TestRichParameterValidation(t *testing.T) { {Name: boolParameterName, Type: "bool", Mutable: true}, } + numberRichParametersMinOnly := []codersdk.TemplateVersionParameter{ + {Name: stringParameterName, Type: "string", Mutable: true}, + {Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: ptr.Ref(int32(5))}, + {Name: boolParameterName, Type: "bool", Mutable: true}, + } + + numberRichParametersMaxOnly := []codersdk.TemplateVersionParameter{ + {Name: stringParameterName, Type: "string", Mutable: true}, + {Name: numberParameterName, Type: "number", Mutable: true, ValidationMax: ptr.Ref(int32(5))}, + {Name: boolParameterName, Type: "bool", Mutable: true}, + } + monotonicIncreasingNumberRichParameters := []codersdk.TemplateVersionParameter{ {Name: stringParameterName, Type: "string", Mutable: true}, {Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: ptr.Ref(int32(3)), ValidationMax: ptr.Ref(int32(10)), ValidationMonotonic: "increasing"}, @@ -232,6 +244,14 @@ func TestRichParameterValidation(t *testing.T) { {numberParameterName, "10", true, numberRichParameters}, {numberParameterName, "11", false, numberRichParameters}, + {numberParameterName, "4", false, numberRichParametersMinOnly}, + {numberParameterName, "5", true, numberRichParametersMinOnly}, + {numberParameterName, "6", true, numberRichParametersMinOnly}, + + {numberParameterName, "4", true, numberRichParametersMaxOnly}, + {numberParameterName, "5", true, numberRichParametersMaxOnly}, + {numberParameterName, "6", false, numberRichParametersMaxOnly}, + {numberParameterName, "6", false, monotonicIncreasingNumberRichParameters}, {numberParameterName, "7", true, monotonicIncreasingNumberRichParameters}, {numberParameterName, "8", true, monotonicIncreasingNumberRichParameters}, diff --git a/go.mod b/go.mod index 8072399881..f808d16022 100644 --- a/go.mod +++ b/go.mod @@ -75,7 +75,7 @@ require ( github.com/codeclysm/extract v2.2.0+incompatible github.com/coder/flog v1.1.0 github.com/coder/retry v1.4.0 - github.com/coder/terraform-provider-coder v0.8.1 + github.com/coder/terraform-provider-coder v0.8.2 github.com/coder/wgtunnel v0.1.5 github.com/coreos/go-oidc/v3 v3.6.0 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf diff --git a/go.sum b/go.sum index cb80867903..5b3694ae07 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,8 @@ github.com/coder/ssh v0.0.0-20230421140225-04bb837133e1 h1:LBw76rEDuhNJyohve11mb github.com/coder/ssh v0.0.0-20230421140225-04bb837133e1/go.mod h1:ZSS+CUoKHDrqVakTfTWUlKSr9MtMFkC4UvtQKD7O914= github.com/coder/tailscale v0.0.0-20230522123520-74712221d00f h1:F0Xr1d8h8dAHn7tab1HXuzYFkcjmCydnEfdMbkOhlVk= github.com/coder/tailscale v0.0.0-20230522123520-74712221d00f/go.mod h1:jpg+77g19FpXL43U1VoIqoSg1K/Vh5CVxycGldQ8KhA= -github.com/coder/terraform-provider-coder v0.8.1 h1:i/LhvFi+Ei0gL+h4GItJfwtxjcITTlQhS+R8J+0vRo8= -github.com/coder/terraform-provider-coder v0.8.1/go.mod h1:UIfU3bYNeSzJJvHyJ30tEKjD6Z9utloI+HUM/7n94CY= +github.com/coder/terraform-provider-coder v0.8.2 h1:EPhkdpsNd8fcg6eqpAQr+W1eRrEAMtugoqujoTK4O6o= +github.com/coder/terraform-provider-coder v0.8.2/go.mod h1:UIfU3bYNeSzJJvHyJ30tEKjD6Z9utloI+HUM/7n94CY= github.com/coder/wgtunnel v0.1.5 h1:WP3sCj/3iJ34eKvpMQEp1oJHvm24RYh0NHbj1kfUKfs= github.com/coder/wgtunnel v0.1.5/go.mod h1:bokoUrHnUFY4lu9KOeSYiIcHTI2MO1KwqumU4DPDyJI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= diff --git a/provisioner/terraform/resources.go b/provisioner/terraform/resources.go index 28faadfa54..cded02df4b 100644 --- a/provisioner/terraform/resources.go +++ b/provisioner/terraform/resources.go @@ -483,8 +483,35 @@ func ConvertState(modules []*tfjson.StateModule, rawGraph string, rawParameterNa if len(param.Validation) == 1 { protoParam.ValidationRegex = param.Validation[0].Regex protoParam.ValidationError = param.Validation[0].Error - protoParam.ValidationMax = ptrInt32(param.Validation[0].Max) - protoParam.ValidationMin = ptrInt32(param.Validation[0].Min) + + validationAttributeValues, ok := resource.AttributeValues["validation"] + if ok { + validationAttributeValuesArr, ok := validationAttributeValues.([]interface{}) + if ok { + validationAttributeValuesMapStr, ok := validationAttributeValuesArr[0].(map[string]interface{}) + if ok { + // Backward compatibility with terraform-coder-plugin < v0.8.2: + // * "min_disabled" and "max_disabled" are not available yet + // * "min" and "max" are required to be specified together + if _, ok = validationAttributeValuesMapStr["min_disabled"]; !ok { + if param.Validation[0].Min != 0 || param.Validation[0].Max != 0 { + param.Validation[0].MinDisabled = false + param.Validation[0].MaxDisabled = false + } else { + param.Validation[0].MinDisabled = true + param.Validation[0].MaxDisabled = true + } + } + } + } + } + + if !param.Validation[0].MaxDisabled { + protoParam.ValidationMax = PtrInt32(param.Validation[0].Max) + } + if !param.Validation[0].MinDisabled { + protoParam.ValidationMin = PtrInt32(param.Validation[0].Min) + } protoParam.ValidationMonotonic = param.Validation[0].Monotonic } if len(param.Option) > 0 { @@ -527,12 +554,8 @@ func ConvertState(modules []*tfjson.StateModule, rawGraph string, rawParameterNa }, nil } -func ptrInt32(number *int) *int32 { - var n int32 - if number == nil { - return &n - } - n = int32(*number) +func PtrInt32(number int) *int32 { + n := int32(number) return &n } diff --git a/provisioner/terraform/resources_test.go b/provisioner/terraform/resources_test.go index 34ab787b89..5814417091 100644 --- a/provisioner/terraform/resources_test.go +++ b/provisioner/terraform/resources_test.go @@ -323,6 +323,83 @@ func TestConvertResources(t *testing.T) { Type: "string", Description: "blah blah", DefaultValue: "ok", + }, { + Name: "number_example_min_max", + Type: "number", + DefaultValue: "4", + ValidationMin: terraform.PtrInt32(3), + ValidationMax: terraform.PtrInt32(6), + }, { + Name: "number_example_min_zero", + Type: "number", + DefaultValue: "4", + ValidationMin: terraform.PtrInt32(0), + ValidationMax: terraform.PtrInt32(6), + }, { + Name: "number_example_max_zero", + Type: "number", + DefaultValue: "-2", + ValidationMin: terraform.PtrInt32(-3), + ValidationMax: terraform.PtrInt32(0), + }, { + Name: "number_example", + Type: "number", + DefaultValue: "4", + ValidationMin: nil, + ValidationMax: nil, + }}, + }, + "rich-parameters-validation": { + resources: []*proto.Resource{{ + Name: "dev", + Type: "null_resource", + Agents: []*proto.Agent{{ + Name: "dev", + OperatingSystem: "windows", + ShutdownScriptTimeoutSeconds: 300, + StartupScriptTimeoutSeconds: 300, + Architecture: "arm64", + Auth: &proto.Agent_Token{}, + LoginBeforeReady: true, + ConnectionTimeoutSeconds: 120, + }}, + }}, + parameters: []*proto.RichParameter{{ + Name: "number_example_min_max", + Type: "number", + DefaultValue: "4", + ValidationMin: terraform.PtrInt32(3), + ValidationMax: terraform.PtrInt32(6), + }, { + Name: "number_example_min", + Type: "number", + DefaultValue: "4", + ValidationMin: terraform.PtrInt32(3), + ValidationMax: nil, + }, { + Name: "number_example_min_zero", + Type: "number", + DefaultValue: "4", + ValidationMin: terraform.PtrInt32(0), + ValidationMax: nil, + }, { + Name: "number_example_max", + Type: "number", + DefaultValue: "4", + ValidationMin: nil, + ValidationMax: terraform.PtrInt32(6), + }, { + Name: "number_example_max_zero", + Type: "number", + DefaultValue: "-3", + ValidationMin: nil, + ValidationMax: terraform.PtrInt32(0), + }, { + Name: "number_example", + Type: "number", + DefaultValue: "4", + ValidationMin: nil, + ValidationMax: nil, }}, }, "git-auth-providers": { diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf new file mode 100644 index 0000000000..6585a6517b --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf @@ -0,0 +1,69 @@ +terraform { + required_providers { + coder = { + source = "coder/coder" + version = "0.8.2" + } + } +} + +data "coder_parameter" "number_example_min_max" { + name = "number_example_min_max" + type = "number" + default = 4 + validation { + min = 3 + max = 6 + } +} + +data "coder_parameter" "number_example_min" { + name = "number_example_min" + type = "number" + default = 4 + validation { + min = 3 + } +} + +data "coder_parameter" "number_example_min_zero" { + name = "number_example_min_zero" + type = "number" + default = 4 + validation { + min = 0 + } +} + +data "coder_parameter" "number_example_max" { + name = "number_example_max" + type = "number" + default = 4 + validation { + max = 6 + } +} + +data "coder_parameter" "number_example_max_zero" { + name = "number_example_max_zero" + type = "number" + default = -3 + validation { + max = 0 + } +} + +data "coder_parameter" "number_example" { + name = "number_example" + type = "number" + default = 4 +} + +resource "coder_agent" "dev" { + os = "windows" + arch = "arm64" +} + +resource "null_resource" "dev" { + depends_on = [coder_agent.dev] +} diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot new file mode 100644 index 0000000000..5ed08dde2a --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot @@ -0,0 +1,36 @@ +digraph { + compound = "true" + newrank = "true" + subgraph "root" { + "[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"] + "[root] data.coder_parameter.number_example (expand)" [label = "data.coder_parameter.number_example", shape = "box"] + "[root] data.coder_parameter.number_example_max (expand)" [label = "data.coder_parameter.number_example_max", shape = "box"] + "[root] data.coder_parameter.number_example_max_zero (expand)" [label = "data.coder_parameter.number_example_max_zero", shape = "box"] + "[root] data.coder_parameter.number_example_min (expand)" [label = "data.coder_parameter.number_example_min", shape = "box"] + "[root] data.coder_parameter.number_example_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", shape = "box"] + "[root] data.coder_parameter.number_example_min_zero (expand)" [label = "data.coder_parameter.number_example_min_zero", shape = "box"] + "[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"] + "[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"] + "[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"] + "[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_max (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_max_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_max (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)" + "[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_max (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_max_zero (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_max (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_zero (expand)" + "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)" + "[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" + "[root] root" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" + } +} + diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json new file mode 100644 index 0000000000..f089f12bf1 --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json @@ -0,0 +1,540 @@ +{ + "format_version": "1.1", + "terraform_version": "1.4.0", + "planned_values": { + "root_module": { + "resources": [ + { + "address": "coder_agent.dev", + "mode": "managed", + "type": "coder_agent", + "name": "dev", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "arch": "arm64", + "auth": "token", + "connection_timeout": 120, + "dir": null, + "env": null, + "login_before_ready": true, + "metadata": [], + "motd_file": null, + "os": "windows", + "shutdown_script": null, + "shutdown_script_timeout": 300, + "startup_script": null, + "startup_script_timeout": 300, + "troubleshooting_url": null + }, + "sensitive_values": { + "metadata": [] + } + }, + { + "address": "null_resource.dev", + "mode": "managed", + "type": "null_resource", + "name": "dev", + "provider_name": "registry.terraform.io/hashicorp/null", + "schema_version": 0, + "values": { + "triggers": null + }, + "sensitive_values": {} + } + ] + } + }, + "resource_changes": [ + { + "address": "coder_agent.dev", + "mode": "managed", + "type": "coder_agent", + "name": "dev", + "provider_name": "registry.terraform.io/coder/coder", + "change": { + "actions": [ + "create" + ], + "before": null, + "after": { + "arch": "arm64", + "auth": "token", + "connection_timeout": 120, + "dir": null, + "env": null, + "login_before_ready": true, + "metadata": [], + "motd_file": null, + "os": "windows", + "shutdown_script": null, + "shutdown_script_timeout": 300, + "startup_script": null, + "startup_script_timeout": 300, + "troubleshooting_url": null + }, + "after_unknown": { + "id": true, + "init_script": true, + "metadata": [], + "token": true + }, + "before_sensitive": false, + "after_sensitive": { + "metadata": [], + "token": true + } + } + }, + { + "address": "null_resource.dev", + "mode": "managed", + "type": "null_resource", + "name": "dev", + "provider_name": "registry.terraform.io/hashicorp/null", + "change": { + "actions": [ + "create" + ], + "before": null, + "after": { + "triggers": null + }, + "after_unknown": { + "id": true + }, + "before_sensitive": false, + "after_sensitive": {} + } + } + ], + "prior_state": { + "format_version": "1.0", + "terraform_version": "1.4.0", + "values": { + "root_module": { + "resources": [ + { + "address": "data.coder_parameter.number_example", + "mode": "data", + "type": "coder_parameter", + "name": "number_example", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "b4018ceb-5529-4ea9-8d44-f1435255f5ce", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example", + "option": null, + "optional": true, + "type": "number", + "validation": [], + "value": "4" + }, + "sensitive_values": { + "validation": [] + } + }, + { + "address": "data.coder_parameter.number_example_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "78f023f8-d78a-4660-bc55-f4af607e9c92", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_max", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "max_disabled": false, + "min": 0, + "min_disabled": true, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_max_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "-3", + "description": null, + "display_name": null, + "icon": null, + "id": "d4dc1b09-51d8-4428-92e5-637ca7f23826", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_max_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "max_disabled": false, + "min": 0, + "min_disabled": true, + "monotonic": "", + "regex": "" + } + ], + "value": "-3" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "7e0c0c5d-4c6f-44d3-aaae-31e6698d65d8", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "max_disabled": true, + "min": 3, + "min_disabled": false, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_max", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "1e9fe990-cc13-4cdb-84dd-ab198ffe8e8d", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_max", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "max_disabled": false, + "min": 3, + "min_disabled": false, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "a358e7b2-9ace-49fe-b94b-476f1a5e0fbd", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "max_disabled": true, + "min": 0, + "min_disabled": false, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + } + ] + } + } + }, + "configuration": { + "provider_config": { + "coder": { + "name": "coder", + "full_name": "registry.terraform.io/coder/coder", + "version_constraint": "0.8.2" + }, + "null": { + "name": "null", + "full_name": "registry.terraform.io/hashicorp/null" + } + }, + "root_module": { + "resources": [ + { + "address": "coder_agent.dev", + "mode": "managed", + "type": "coder_agent", + "name": "dev", + "provider_config_key": "coder", + "expressions": { + "arch": { + "constant_value": "arm64" + }, + "os": { + "constant_value": "windows" + } + }, + "schema_version": 0 + }, + { + "address": "null_resource.dev", + "mode": "managed", + "type": "null_resource", + "name": "dev", + "provider_config_key": "null", + "schema_version": 0, + "depends_on": [ + "coder_agent.dev" + ] + }, + { + "address": "data.coder_parameter.number_example", + "mode": "data", + "type": "coder_parameter", + "name": "number_example", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example" + }, + "type": { + "constant_value": "number" + } + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example_max" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "max": { + "constant_value": 6 + } + } + ] + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_max_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max_zero", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": -3 + }, + "name": { + "constant_value": "number_example_max_zero" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "max": { + "constant_value": 0 + } + } + ] + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_min", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example_min" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "min": { + "constant_value": 3 + } + } + ] + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_min_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_max", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example_min_max" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "max": { + "constant_value": 6 + }, + "min": { + "constant_value": 3 + } + } + ] + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_min_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_zero", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example_min_zero" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "min": { + "constant_value": 0 + } + } + ] + }, + "schema_version": 0 + } + ] + } + } +} diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot new file mode 100644 index 0000000000..5ed08dde2a --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot @@ -0,0 +1,36 @@ +digraph { + compound = "true" + newrank = "true" + subgraph "root" { + "[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"] + "[root] data.coder_parameter.number_example (expand)" [label = "data.coder_parameter.number_example", shape = "box"] + "[root] data.coder_parameter.number_example_max (expand)" [label = "data.coder_parameter.number_example_max", shape = "box"] + "[root] data.coder_parameter.number_example_max_zero (expand)" [label = "data.coder_parameter.number_example_max_zero", shape = "box"] + "[root] data.coder_parameter.number_example_min (expand)" [label = "data.coder_parameter.number_example_min", shape = "box"] + "[root] data.coder_parameter.number_example_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", shape = "box"] + "[root] data.coder_parameter.number_example_min_zero (expand)" [label = "data.coder_parameter.number_example_min_zero", shape = "box"] + "[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"] + "[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"] + "[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"] + "[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_max (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_max_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_max (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)" + "[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_max (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_max_zero (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_max (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_zero (expand)" + "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)" + "[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" + "[root] root" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" + } +} + diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json new file mode 100644 index 0000000000..9650488a5d --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json @@ -0,0 +1,278 @@ +{ + "format_version": "1.0", + "terraform_version": "1.4.0", + "values": { + "root_module": { + "resources": [ + { + "address": "data.coder_parameter.number_example", + "mode": "data", + "type": "coder_parameter", + "name": "number_example", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "2ba8e573-2f49-4a2a-b454-1fd544b7d50c", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example", + "option": null, + "optional": true, + "type": "number", + "validation": [], + "value": "4" + }, + "sensitive_values": { + "validation": [] + } + }, + { + "address": "data.coder_parameter.number_example_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "7f94ec1c-7ad9-42ee-8efe-ade93e45a23f", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_max", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "max_disabled": false, + "min": 0, + "min_disabled": true, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_max_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "-3", + "description": null, + "display_name": null, + "icon": null, + "id": "03793f75-22ba-4232-ae8b-dcc34f34a9dc", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_max_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "max_disabled": false, + "min": 0, + "min_disabled": true, + "monotonic": "", + "regex": "" + } + ], + "value": "-3" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "822879a8-5ee0-46c7-984d-b4efc9e70bcf", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "max_disabled": true, + "min": 3, + "min_disabled": false, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_max", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "a59a1652-653b-424e-8106-b19f938ac556", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_max", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "max_disabled": false, + "min": 3, + "min_disabled": false, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "65c5512e-6c5c-40eb-bb2c-bca47f72564b", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "max_disabled": true, + "min": 0, + "min_disabled": false, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "coder_agent.dev", + "mode": "managed", + "type": "coder_agent", + "name": "dev", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "arch": "arm64", + "auth": "token", + "connection_timeout": 120, + "dir": null, + "env": null, + "id": "6cddf19d-3caa-47dd-b4a8-6a6ac423caf2", + "init_script": "", + "login_before_ready": true, + "metadata": [], + "motd_file": null, + "os": "windows", + "shutdown_script": null, + "shutdown_script_timeout": 300, + "startup_script": null, + "startup_script_timeout": 300, + "token": "19f956f2-92b2-4fd9-8a89-ed3ec5c23716", + "troubleshooting_url": null + }, + "sensitive_values": { + "metadata": [] + } + }, + { + "address": "null_resource.dev", + "mode": "managed", + "type": "null_resource", + "name": "dev", + "provider_name": "registry.terraform.io/hashicorp/null", + "schema_version": 0, + "values": { + "id": "6499191613757287225", + "triggers": null + }, + "sensitive_values": {}, + "depends_on": [ + "coder_agent.dev" + ] + } + ] + } + } +} diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf index 2c292c89c0..65bd5594ec 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf @@ -2,7 +2,7 @@ terraform { required_providers { coder = { source = "coder/coder" - version = "0.6.20" + version = "0.7.0" } } } @@ -27,6 +27,43 @@ data "coder_parameter" "example" { } } +// Plugin revision v0.7.0 requires defining "min" or "max" rules together. +data "coder_parameter" "number_example_min_max" { + name = "number_example_min_max" + type = "number" + default = 4 + validation { + min = 3 + max = 6 + } +} + +data "coder_parameter" "number_example_min_zero" { + name = "number_example_min_zero" + type = "number" + default = 4 + validation { + min = 0 + max = 6 + } +} + +data "coder_parameter" "number_example_max_zero" { + name = "number_example_max_zero" + type = "number" + default = -2 + validation { + min = -3 + max = 0 + } +} + +data "coder_parameter" "number_example" { + name = "number_example" + type = "number" + default = 4 +} + resource "coder_agent" "dev" { os = "windows" arch = "arm64" diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot index ba97f97407..d609461299 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot @@ -4,17 +4,29 @@ digraph { subgraph "root" { "[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"] "[root] data.coder_parameter.example (expand)" [label = "data.coder_parameter.example", shape = "box"] + "[root] data.coder_parameter.number_example (expand)" [label = "data.coder_parameter.number_example", shape = "box"] + "[root] data.coder_parameter.number_example_max_zero (expand)" [label = "data.coder_parameter.number_example_max_zero", shape = "box"] + "[root] data.coder_parameter.number_example_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", shape = "box"] + "[root] data.coder_parameter.number_example_min_zero (expand)" [label = "data.coder_parameter.number_example_min_zero", shape = "box"] "[root] data.coder_parameter.sample (expand)" [label = "data.coder_parameter.sample", shape = "box"] "[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"] "[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"] "[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"] "[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" "[root] data.coder_parameter.example (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_max_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_max (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" "[root] data.coder_parameter.sample (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" "[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)" "[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]" "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)" "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.example (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_max_zero (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_max (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_zero (expand)" "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.sample (expand)" "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)" "[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json index 71b701abde..299c56f6be 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json @@ -1,6 +1,6 @@ { "format_version": "1.1", - "terraform_version": "1.3.7", + "terraform_version": "1.4.0", "planned_values": { "root_module": { "resources": [ @@ -18,6 +18,7 @@ "dir": null, "env": null, "login_before_ready": true, + "metadata": [], "motd_file": null, "os": "windows", "shutdown_script": null, @@ -26,7 +27,9 @@ "startup_script_timeout": 300, "troubleshooting_url": null }, - "sensitive_values": {} + "sensitive_values": { + "metadata": [] + } }, { "address": "null_resource.dev", @@ -62,6 +65,7 @@ "dir": null, "env": null, "login_before_ready": true, + "metadata": [], "motd_file": null, "os": "windows", "shutdown_script": null, @@ -73,10 +77,12 @@ "after_unknown": { "id": true, "init_script": true, + "metadata": [], "token": true }, "before_sensitive": false, "after_sensitive": { + "metadata": [], "token": true } } @@ -105,7 +111,7 @@ ], "prior_state": { "format_version": "1.0", - "terraform_version": "1.3.7", + "terraform_version": "1.4.0", "values": { "root_module": { "resources": [ @@ -119,8 +125,9 @@ "values": { "default": null, "description": null, + "display_name": null, "icon": null, - "id": "857b1591-ee42-4ded-9804-783ffd1eb180", + "id": "62a57280-032d-4528-9705-c663e6971d9d", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -151,6 +158,142 @@ ] } }, + { + "address": "data.coder_parameter.number_example", + "mode": "data", + "type": "coder_parameter", + "name": "number_example", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "37b849a7-1830-4662-b804-e23a6fb0a0dd", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example", + "option": null, + "optional": true, + "type": "number", + "validation": null, + "value": "4" + }, + "sensitive_values": {} + }, + { + "address": "data.coder_parameter.number_example_max_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "-2", + "description": null, + "display_name": null, + "icon": null, + "id": "21eddf29-7529-4ea4-9416-c0c6c156c3ad", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_max_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "min": -3, + "monotonic": "", + "regex": "" + } + ], + "value": "-2" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_max", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "826afb7f-80fe-4563-95d3-1f8da1f8c274", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_max", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "min": 3, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "9656b8ff-4e7b-4ba0-8377-569b358ff110", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "min": 0, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, { "address": "data.coder_parameter.sample", "mode": "data", @@ -161,8 +304,9 @@ "values": { "default": "ok", "description": "blah blah", + "display_name": null, "icon": null, - "id": "1477c44d-b36a-48cd-9942-0b532f1791db", + "id": "07dd798d-22fe-437d-ae78-2092d01f4b0b", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -184,7 +328,7 @@ "coder": { "name": "coder", "full_name": "registry.terraform.io/coder/coder", - "version_constraint": "0.6.20" + "version_constraint": "0.7.0" }, "null": { "name": "null", @@ -254,6 +398,112 @@ }, "schema_version": 0 }, + { + "address": "data.coder_parameter.number_example", + "mode": "data", + "type": "coder_parameter", + "name": "number_example", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example" + }, + "type": { + "constant_value": "number" + } + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_max_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max_zero", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": -2 + }, + "name": { + "constant_value": "number_example_max_zero" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "max": { + "constant_value": 0 + }, + "min": { + "constant_value": -3 + } + } + ] + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_min_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_max", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example_min_max" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "max": { + "constant_value": 6 + }, + "min": { + "constant_value": 3 + } + } + ] + }, + "schema_version": 0 + }, + { + "address": "data.coder_parameter.number_example_min_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_zero", + "provider_config_key": "coder", + "expressions": { + "default": { + "constant_value": 4 + }, + "name": { + "constant_value": "number_example_min_zero" + }, + "type": { + "constant_value": "number" + }, + "validation": [ + { + "max": { + "constant_value": 6 + }, + "min": { + "constant_value": 0 + } + } + ] + }, + "schema_version": 0 + }, { "address": "data.coder_parameter.sample", "mode": "data", diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot index ba97f97407..d609461299 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot @@ -4,17 +4,29 @@ digraph { subgraph "root" { "[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"] "[root] data.coder_parameter.example (expand)" [label = "data.coder_parameter.example", shape = "box"] + "[root] data.coder_parameter.number_example (expand)" [label = "data.coder_parameter.number_example", shape = "box"] + "[root] data.coder_parameter.number_example_max_zero (expand)" [label = "data.coder_parameter.number_example_max_zero", shape = "box"] + "[root] data.coder_parameter.number_example_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", shape = "box"] + "[root] data.coder_parameter.number_example_min_zero (expand)" [label = "data.coder_parameter.number_example_min_zero", shape = "box"] "[root] data.coder_parameter.sample (expand)" [label = "data.coder_parameter.sample", shape = "box"] "[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"] "[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"] "[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"] "[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" "[root] data.coder_parameter.example (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_max_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_max (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" + "[root] data.coder_parameter.number_example_min_zero (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" "[root] data.coder_parameter.sample (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]" "[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)" "[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]" "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)" "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.example (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_max_zero (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_max (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_zero (expand)" "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.sample (expand)" "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)" "[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json index 268a678601..b09aa22355 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json @@ -1,36 +1,9 @@ { "format_version": "1.0", - "terraform_version": "1.3.7", + "terraform_version": "1.4.0", "values": { "root_module": { "resources": [ - { - "address": "coder_agent.dev", - "mode": "managed", - "type": "coder_agent", - "name": "dev", - "provider_name": "registry.terraform.io/coder/coder", - "schema_version": 0, - "values": { - "arch": "arm64", - "auth": "token", - "connection_timeout": 120, - "dir": null, - "env": null, - "id": "c2221717-e813-49f0-a655-4cb7aa5265e2", - "init_script": "", - "login_before_ready": true, - "motd_file": null, - "os": "windows", - "shutdown_script": null, - "shutdown_script_timeout": 300, - "startup_script": null, - "startup_script_timeout": 300, - "token": "fdb94db8-fca1-4a13-bbcb-73bfaec95b77", - "troubleshooting_url": null - }, - "sensitive_values": {} - }, { "address": "data.coder_parameter.example", "mode": "data", @@ -41,8 +14,9 @@ "values": { "default": null, "description": null, + "display_name": null, "icon": null, - "id": "f5f644c9-cb0c-47b1-8e02-d9f6fa99b935", + "id": "5860f577-b0e7-4bb6-a4de-9de71a801ba0", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -73,6 +47,142 @@ ] } }, + { + "address": "data.coder_parameter.number_example", + "mode": "data", + "type": "coder_parameter", + "name": "number_example", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "ecac8658-4def-424a-a24e-0a8c906cf8e8", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example", + "option": null, + "optional": true, + "type": "number", + "validation": null, + "value": "4" + }, + "sensitive_values": {} + }, + { + "address": "data.coder_parameter.number_example_max_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_max_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "-2", + "description": null, + "display_name": null, + "icon": null, + "id": "6996b908-2bd9-4043-8821-59aada8fa202", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_max_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 0, + "min": -3, + "monotonic": "", + "regex": "" + } + ], + "value": "-2" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_max", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_max", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "a368fde8-b9ab-479f-92fb-776f4d5d3e53", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_max", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "min": 3, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, + { + "address": "data.coder_parameter.number_example_min_zero", + "mode": "data", + "type": "coder_parameter", + "name": "number_example_min_zero", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "default": "4", + "description": null, + "display_name": null, + "icon": null, + "id": "55ff394f-995a-43d8-b05f-9fbf72f62d18", + "legacy_variable": null, + "legacy_variable_name": null, + "mutable": false, + "name": "number_example_min_zero", + "option": null, + "optional": true, + "type": "number", + "validation": [ + { + "error": "", + "max": 6, + "min": 0, + "monotonic": "", + "regex": "" + } + ], + "value": "4" + }, + "sensitive_values": { + "validation": [ + {} + ] + } + }, { "address": "data.coder_parameter.sample", "mode": "data", @@ -83,8 +193,9 @@ "values": { "default": "ok", "description": "blah blah", + "display_name": null, "icon": null, - "id": "e2944252-1c30-43c8-9ce3-53a9755030dc", + "id": "6a1fb6c7-eb4d-443b-9968-1813668794d0", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -97,6 +208,36 @@ }, "sensitive_values": {} }, + { + "address": "coder_agent.dev", + "mode": "managed", + "type": "coder_agent", + "name": "dev", + "provider_name": "registry.terraform.io/coder/coder", + "schema_version": 0, + "values": { + "arch": "arm64", + "auth": "token", + "connection_timeout": 120, + "dir": null, + "env": null, + "id": "9e190fb1-8087-4c64-b99d-1e0bd1067ed8", + "init_script": "", + "login_before_ready": true, + "metadata": [], + "motd_file": null, + "os": "windows", + "shutdown_script": null, + "shutdown_script_timeout": 300, + "startup_script": null, + "startup_script_timeout": 300, + "token": "1e09aaa2-0700-4968-abbd-0b8ab8f9fefc", + "troubleshooting_url": null + }, + "sensitive_values": { + "metadata": [] + } + }, { "address": "null_resource.dev", "mode": "managed", @@ -105,7 +246,7 @@ "provider_name": "registry.terraform.io/hashicorp/null", "schema_version": 0, "values": { - "id": "5032149403215603103", + "id": "7817924891856217249", "triggers": null }, "sensitive_values": {},