From 0da70696b950256be804636f61ace8da7803276f Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 2 Mar 2023 18:33:50 +0100 Subject: [PATCH 1/4] feat: mark coder_parameter as required --- docs/data-sources/parameter.md | 1 + .../resources/coder_parameter/resource.tf | 5 ++ provider/parameter.go | 13 ++++- provider/parameter_test.go | 58 +++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) diff --git a/docs/data-sources/parameter.md b/docs/data-sources/parameter.md index 70750742..2abf1aaf 100644 --- a/docs/data-sources/parameter.md +++ b/docs/data-sources/parameter.md @@ -32,6 +32,7 @@ Use this data source to configure editable options for workspaces. ### Read-Only - `id` (String) The ID of this resource. +- `required` (Boolean) Whether this value is required. - `value` (String) The output value of the parameter. diff --git a/examples/resources/coder_parameter/resource.tf b/examples/resources/coder_parameter/resource.tf index 248831bc..579e0735 100644 --- a/examples/resources/coder_parameter/resource.tf +++ b/examples/resources/coder_parameter/resource.tf @@ -70,3 +70,8 @@ data "coder_parameter" "cat_lives" { monotonic = "decreasing" } } + +data "coder_parameter" "fairy_tale" { + name = "Fairy Tale" + type = "string" +} diff --git a/provider/parameter.go b/provider/parameter.go index 8df71221..3cafc665 100644 --- a/provider/parameter.go +++ b/provider/parameter.go @@ -48,6 +48,7 @@ type Parameter struct { Icon string Option []Option Validation []Validation + Required bool } func parameterDataSource() *schema.Resource { @@ -67,6 +68,7 @@ func parameterDataSource() *schema.Resource { Icon interface{} Option interface{} Validation interface{} + Required interface{} }{ Value: rd.Get("value"), Name: rd.Get("name"), @@ -77,6 +79,11 @@ func parameterDataSource() *schema.Resource { Icon: rd.Get("icon"), Option: rd.Get("option"), Validation: rd.Get("validation"), + Required: func() bool { + val := rd.GetRawConfig().AsValueMap()["default"].IsNull() + rd.Set("required", val) + return val + }(), }, ¶meter) if err != nil { return diag.Errorf("decode parameter: %s", err) @@ -130,7 +137,6 @@ func parameterDataSource() *schema.Resource { } } } - return nil }, Schema: map[string]*schema.Schema{ @@ -268,6 +274,11 @@ func parameterDataSource() *schema.Resource { }, }, }, + "required": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether this value is required.", + }, }, } } diff --git a/provider/parameter_test.go b/provider/parameter_test.go index ebb93988..c5301a64 100644 --- a/provider/parameter_test.go +++ b/provider/parameter_test.go @@ -266,6 +266,64 @@ data "coder_parameter" "region" { } `, ExpectError: regexp.MustCompile("cannot have the same value"), + }, { + Name: "RequiredParameterNoDefault", + Config: ` +data "coder_parameter" "region" { + name = "Region" + type = "string" +}`, + Check: func(state *terraform.ResourceState) { + for key, expected := range map[string]string{ + "name": "Region", + "type": "string", + "required": "true", + } { + require.Equal(t, expected, state.Primary.Attributes[key]) + } + }, + }, { + Name: "RequiredParameterDefaultNull", + Config: ` +data "coder_parameter" "region" { + name = "Region" + type = "string" + default = null +}`, + Check: func(state *terraform.ResourceState) { + for key, expected := range map[string]string{ + "name": "Region", + "type": "string", + "required": "true", + } { + require.Equal(t, expected, state.Primary.Attributes[key]) + } + }, + }, { + Name: "RequiredParameterDefaultEmpty", + Config: ` +data "coder_parameter" "region" { + name = "Region" + type = "string" + default = "" +}`, + Check: func(state *terraform.ResourceState) { + for key, expected := range map[string]string{ + "name": "Region", + "type": "string", + "required": "false", + } { + require.Equal(t, expected, state.Primary.Attributes[key]) + } + }, + }, { + Name: "RequiredParameterDefaultEmpty", + Config: ` +data "coder_parameter" "region" { + name = "Region" + type = "string" + default = "us-east-1" +}`, }} { tc := tc t.Run(tc.Name, func(t *testing.T) { From 183dc43fdf29d2ee64b588d0c39c5dcc4fd0c9fe Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 2 Mar 2023 18:35:29 +0100 Subject: [PATCH 2/4] Comment --- provider/parameter.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/provider/parameter.go b/provider/parameter.go index 3cafc665..4c62392a 100644 --- a/provider/parameter.go +++ b/provider/parameter.go @@ -80,6 +80,9 @@ func parameterDataSource() *schema.Resource { Option: rd.Get("option"), Validation: rd.Get("validation"), Required: func() bool { + // This hack allows for checking if the "default" field is present in the .tf file. + // If "default" is missing or is "null", then it means that this field is required, + // and user must provide a value for it. val := rd.GetRawConfig().AsValueMap()["default"].IsNull() rd.Set("required", val) return val From 02e9c5beb1dc36e8ac48db1b8c4824a529a05a8c Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Fri, 3 Mar 2023 14:24:31 +0100 Subject: [PATCH 3/4] Replace required with optional --- docs/data-sources/parameter.md | 2 +- provider/parameter.go | 14 +++++++------- provider/parameter_test.go | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/data-sources/parameter.md b/docs/data-sources/parameter.md index 2abf1aaf..51d95262 100644 --- a/docs/data-sources/parameter.md +++ b/docs/data-sources/parameter.md @@ -32,7 +32,7 @@ Use this data source to configure editable options for workspaces. ### Read-Only - `id` (String) The ID of this resource. -- `required` (Boolean) Whether this value is required. +- `optional` (Boolean) Whether this value is optional. - `value` (String) The output value of the parameter. diff --git a/provider/parameter.go b/provider/parameter.go index 4c62392a..e839f7ba 100644 --- a/provider/parameter.go +++ b/provider/parameter.go @@ -48,7 +48,7 @@ type Parameter struct { Icon string Option []Option Validation []Validation - Required bool + Optional bool } func parameterDataSource() *schema.Resource { @@ -68,7 +68,7 @@ func parameterDataSource() *schema.Resource { Icon interface{} Option interface{} Validation interface{} - Required interface{} + Optional interface{} }{ Value: rd.Get("value"), Name: rd.Get("name"), @@ -79,12 +79,12 @@ func parameterDataSource() *schema.Resource { Icon: rd.Get("icon"), Option: rd.Get("option"), Validation: rd.Get("validation"), - Required: func() bool { + Optional: func() bool { // This hack allows for checking if the "default" field is present in the .tf file. // If "default" is missing or is "null", then it means that this field is required, // and user must provide a value for it. - val := rd.GetRawConfig().AsValueMap()["default"].IsNull() - rd.Set("required", val) + val := !rd.GetRawConfig().AsValueMap()["default"].IsNull() + rd.Set("optional", val) return val }(), }, ¶meter) @@ -277,10 +277,10 @@ func parameterDataSource() *schema.Resource { }, }, }, - "required": { + "optional": { Type: schema.TypeBool, Computed: true, - Description: "Whether this value is required.", + Description: "Whether this value is optional.", }, }, } diff --git a/provider/parameter_test.go b/provider/parameter_test.go index c5301a64..81ed6981 100644 --- a/provider/parameter_test.go +++ b/provider/parameter_test.go @@ -277,13 +277,13 @@ data "coder_parameter" "region" { for key, expected := range map[string]string{ "name": "Region", "type": "string", - "required": "true", + "optional": "false", } { require.Equal(t, expected, state.Primary.Attributes[key]) } }, }, { - Name: "RequiredParameterDefaultNull", + Name: "OptionalParameterDefaultNull", Config: ` data "coder_parameter" "region" { name = "Region" @@ -294,13 +294,13 @@ data "coder_parameter" "region" { for key, expected := range map[string]string{ "name": "Region", "type": "string", - "required": "true", + "optional": "false", } { require.Equal(t, expected, state.Primary.Attributes[key]) } }, }, { - Name: "RequiredParameterDefaultEmpty", + Name: "OptionalParameterDefaultEmpty", Config: ` data "coder_parameter" "region" { name = "Region" @@ -311,7 +311,7 @@ data "coder_parameter" "region" { for key, expected := range map[string]string{ "name": "Region", "type": "string", - "required": "false", + "optional": "true", } { require.Equal(t, expected, state.Primary.Attributes[key]) } From f5d25514d929bb0ebb79b3a638d307974cc7a2a0 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Fri, 3 Mar 2023 14:26:38 +0100 Subject: [PATCH 4/4] fix --- provider/parameter_test.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/provider/parameter_test.go b/provider/parameter_test.go index 81ed6981..d7a3c68c 100644 --- a/provider/parameter_test.go +++ b/provider/parameter_test.go @@ -283,7 +283,7 @@ data "coder_parameter" "region" { } }, }, { - Name: "OptionalParameterDefaultNull", + Name: "RequiredParameterDefaultNull", Config: ` data "coder_parameter" "region" { name = "Region" @@ -317,13 +317,22 @@ data "coder_parameter" "region" { } }, }, { - Name: "RequiredParameterDefaultEmpty", + Name: "OptionalParameterDefaultNotEmpty", Config: ` data "coder_parameter" "region" { name = "Region" type = "string" default = "us-east-1" }`, + Check: func(state *terraform.ResourceState) { + for key, expected := range map[string]string{ + "name": "Region", + "type": "string", + "optional": "true", + } { + require.Equal(t, expected, state.Primary.Attributes[key]) + } + }, }} { tc := tc t.Run(tc.Name, func(t *testing.T) {