From 5b1226d34b41ef52afbc231bf2d3cd543cd636ff Mon Sep 17 00:00:00 2001 From: Kira-Pilot Date: Tue, 21 Nov 2023 22:21:08 +0000 Subject: [PATCH 1/2] fix: add error detail for duplicate agent metadata key --- provider/agent.go | 14 ++++++++++++++ provider/agent_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/provider/agent.go b/provider/agent.go index 9b5ac3f3..d188e520 100644 --- a/provider/agent.go +++ b/provider/agent.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "golang.org/x/xerrors" ) func agentResource() *schema.Resource { @@ -38,6 +39,19 @@ func agentResource() *schema.Resource { return diag.FromErr(err) } } + + rawPlan := resourceData.GetRawPlan() + items := rawPlan.GetAttr("metadata").AsValueSlice() + itemKeys := map[string]struct{}{} + for _, item := range items { + key := valueAsString(item.GetAttr("key")) + _, exists := itemKeys[key] + if exists { + return errorAsDiagnostics(xerrors.Errorf("duplicate agent metadata key %q", key)) + } + itemKeys[key] = struct{}{} + } + return updateInitScript(resourceData, i) }, ReadWithoutTimeout: func(ctx context.Context, resourceData *schema.ResourceData, i interface{}) diag.Diagnostics { diff --git a/provider/agent_test.go b/provider/agent_test.go index 9026385c..a68b6580 100644 --- a/provider/agent_test.go +++ b/provider/agent_test.go @@ -250,6 +250,42 @@ func TestAgent_Metadata(t *testing.T) { }) } +func TestAgent_MetadataDuplicateKeys(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + Providers: map[string]*schema.Provider{ + "coder": provider.New(), + }, + IsUnitTest: true, + Steps: []resource.TestStep{{ + Config: ` + provider "coder" { + url = "https://example.com" + } + resource "coder_agent" "dev" { + os = "linux" + arch = "amd64" + metadata { + key = "process_count" + display_name = "Process Count" + script = "ps aux | wc -l" + interval = 5 + timeout = 1 + } + metadata { + key = "process_count" + display_name = "Process Count" + script = "ps aux | wc -l" + interval = 5 + timeout = 1 + } + } + `, + ExpectError: regexp.MustCompile("duplicate agent metadata key"), + }}, + }) +} + func TestAgent_DisplayApps(t *testing.T) { t.Parallel() t.Run("OK", func(t *testing.T) { From 9d5b5ef26e4d4c6cdf27cf391dda6eb332f4a1b1 Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Wed, 22 Nov 2023 07:47:19 -0500 Subject: [PATCH 2/2] Update provider/agent.go Co-authored-by: Mathias Fredriksson --- provider/agent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/agent.go b/provider/agent.go index d188e520..4ba3f706 100644 --- a/provider/agent.go +++ b/provider/agent.go @@ -47,7 +47,7 @@ func agentResource() *schema.Resource { key := valueAsString(item.GetAttr("key")) _, exists := itemKeys[key] if exists { - return errorAsDiagnostics(xerrors.Errorf("duplicate agent metadata key %q", key)) + return diag.FromErr(xerrors.Errorf("duplicate agent metadata key %q", key)) } itemKeys[key] = struct{}{} }