From ff552baac5dee77252ee86b1f955078252f23e9d Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 1 Jun 2023 10:43:20 +0200 Subject: [PATCH 1/7] fix: use MinDisabled, MaxDisabled for parameter validation --- codersdk/richparameters.go | 28 +++++++++++++++------------- codersdk/richparameters_test.go | 20 ++++++++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- provisioner/terraform/resources.go | 16 ++++++++-------- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/codersdk/richparameters.go b/codersdk/richparameters.go index 3810eb3cb5871..1be1668ba9d45 100644 --- a/codersdk/richparameters.go +++ b/codersdk/richparameters.go @@ -78,22 +78,24 @@ func ValidateWorkspaceBuildParameter(richParameter TemplateVersionParameter, bui return nil } - validation := &provider.Validation{ - Min: ptrInt(richParameter.ValidationMin), - Max: ptrInt(richParameter.ValidationMax), - Regex: richParameter.ValidationRegex, - Error: richParameter.ValidationError, - Monotonic: string(richParameter.ValidationMonotonic), + var min, max int + if richParameter.ValidationMin != nil { + min = int(*richParameter.ValidationMin) + } + if richParameter.ValidationMax != nil { + max = int(*richParameter.ValidationMax) } - return validation.Valid(richParameter.Type, value) -} -func ptrInt(number *int32) *int { - if number == nil { - return nil + validation := &provider.Validation{ + Min: min, + Max: max, + MinDisabled: richParameter.ValidationMin == nil, + MaxDisabled: richParameter.ValidationMax == nil, + Regex: richParameter.ValidationRegex, + Error: richParameter.ValidationError, + Monotonic: string(richParameter.ValidationMonotonic), } - n := int(*number) - return &n + return validation.Valid(richParameter.Type, value) } func findBuildParameter(params []WorkspaceBuildParameter, parameterName string) (*WorkspaceBuildParameter, bool) { diff --git a/codersdk/richparameters_test.go b/codersdk/richparameters_test.go index 70e933b01dfe3..bdc3c2f7d9320 100644 --- a/codersdk/richparameters_test.go +++ b/codersdk/richparameters_test.go @@ -226,6 +226,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"}, @@ -271,6 +283,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 3c70d03ee2223..eb5a8d5b05a6e 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 32d2b0ff259e4..8ea082120ee5e 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 28faadfa54aa5..8dfdaafbded7f 100644 --- a/provisioner/terraform/resources.go +++ b/provisioner/terraform/resources.go @@ -483,8 +483,12 @@ 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) + 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 +531,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 } From bded3296ad12bd4b65884df3a4972a4dd9b3b442 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 1 Jun 2023 12:55:00 +0200 Subject: [PATCH 2/7] WIP --- provisioner/terraform/resources.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/provisioner/terraform/resources.go b/provisioner/terraform/resources.go index 8dfdaafbded7f..1cb6a1127b3cb 100644 --- a/provisioner/terraform/resources.go +++ b/provisioner/terraform/resources.go @@ -483,6 +483,15 @@ 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 + + // Backward compatibility with terraform-coder-plugin < v0.8.2 + if _, ok := resource.AttributeValues["min_disabled"]; !ok && param.Validation[0].Min == 0 { + param.Validation[0].MinDisabled = true + } + if _, ok := resource.AttributeValues["max_disabled"]; !ok && param.Validation[0].Max == 0 { + param.Validation[0].MaxDisabled = true + } + if !param.Validation[0].MaxDisabled { protoParam.ValidationMax = ptrInt32(param.Validation[0].Max) } From c7ab830499d701cb0096910d9bddc4739d7d8675 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 1 Jun 2023 13:09:07 +0200 Subject: [PATCH 3/7] WIP --- provisioner/terraform/resources.go | 6 +- provisioner/terraform/resources_test.go | 6 + .../rich-parameters/rich-parameters.tf | 13 ++- .../rich-parameters.tfplan.dot | 3 + .../rich-parameters.tfplan.json | 86 ++++++++++++++- .../rich-parameters.tfstate.dot | 3 + .../rich-parameters.tfstate.json | 104 ++++++++++++------ 7 files changed, 180 insertions(+), 41 deletions(-) diff --git a/provisioner/terraform/resources.go b/provisioner/terraform/resources.go index 1cb6a1127b3cb..34955e2ec5b35 100644 --- a/provisioner/terraform/resources.go +++ b/provisioner/terraform/resources.go @@ -493,10 +493,10 @@ func ConvertState(modules []*tfjson.StateModule, rawGraph string, rawParameterNa } if !param.Validation[0].MaxDisabled { - protoParam.ValidationMax = ptrInt32(param.Validation[0].Max) + protoParam.ValidationMax = PtrInt32(param.Validation[0].Max) } if !param.Validation[0].MinDisabled { - protoParam.ValidationMin = ptrInt32(param.Validation[0].Min) + protoParam.ValidationMin = PtrInt32(param.Validation[0].Min) } protoParam.ValidationMonotonic = param.Validation[0].Monotonic } @@ -540,7 +540,7 @@ func ConvertState(modules []*tfjson.StateModule, rawGraph string, rawParameterNa }, nil } -func ptrInt32(number int) *int32 { +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 34ab787b89cef..78402d81e19a5 100644 --- a/provisioner/terraform/resources_test.go +++ b/provisioner/terraform/resources_test.go @@ -323,6 +323,12 @@ 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), }}, }, "git-auth-providers": { diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf index 2c292c89c0efe..ecfb6fc8aacda 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,17 @@ 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 + } +} + 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 ba97f97407426..338bc702c3327 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot @@ -4,17 +4,20 @@ 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_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", 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_min_max (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_min_max (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 71b701abde02d..4d9a5881d341e 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": "aedaafc2-a2b7-4fd0-8227-c8546b334003", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -151,6 +158,43 @@ ] } }, + { + "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": "af3754f4-59d4-4f73-aa5a-583345f14dea", + "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.sample", "mode": "data", @@ -161,8 +205,9 @@ "values": { "default": "ok", "description": "blah blah", + "display_name": null, "icon": null, - "id": "1477c44d-b36a-48cd-9942-0b532f1791db", + "id": "22de5afe-f826-4fd3-8761-df796ed741d2", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -184,7 +229,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 +299,35 @@ }, "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.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 ba97f97407426..338bc702c3327 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot @@ -4,17 +4,20 @@ 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_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", 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_min_max (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_min_max (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 268a678601ac4..5c2304c68887a 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": "e417ff71-8f42-48f0-887d-d24d941ea212", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -73,6 +47,43 @@ ] } }, + { + "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": "392cab81-e291-4a7b-af53-c442ee34261c", + "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.sample", "mode": "data", @@ -83,8 +94,9 @@ "values": { "default": "ok", "description": "blah blah", + "display_name": null, "icon": null, - "id": "e2944252-1c30-43c8-9ce3-53a9755030dc", + "id": "9e5d2e2e-f633-46e5-944b-552edac51066", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -97,6 +109,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": "5f557481-73e9-4e27-ac92-91309a03647d", + "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": "a5b37e1c-818a-41ab-a057-28f1f1649ffb", + "troubleshooting_url": null + }, + "sensitive_values": { + "metadata": [] + } + }, { "address": "null_resource.dev", "mode": "managed", @@ -105,7 +147,7 @@ "provider_name": "registry.terraform.io/hashicorp/null", "schema_version": 0, "values": { - "id": "5032149403215603103", + "id": "786196255535578101", "triggers": null }, "sensitive_values": {}, From 38b5d923e6caa9c49bde03590b3a0d51f81603f6 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 1 Jun 2023 13:30:26 +0200 Subject: [PATCH 4/7] WIP --- provisioner/terraform/resources_test.go | 6 +++ .../rich-parameters/rich-parameters.tf | 6 +++ .../rich-parameters.tfplan.dot | 3 ++ .../rich-parameters.tfplan.json | 50 +++++++++++++++++-- .../rich-parameters.tfstate.dot | 3 ++ .../rich-parameters.tfstate.json | 37 +++++++++++--- 6 files changed, 96 insertions(+), 9 deletions(-) diff --git a/provisioner/terraform/resources_test.go b/provisioner/terraform/resources_test.go index 78402d81e19a5..73a2e9d7152ae 100644 --- a/provisioner/terraform/resources_test.go +++ b/provisioner/terraform/resources_test.go @@ -329,6 +329,12 @@ func TestConvertResources(t *testing.T) { DefaultValue: "4", ValidationMin: terraform.PtrInt32(3), ValidationMax: terraform.PtrInt32(6), + }, { + Name: "number_example", + Type: "number", + DefaultValue: "4", + ValidationMin: nil, + ValidationMax: nil, }}, }, "git-auth-providers": { diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf index ecfb6fc8aacda..30e06a0d3b7b0 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf @@ -38,6 +38,12 @@ data "coder_parameter" "number_example_min_max" { } } +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 338bc702c3327..cd5ca07d57760 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot @@ -4,6 +4,7 @@ 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_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", 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"] @@ -11,12 +12,14 @@ digraph { "[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_min_max (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_min_max (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)" diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json index 4d9a5881d341e..bdd173bd81270 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json @@ -127,7 +127,7 @@ "description": null, "display_name": null, "icon": null, - "id": "aedaafc2-a2b7-4fd0-8227-c8546b334003", + "id": "b1dedb7e-ec6a-4609-b893-53ed8a76cd5f", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -158,6 +158,31 @@ ] } }, + { + "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": "bc1ef22b-c42d-4e7e-be75-c2d4f5382292", + "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_min_max", "mode": "data", @@ -170,7 +195,7 @@ "description": null, "display_name": null, "icon": null, - "id": "af3754f4-59d4-4f73-aa5a-583345f14dea", + "id": "640894a3-79b5-4db6-a125-10272017853d", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -207,7 +232,7 @@ "description": "blah blah", "display_name": null, "icon": null, - "id": "22de5afe-f826-4fd3-8761-df796ed741d2", + "id": "2927428f-d0fa-43e5-a5df-feb1b6d6b14c", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -299,6 +324,25 @@ }, "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_min_max", "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 338bc702c3327..cd5ca07d57760 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot @@ -4,6 +4,7 @@ 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_min_max (expand)" [label = "data.coder_parameter.number_example_min_max", 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"] @@ -11,12 +12,14 @@ digraph { "[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_min_max (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_min_max (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)" diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json index 5c2304c68887a..fc34cb118d9c0 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json @@ -16,7 +16,7 @@ "description": null, "display_name": null, "icon": null, - "id": "e417ff71-8f42-48f0-887d-d24d941ea212", + "id": "9dd35b0f-25bd-47c4-ad7b-4cafa96e0b67", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -47,6 +47,31 @@ ] } }, + { + "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": "8e481590-e524-425a-b4d8-8095a4aa53fd", + "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_min_max", "mode": "data", @@ -59,7 +84,7 @@ "description": null, "display_name": null, "icon": null, - "id": "392cab81-e291-4a7b-af53-c442ee34261c", + "id": "358374ab-c7dc-4469-984e-f603973ca00d", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -96,7 +121,7 @@ "description": "blah blah", "display_name": null, "icon": null, - "id": "9e5d2e2e-f633-46e5-944b-552edac51066", + "id": "ccea6ce0-e896-46bc-8b73-6b49cd8244be", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -122,7 +147,7 @@ "connection_timeout": 120, "dir": null, "env": null, - "id": "5f557481-73e9-4e27-ac92-91309a03647d", + "id": "37ab6539-e2cd-4986-8e2c-514dcae31d08", "init_script": "", "login_before_ready": true, "metadata": [], @@ -132,7 +157,7 @@ "shutdown_script_timeout": 300, "startup_script": null, "startup_script_timeout": 300, - "token": "a5b37e1c-818a-41ab-a057-28f1f1649ffb", + "token": "0119680e-5f73-45ab-8f4d-9e409a20fcd7", "troubleshooting_url": null }, "sensitive_values": { @@ -147,7 +172,7 @@ "provider_name": "registry.terraform.io/hashicorp/null", "schema_version": 0, "values": { - "id": "786196255535578101", + "id": "7099247595132877572", "triggers": null }, "sensitive_values": {}, From 6d24ad68ad3305a22aa03868e76c9392f6c6bea4 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 1 Jun 2023 13:42:37 +0200 Subject: [PATCH 5/7] Unit tests done --- provisioner/terraform/resources_test.go | 41 ++ .../rich-parameters-validation.tf | 51 +++ .../rich-parameters-validation.tfplan.dot | 30 ++ .../rich-parameters-validation.tfplan.json | 410 ++++++++++++++++++ .../rich-parameters-validation.tfstate.dot | 30 ++ .../rich-parameters-validation.tfstate.json | 200 +++++++++ 6 files changed, 762 insertions(+) create mode 100644 provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf create mode 100644 provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot create mode 100644 provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json create mode 100644 provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot create mode 100644 provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json diff --git a/provisioner/terraform/resources_test.go b/provisioner/terraform/resources_test.go index 73a2e9d7152ae..dec8ceba8dc89 100644 --- a/provisioner/terraform/resources_test.go +++ b/provisioner/terraform/resources_test.go @@ -337,6 +337,47 @@ func TestConvertResources(t *testing.T) { 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_max", + Type: "number", + DefaultValue: "4", + ValidationMin: nil, + ValidationMax: terraform.PtrInt32(6), + }, { + Name: "number_example", + Type: "number", + DefaultValue: "4", + ValidationMin: nil, + ValidationMax: nil, + }}, + }, "git-auth-providers": { resources: []*proto.Resource{{ Name: "dev", 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 0000000000000..73877fface48d --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf @@ -0,0 +1,51 @@ +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_max" { + name = "number_example_max" + type = "number" + default = 4 + validation { + max = 6 + } +} + +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 0000000000000..cb65e7e166ded --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot @@ -0,0 +1,30 @@ +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_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] 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_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] 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_min (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_max (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 0000000000000..c63c3d5c1f96f --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json @@ -0,0 +1,410 @@ +{ + "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": "95e583db-a9f3-4feb-82aa-15bbc856fb08", + "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": "6947b4e9-95b6-452f-bbe6-cc3bdb050963", + "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_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": "ab5b1436-78f0-499d-bf80-5c8aa74c4db7", + "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": "8ba167c9-f9a1-438a-91a7-80adda487750", + "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": [ + {} + ] + } + } + ] + } + } + }, + "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_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 + } + ] + } + } +} 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 0000000000000..cb65e7e166ded --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot @@ -0,0 +1,30 @@ +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_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] 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_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] 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_min (expand)" + "[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_parameter.number_example_min_max (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 0000000000000..ab11b67537136 --- /dev/null +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json @@ -0,0 +1,200 @@ +{ + "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": "ab79050d-2d5b-4105-9915-90c599e6bafb", + "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": "b5306673-63cc-4480-9ccf-50720d5c7cf3", + "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_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": "d832070a-8e9b-4486-9c41-f3d7cb839d73", + "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": "ef0a50c3-a3d9-46ce-ad3a-1764bf706076", + "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": "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": "6377163b-c34e-4c2d-b397-dd6998cf8bd9", + "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": "f7c1cc85-aa48-45f7-aed3-350e398337c1", + "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": "4510022964714251508", + "triggers": null + }, + "sensitive_values": {}, + "depends_on": [ + "coder_agent.dev" + ] + } + ] + } + } +} From 85a7bd3e777d9d0e78982dc7169fc4e0372aeb8e Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 1 Jun 2023 13:48:50 +0200 Subject: [PATCH 6/7] make fmt --- .../rich-parameters-validation.tf | 16 ++++++++-------- .../testdata/rich-parameters/rich-parameters.tf | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf index 73877fface48d..2e2a216b97e1a 100644 --- a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf @@ -8,8 +8,8 @@ terraform { } data "coder_parameter" "number_example_min_max" { - name = "number_example_min_max" - type = "number" + name = "number_example_min_max" + type = "number" default = 4 validation { min = 3 @@ -18,8 +18,8 @@ data "coder_parameter" "number_example_min_max" { } data "coder_parameter" "number_example_min" { - name = "number_example_min" - type = "number" + name = "number_example_min" + type = "number" default = 4 validation { min = 3 @@ -27,8 +27,8 @@ data "coder_parameter" "number_example_min" { } data "coder_parameter" "number_example_max" { - name = "number_example_max" - type = "number" + name = "number_example_max" + type = "number" default = 4 validation { max = 6 @@ -36,8 +36,8 @@ data "coder_parameter" "number_example_max" { } data "coder_parameter" "number_example" { - name = "number_example" - type = "number" + name = "number_example" + type = "number" default = 4 } diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf index 30e06a0d3b7b0..c0a5896ba951c 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf @@ -29,8 +29,8 @@ 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" + name = "number_example_min_max" + type = "number" default = 4 validation { min = 3 @@ -39,8 +39,8 @@ data "coder_parameter" "number_example_min_max" { } data "coder_parameter" "number_example" { - name = "number_example" - type = "number" + name = "number_example" + type = "number" default = 4 } From 3dc0474805051f8d72d3b4a8118a35bc70e09b84 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Fri, 2 Jun 2023 10:37:01 +0200 Subject: [PATCH 7/7] Refactor the min-max condition --- provisioner/terraform/resources.go | 26 +++- provisioner/terraform/resources_test.go | 24 +++ .../rich-parameters-validation.tf | 18 +++ .../rich-parameters-validation.tfplan.dot | 6 + .../rich-parameters-validation.tfplan.json | 138 ++++++++++++++++- .../rich-parameters-validation.tfstate.dot | 6 + .../rich-parameters-validation.tfstate.json | 92 +++++++++++- .../rich-parameters/rich-parameters.tf | 20 +++ .../rich-parameters.tfplan.dot | 6 + .../rich-parameters.tfplan.json | 140 +++++++++++++++++- .../rich-parameters.tfstate.dot | 6 + .../rich-parameters.tfstate.json | 88 ++++++++++- 12 files changed, 542 insertions(+), 28 deletions(-) diff --git a/provisioner/terraform/resources.go b/provisioner/terraform/resources.go index 34955e2ec5b35..cded02df4b4e7 100644 --- a/provisioner/terraform/resources.go +++ b/provisioner/terraform/resources.go @@ -484,12 +484,26 @@ func ConvertState(modules []*tfjson.StateModule, rawGraph string, rawParameterNa protoParam.ValidationRegex = param.Validation[0].Regex protoParam.ValidationError = param.Validation[0].Error - // Backward compatibility with terraform-coder-plugin < v0.8.2 - if _, ok := resource.AttributeValues["min_disabled"]; !ok && param.Validation[0].Min == 0 { - param.Validation[0].MinDisabled = true - } - if _, ok := resource.AttributeValues["max_disabled"]; !ok && param.Validation[0].Max == 0 { - param.Validation[0].MaxDisabled = true + 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 { diff --git a/provisioner/terraform/resources_test.go b/provisioner/terraform/resources_test.go index dec8ceba8dc89..5814417091a60 100644 --- a/provisioner/terraform/resources_test.go +++ b/provisioner/terraform/resources_test.go @@ -329,6 +329,18 @@ func TestConvertResources(t *testing.T) { 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", @@ -364,12 +376,24 @@ func TestConvertResources(t *testing.T) { 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", diff --git a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf index 2e2a216b97e1a..6585a6517b95b 100644 --- a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tf @@ -26,6 +26,15 @@ data "coder_parameter" "number_example_min" { } } +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" @@ -35,6 +44,15 @@ data "coder_parameter" "number_example_max" { } } +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" 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 index cb65e7e166ded..5ed08dde2ae7e 100644 --- a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.dot @@ -5,23 +5,29 @@ digraph { "[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 index c63c3d5c1f96f..f089f12bf1aff 100644 --- a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfplan.json @@ -127,7 +127,7 @@ "description": null, "display_name": null, "icon": null, - "id": "95e583db-a9f3-4feb-82aa-15bbc856fb08", + "id": "b4018ceb-5529-4ea9-8d44-f1435255f5ce", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -154,7 +154,7 @@ "description": null, "display_name": null, "icon": null, - "id": "6947b4e9-95b6-452f-bbe6-cc3bdb050963", + "id": "78f023f8-d78a-4660-bc55-f4af607e9c92", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -181,6 +181,45 @@ ] } }, + { + "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", @@ -193,7 +232,7 @@ "description": null, "display_name": null, "icon": null, - "id": "ab5b1436-78f0-499d-bf80-5c8aa74c4db7", + "id": "7e0c0c5d-4c6f-44d3-aaae-31e6698d65d8", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -232,7 +271,7 @@ "description": null, "display_name": null, "icon": null, - "id": "8ba167c9-f9a1-438a-91a7-80adda487750", + "id": "1e9fe990-cc13-4cdb-84dd-ab198ffe8e8d", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -258,6 +297,45 @@ {} ] } + }, + { + "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": [ + {} + ] + } } ] } @@ -349,6 +427,32 @@ }, "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", @@ -403,6 +507,32 @@ ] }, "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 index cb65e7e166ded..5ed08dde2ae7e 100644 --- a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.dot @@ -5,23 +5,29 @@ digraph { "[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 index ab11b67537136..9650488a5d250 100644 --- a/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json +++ b/provisioner/terraform/testdata/rich-parameters-validation/rich-parameters-validation.tfstate.json @@ -16,7 +16,7 @@ "description": null, "display_name": null, "icon": null, - "id": "ab79050d-2d5b-4105-9915-90c599e6bafb", + "id": "2ba8e573-2f49-4a2a-b454-1fd544b7d50c", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -43,7 +43,7 @@ "description": null, "display_name": null, "icon": null, - "id": "b5306673-63cc-4480-9ccf-50720d5c7cf3", + "id": "7f94ec1c-7ad9-42ee-8efe-ade93e45a23f", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -70,6 +70,45 @@ ] } }, + { + "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", @@ -82,7 +121,7 @@ "description": null, "display_name": null, "icon": null, - "id": "d832070a-8e9b-4486-9c41-f3d7cb839d73", + "id": "822879a8-5ee0-46c7-984d-b4efc9e70bcf", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -121,7 +160,7 @@ "description": null, "display_name": null, "icon": null, - "id": "ef0a50c3-a3d9-46ce-ad3a-1764bf706076", + "id": "a59a1652-653b-424e-8106-b19f938ac556", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -148,6 +187,45 @@ ] } }, + { + "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", @@ -161,7 +239,7 @@ "connection_timeout": 120, "dir": null, "env": null, - "id": "6377163b-c34e-4c2d-b397-dd6998cf8bd9", + "id": "6cddf19d-3caa-47dd-b4a8-6a6ac423caf2", "init_script": "", "login_before_ready": true, "metadata": [], @@ -171,7 +249,7 @@ "shutdown_script_timeout": 300, "startup_script": null, "startup_script_timeout": 300, - "token": "f7c1cc85-aa48-45f7-aed3-350e398337c1", + "token": "19f956f2-92b2-4fd9-8a89-ed3ec5c23716", "troubleshooting_url": null }, "sensitive_values": { @@ -186,7 +264,7 @@ "provider_name": "registry.terraform.io/hashicorp/null", "schema_version": 0, "values": { - "id": "4510022964714251508", + "id": "6499191613757287225", "triggers": null }, "sensitive_values": {}, diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf index c0a5896ba951c..65bd5594ec33f 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tf @@ -38,6 +38,26 @@ data "coder_parameter" "number_example_min_max" { } } +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" diff --git a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot index cd5ca07d57760..d609461299d9a 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot @@ -5,7 +5,9 @@ digraph { "[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"] @@ -13,14 +15,18 @@ digraph { "[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 bdd173bd81270..299c56f6be767 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.json @@ -127,7 +127,7 @@ "description": null, "display_name": null, "icon": null, - "id": "b1dedb7e-ec6a-4609-b893-53ed8a76cd5f", + "id": "62a57280-032d-4528-9705-c663e6971d9d", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -170,7 +170,7 @@ "description": null, "display_name": null, "icon": null, - "id": "bc1ef22b-c42d-4e7e-be75-c2d4f5382292", + "id": "37b849a7-1830-4662-b804-e23a6fb0a0dd", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -183,6 +183,43 @@ }, "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", @@ -195,7 +232,7 @@ "description": null, "display_name": null, "icon": null, - "id": "640894a3-79b5-4db6-a125-10272017853d", + "id": "826afb7f-80fe-4563-95d3-1f8da1f8c274", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -220,6 +257,43 @@ ] } }, + { + "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", @@ -232,7 +306,7 @@ "description": "blah blah", "display_name": null, "icon": null, - "id": "2927428f-d0fa-43e5-a5df-feb1b6d6b14c", + "id": "07dd798d-22fe-437d-ae78-2092d01f4b0b", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -343,6 +417,35 @@ }, "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", @@ -372,6 +475,35 @@ }, "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 cd5ca07d57760..d609461299d9a 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.dot @@ -5,7 +5,9 @@ digraph { "[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"] @@ -13,14 +15,18 @@ digraph { "[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 fc34cb118d9c0..b09aa22355773 100644 --- a/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json +++ b/provisioner/terraform/testdata/rich-parameters/rich-parameters.tfstate.json @@ -16,7 +16,7 @@ "description": null, "display_name": null, "icon": null, - "id": "9dd35b0f-25bd-47c4-ad7b-4cafa96e0b67", + "id": "5860f577-b0e7-4bb6-a4de-9de71a801ba0", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -59,7 +59,7 @@ "description": null, "display_name": null, "icon": null, - "id": "8e481590-e524-425a-b4d8-8095a4aa53fd", + "id": "ecac8658-4def-424a-a24e-0a8c906cf8e8", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -72,6 +72,43 @@ }, "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", @@ -84,7 +121,7 @@ "description": null, "display_name": null, "icon": null, - "id": "358374ab-c7dc-4469-984e-f603973ca00d", + "id": "a368fde8-b9ab-479f-92fb-776f4d5d3e53", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -109,6 +146,43 @@ ] } }, + { + "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", @@ -121,7 +195,7 @@ "description": "blah blah", "display_name": null, "icon": null, - "id": "ccea6ce0-e896-46bc-8b73-6b49cd8244be", + "id": "6a1fb6c7-eb4d-443b-9968-1813668794d0", "legacy_variable": null, "legacy_variable_name": null, "mutable": false, @@ -147,7 +221,7 @@ "connection_timeout": 120, "dir": null, "env": null, - "id": "37ab6539-e2cd-4986-8e2c-514dcae31d08", + "id": "9e190fb1-8087-4c64-b99d-1e0bd1067ed8", "init_script": "", "login_before_ready": true, "metadata": [], @@ -157,7 +231,7 @@ "shutdown_script_timeout": 300, "startup_script": null, "startup_script_timeout": 300, - "token": "0119680e-5f73-45ab-8f4d-9e409a20fcd7", + "token": "1e09aaa2-0700-4968-abbd-0b8ab8f9fefc", "troubleshooting_url": null }, "sensitive_values": { @@ -172,7 +246,7 @@ "provider_name": "registry.terraform.io/hashicorp/null", "schema_version": 0, "values": { - "id": "7099247595132877572", + "id": "7817924891856217249", "triggers": null }, "sensitive_values": {},