From 234129b8186fa90ce6abfceb89d91233fd8a2ef6 Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Thu, 31 Jul 2025 12:37:57 +0000 Subject: [PATCH 1/2] add coder_external_agent resource --- docs/resources/external_agent.md | 24 +++++++++++++++++++ provider/external_agent.go | 32 +++++++++++++++++++++++++ provider/external_agent_test.go | 41 ++++++++++++++++++++++++++++++++ provider/provider.go | 1 + 4 files changed, 98 insertions(+) create mode 100644 docs/resources/external_agent.md create mode 100644 provider/external_agent.go create mode 100644 provider/external_agent_test.go diff --git a/docs/resources/external_agent.md b/docs/resources/external_agent.md new file mode 100644 index 00000000..942bd670 --- /dev/null +++ b/docs/resources/external_agent.md @@ -0,0 +1,24 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "coder_external_agent Resource - terraform-provider-coder" +subcategory: "" +description: |- + Define an external agent to be used in a workspace. +--- + +# coder_external_agent (Resource) + +Define an external agent to be used in a workspace. + + + + +## Schema + +### Required + +- `token` (String, Sensitive) Set the environment variable `CODER_AGENT_TOKEN` with this token to authenticate an agent. + +### Read-Only + +- `id` (String) The ID of this resource. diff --git a/provider/external_agent.go b/provider/external_agent.go new file mode 100644 index 00000000..0bcc78a8 --- /dev/null +++ b/provider/external_agent.go @@ -0,0 +1,32 @@ +package provider + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func externalAgentResource() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Description: "Define an external agent to be used in a workspace.", + CreateContext: func(ctx context.Context, rd *schema.ResourceData, _ interface{}) diag.Diagnostics { + rd.SetId(uuid.NewString()) + return nil + }, + ReadContext: schema.NoopContext, + DeleteContext: schema.NoopContext, + Schema: map[string]*schema.Schema{ + "token": { + ForceNew: true, + Required: true, + Sensitive: true, + Description: "Set the environment variable `CODER_AGENT_TOKEN` with this token to authenticate an agent.", + Type: schema.TypeString, + }, + }, + } +} diff --git a/provider/external_agent_test.go b/provider/external_agent_test.go new file mode 100644 index 00000000..c043e07f --- /dev/null +++ b/provider/external_agent_test.go @@ -0,0 +1,41 @@ +package provider_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/stretchr/testify/require" +) + +func TestExternalAgent(t *testing.T) { + t.Parallel() + + t.Run("OK", func(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + ProviderFactories: coderFactory(), + IsUnitTest: true, + Steps: []resource.TestStep{{ + Config: ` + provider "coder" { + } + + resource "coder_external_agent" "main" { + token = "token" + } + `, + Check: func(state *terraform.State) error { + require.Len(t, state.Modules, 1) + resource := state.Modules[0].Resources["coder_external_agent.main"] + require.NotNil(t, resource) + value := resource.Primary.Attributes["token"] + require.NotNil(t, value) + require.Greater(t, len(value), 0) + return nil + }, + }}, + }) + }) +} diff --git a/provider/provider.go b/provider/provider.go index a0ef63f9..5a2f1972 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -74,6 +74,7 @@ func New() *schema.Provider { "coder_script": scriptResource(), "coder_env": envResource(), "coder_devcontainer": devcontainerResource(), + "coder_external_agent": externalAgentResource(), }, } } From f6861691d772b9ec2a8560e4ab1ed226b8dc648f Mon Sep 17 00:00:00 2001 From: Kacper Sawicki Date: Wed, 6 Aug 2025 08:54:03 +0000 Subject: [PATCH 2/2] Change token to agent_id --- docs/resources/external_agent.md | 2 +- provider/external_agent.go | 7 +++---- provider/external_agent_test.go | 22 +++++++++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/docs/resources/external_agent.md b/docs/resources/external_agent.md index 942bd670..b6d0b8ae 100644 --- a/docs/resources/external_agent.md +++ b/docs/resources/external_agent.md @@ -17,7 +17,7 @@ Define an external agent to be used in a workspace. ### Required -- `token` (String, Sensitive) Set the environment variable `CODER_AGENT_TOKEN` with this token to authenticate an agent. +- `agent_id` (String) The `id` property of a `coder_agent` resource to associate with. ### Read-Only diff --git a/provider/external_agent.go b/provider/external_agent.go index 0bcc78a8..2856c2bf 100644 --- a/provider/external_agent.go +++ b/provider/external_agent.go @@ -20,12 +20,11 @@ func externalAgentResource() *schema.Resource { ReadContext: schema.NoopContext, DeleteContext: schema.NoopContext, Schema: map[string]*schema.Schema{ - "token": { + "agent_id": { + Type: schema.TypeString, + Description: "The `id` property of a `coder_agent` resource to associate with.", ForceNew: true, Required: true, - Sensitive: true, - Description: "Set the environment variable `CODER_AGENT_TOKEN` with this token to authenticate an agent.", - Type: schema.TypeString, }, }, } diff --git a/provider/external_agent_test.go b/provider/external_agent_test.go index c043e07f..f0638b45 100644 --- a/provider/external_agent_test.go +++ b/provider/external_agent_test.go @@ -21,18 +21,26 @@ func TestExternalAgent(t *testing.T) { Config: ` provider "coder" { } + + resource "coder_agent" "dev" { + os = "linux" + arch = "amd64" + } - resource "coder_external_agent" "main" { - token = "token" + resource "coder_external_agent" "dev" { + agent_id = coder_agent.dev.id } `, Check: func(state *terraform.State) error { require.Len(t, state.Modules, 1) - resource := state.Modules[0].Resources["coder_external_agent.main"] - require.NotNil(t, resource) - value := resource.Primary.Attributes["token"] - require.NotNil(t, value) - require.Greater(t, len(value), 0) + require.Len(t, state.Modules[0].Resources, 2) + + agentResource := state.Modules[0].Resources["coder_agent.dev"] + require.NotNil(t, agentResource) + externalAgentResource := state.Modules[0].Resources["coder_external_agent.dev"] + require.NotNil(t, externalAgentResource) + + require.Equal(t, agentResource.Primary.Attributes["id"], externalAgentResource.Primary.Attributes["agent_id"]) return nil }, }},