Skip to content

Commit 37908cf

Browse files
committed
feat: add coder_ai_task_prompt data source
1 parent e0b1ec1 commit 37908cf

File tree

7 files changed

+161
-7
lines changed

7 files changed

+161
-7
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "coder_ai_task_prompt Data Source - terraform-provider-coder"
4+
subcategory: ""
5+
description: |-
6+
Use this data source to read information about Coder tasks.
7+
---
8+
9+
# coder_ai_task_prompt (Data Source)
10+
11+
Use this data source to read information about Coder tasks.
12+
13+
14+
15+
<!-- schema generated by tfplugindocs -->
16+
## Schema
17+
18+
### Read-Only
19+
20+
- `enabled` (Boolean) True when executing in a Coder Task context, false when in a Coder Workspace context
21+
- `id` (String) The UUID of the task, if executing in a Coder Task context. Empty in a Coder Workspace context.
22+
- `value` (String) The prompt text provided to the task by Coder, if executing in a Coder Task context. Empty in a Coder Workspace context.

integration/coder-ai-task/main.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ data "coder_parameter" "ai_prompt" {
3232
mutable = true
3333
}
3434

35+
data "coder_ai_task_prompt" "me" {}
36+
3537
resource "coder_ai_task" "task" {
3638
sidebar_app {
3739
id = coder_app.ai_interface.id
@@ -46,6 +48,10 @@ locals {
4648
"ai_task.prompt" = coder_ai_task.task.prompt
4749
"ai_task.enabled" = tostring(coder_ai_task.task.enabled)
4850
"app.id" = coder_app.ai_interface.id
51+
52+
"ai_task_prompt.id" = data.coder_ai_task_prompt.me.id
53+
"ai_task_prompt.value" = data.coder_ai_task_prompt.me.value
54+
"ai_task_prompt.enabled" = tostring(data.coder_ai_task_prompt.me.enabled)
4955
}
5056
}
5157

integration/integration_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,15 +215,17 @@ func TestIntegration(t *testing.T) {
215215
name: "coder-ai-task",
216216
minVersion: "v2.26.0",
217217
expectedOutput: map[string]string{
218-
"ai_task.id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
219-
"ai_task.prompt": "",
220-
"ai_task.app_id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
221-
"ai_task.enabled": "false",
222-
"app.id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
218+
"ai_task.id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
219+
"ai_task.prompt": "",
220+
"ai_task.app_id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
221+
"ai_task.enabled": "false",
222+
"app.id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
223+
"ai_task_prompt.id": `^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`,
224+
"ai_task_prompt.value": "",
225+
"ai_task_prompt.enabled": "false",
223226
},
224227
},
225228
} {
226-
tt := tt
227229
t.Run(tt.name, func(t *testing.T) {
228230
t.Parallel()
229231
if coderVersion != "latest" && semver.Compare(coderVersion, tt.minVersion) < 0 {

provider/ai_task.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,44 @@ func aiTaskResource() *schema.Resource {
115115
},
116116
}
117117
}
118+
119+
func aiTaskPromptDatasource() *schema.Resource {
120+
return &schema.Resource{
121+
Description: "Use this data source to read information about Coder tasks.",
122+
ReadContext: func(ctx context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
123+
diags := diag.Diagnostics{}
124+
125+
idStr := os.Getenv("CODER_TASK_ID")
126+
if idStr == "" || idStr == uuid.Nil.String() {
127+
rd.SetId(uuid.NewString())
128+
_ = rd.Set("enabled", false)
129+
} else if _, err := uuid.Parse(idStr); err == nil {
130+
rd.SetId(idStr)
131+
_ = rd.Set("enabled", true)
132+
} else { // invalid UUID
133+
diags = append(diags, errorAsDiagnostics(err)...)
134+
}
135+
136+
prompt := os.Getenv("CODER_TASK_PROMPT")
137+
_ = rd.Set("value", prompt)
138+
return diags
139+
},
140+
Schema: map[string]*schema.Schema{
141+
"id": {
142+
Type: schema.TypeString,
143+
Computed: true,
144+
Description: "The UUID of the task, if executing in a Coder Task context. Empty in a Coder Workspace context.",
145+
},
146+
"value": {
147+
Type: schema.TypeString,
148+
Computed: true,
149+
Description: "The prompt text provided to the task by Coder, if executing in a Coder Task context. Empty in a Coder Workspace context.",
150+
},
151+
"enabled": {
152+
Type: schema.TypeBool,
153+
Computed: true,
154+
Description: "True when executing in a Coder Task context, false when in a Coder Workspace context",
155+
},
156+
},
157+
}
158+
}

provider/ai_task_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"regexp"
55
"testing"
66

7+
"github.com/google/uuid"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
910
"github.com/stretchr/testify/require"
@@ -214,3 +215,83 @@ func TestAITask(t *testing.T) {
214215
})
215216
})
216217
}
218+
219+
func TestAITaskPromptDatasource(t *testing.T) {
220+
t.Run("Exists", func(t *testing.T) {
221+
t.Setenv("CODER_TASK_ID", "7d8d4c2e-fb57-44f9-a183-22509819c2e7")
222+
t.Setenv("CODER_TASK_PROMPT", "some task prompt")
223+
resource.Test(t, resource.TestCase{
224+
ProviderFactories: coderFactory(),
225+
IsUnitTest: true,
226+
Steps: []resource.TestStep{{
227+
Config: `
228+
provider "coder" {}
229+
data "coder_ai_task_prompt" "me" {}
230+
`,
231+
Check: func(s *terraform.State) error {
232+
require.Len(t, s.Modules, 1)
233+
require.Len(t, s.Modules[0].Resources, 1)
234+
resource := s.Modules[0].Resources["data.coder_ai_task_prompt.me"]
235+
require.NotNil(t, resource)
236+
237+
taskID := resource.Primary.Attributes["id"]
238+
require.Equal(t, "7d8d4c2e-fb57-44f9-a183-22509819c2e7", taskID)
239+
240+
taskPromptValue := resource.Primary.Attributes["value"]
241+
require.Equal(t, "some task prompt", taskPromptValue)
242+
243+
enabledValue := resource.Primary.Attributes["enabled"]
244+
require.Equal(t, "true", enabledValue)
245+
return nil
246+
},
247+
}},
248+
})
249+
})
250+
251+
t.Run("NotExists", func(t *testing.T) {
252+
resource.Test(t, resource.TestCase{
253+
ProviderFactories: coderFactory(),
254+
IsUnitTest: true,
255+
Steps: []resource.TestStep{{
256+
Config: `
257+
provider "coder" {}
258+
data "coder_ai_task_prompt" "me" {}
259+
`,
260+
Check: func(s *terraform.State) error {
261+
require.Len(t, s.Modules, 1)
262+
require.Len(t, s.Modules[0].Resources, 1)
263+
resource := s.Modules[0].Resources["data.coder_ai_task_prompt.me"]
264+
require.NotNil(t, resource)
265+
266+
taskID := resource.Primary.Attributes["id"]
267+
require.NotEmpty(t, taskID)
268+
require.NotEqual(t, uuid.Nil.String(), taskID)
269+
_, err := uuid.Parse(taskID)
270+
require.NoError(t, err)
271+
272+
taskPromptValue := resource.Primary.Attributes["value"]
273+
require.Empty(t, taskPromptValue)
274+
275+
enabledValue := resource.Primary.Attributes["enabled"]
276+
require.Equal(t, "false", enabledValue)
277+
return nil
278+
},
279+
}},
280+
})
281+
})
282+
283+
t.Run("InvalidTaskID", func(t *testing.T) {
284+
t.Setenv("CODER_TASK_ID", "not a valid UUID")
285+
resource.Test(t, resource.TestCase{
286+
ProviderFactories: coderFactory(),
287+
IsUnitTest: true,
288+
Steps: []resource.TestStep{{
289+
Config: `
290+
provider "coder" {}
291+
data "coder_ai_task_prompt" "me" {}
292+
`,
293+
ExpectError: regexp.MustCompile(`invalid UUID`),
294+
}},
295+
})
296+
})
297+
}

provider/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func New() *schema.Provider {
6464
"coder_external_auth": externalAuthDataSource(),
6565
"coder_workspace_owner": workspaceOwnerDataSource(),
6666
"coder_workspace_preset": workspacePresetDataSource(),
67+
"coder_ai_task_prompt": aiTaskPromptDatasource(),
6768
},
6869
ResourcesMap: map[string]*schema.Resource{
6970
"coder_agent": agentResource(),

provider/provider_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ func TestProviderEmpty(t *testing.T) {
3737
}
3838
data "coder_parameter" "param" {
3939
name = "hey"
40-
}`,
40+
}
41+
data "coder_ai_task_prompt" "me" {}`,
4142
Check: func(state *terraform.State) error {
4243
return nil
4344
},

0 commit comments

Comments
 (0)