Skip to content

Commit ac6e71f

Browse files
List Agent Versions (#1396)
* added list agent versions * updated prev tests * updated file structure * fmt * resolved comments * updated spec * typo * type fix * fix --------- Co-authored-by: anup-deka <adeka@digitalocean.com>
1 parent 74b9c0d commit ac6e71f

11 files changed

Lines changed: 695 additions & 232 deletions

File tree

digitalocean/genai/datasource_agent_test.go

Lines changed: 86 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"regexp"
7+
"strings"
78
"testing"
89

910
"github.com/digitalocean/godo"
@@ -13,37 +14,10 @@ import (
1314
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1415
)
1516

16-
func TestAccDataSourceDigitalOceanAgent_BasicByAgentID(t *testing.T) {
17-
var agent godo.Agent
18-
agentName := acceptance.RandomTestName()
19-
resourceConfig := testAccCheckDataSourceDigitalOceanAgentConfig_basic(agentName)
20-
dataSourceConfig := `
21-
data "digitalocean_agent" "foobar" {
22-
agent_id = digitalocean_agent.foo.agent_id
23-
}`
24-
25-
resource.ParallelTest(t, resource.TestCase{
26-
PreCheck: func() { acceptance.TestAccPreCheck(t) },
27-
ProviderFactories: acceptance.TestAccProviderFactories,
28-
Steps: []resource.TestStep{
29-
{
30-
Config: resourceConfig,
31-
},
32-
{
33-
Config: resourceConfig + dataSourceConfig,
34-
Check: resource.ComposeTestCheckFunc(
35-
testAccCheckDataSourceDigitalOceanAgentExists("data.digitalocean_agent.foobar", &agent),
36-
resource.TestCheckResourceAttr(
37-
"data.digitalocean_agent.foobar", "name", agentName),
38-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "agent_id"),
39-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "uuid"),
40-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "created_at"),
41-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "updated_at"),
42-
),
43-
},
44-
},
45-
})
46-
}
17+
const (
18+
initialInstr = "You are a helpful AI assistant."
19+
updatedInstr = "You are an even more helpful AI assistant (v2)."
20+
)
4721

4822
func TestAccDataSourceDigitalOceanAgent_CompleteConfiguration(t *testing.T) {
4923
var agent godo.Agent
@@ -56,8 +30,8 @@ func TestAccDataSourceDigitalOceanAgent_CompleteConfiguration(t *testing.T) {
5630

5731
resourceConfig := testAccCheckDataSourceDigitalOceanAgentConfig_complete(name, description, instruction, model_uuid, project_id, region)
5832
dataSourceConfig := `
59-
data "digitalocean_agent" "foobar" {
60-
agent_id = digitalocean_agent.foo.agent_id
33+
data "digitalocean_genai_agent" "foobar" {
34+
agent_id = digitalocean_genai_agent.foo.agent_id
6135
}`
6236

6337
resource.ParallelTest(t, resource.TestCase{
@@ -70,19 +44,19 @@ data "digitalocean_agent" "foobar" {
7044
{
7145
Config: resourceConfig + dataSourceConfig,
7246
Check: resource.ComposeTestCheckFunc(
73-
testAccCheckDataSourceDigitalOceanAgentExists("data.digitalocean_agent.foobar", &agent),
47+
testAccCheckDataSourceDigitalOceanAgentExists("data.digitalocean_genai_agent.foobar", &agent),
7448
resource.TestCheckResourceAttr(
75-
"data.digitalocean_agent.foobar", "name", name),
49+
"data.digitalocean_genai_agent.foobar", "name", name),
7650
resource.TestCheckResourceAttr(
77-
"data.digitalocean_agent.foobar", "description", description),
51+
"data.digitalocean_genai_agent.foobar", "description", description),
7852
resource.TestCheckResourceAttr(
79-
"data.digitalocean_agent.foobar", "instruction", instruction),
53+
"data.digitalocean_genai_agent.foobar", "instruction", instruction),
8054
resource.TestCheckResourceAttr(
81-
"data.digitalocean_agent.foobar", "model_uuid", model_uuid),
82-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "agent_id"),
83-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "uuid"),
84-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "created_at"),
85-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "updated_at"),
55+
"data.digitalocean_genai_agent.foobar", "model_uuid", model_uuid),
56+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "agent_id"),
57+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "uuid"),
58+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "created_at"),
59+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "updated_at"),
8660
),
8761
},
8862
},
@@ -96,8 +70,8 @@ func TestAccDataSourceDigitalOceanAgent_WithTags(t *testing.T) {
9670

9771
resourceConfig := testAccCheckDataSourceDigitalOceanAgentConfig_withTags(agentName, tagName)
9872
dataSourceConfig := `
99-
data "digitalocean_agent" "foobar" {
100-
agent_id = digitalocean_agent.foo.agent_id
73+
data "digitalocean_genai_agent" "foobar" {
74+
agent_id = digitalocean_genai_agent.foo.agent_id
10175
}`
10276

10377
resource.ParallelTest(t, resource.TestCase{
@@ -110,15 +84,15 @@ data "digitalocean_agent" "foobar" {
11084
{
11185
Config: resourceConfig + dataSourceConfig,
11286
Check: resource.ComposeTestCheckFunc(
113-
testAccCheckDataSourceDigitalOceanAgentExists("data.digitalocean_agent.foobar", &agent),
87+
testAccCheckDataSourceDigitalOceanAgentExists("data.digitalocean_genai_agent.foobar", &agent),
11488
resource.TestCheckResourceAttr(
115-
"data.digitalocean_agent.foobar", "name", agentName),
89+
"data.digitalocean_genai_agent.foobar", "name", agentName),
11690
resource.TestCheckResourceAttr(
117-
"data.digitalocean_agent.foobar", "tags.#", "1"),
118-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "agent_id"),
119-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "uuid"),
120-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "created_at"),
121-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "updated_at"),
91+
"data.digitalocean_genai_agent.foobar", "tags.#", "1"),
92+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "agent_id"),
93+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "uuid"),
94+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "created_at"),
95+
resource.TestCheckResourceAttrSet("data.digitalocean_genai_agent.foobar", "updated_at"),
12296
),
12397
},
12498
},
@@ -172,95 +146,109 @@ func testAccCheckDataSourceDigitalOceanAgentExists(n string, agent *godo.Agent)
172146
}
173147
}
174148

175-
func testAccCheckDataSourceDigitalOceanAgentConfig_basic(name string) string {
176-
return fmt.Sprintf(`
177-
resource "digitalocean_agent" "foo" {
178-
name = "%s"
179-
description = "Basic test agent"
180-
instruction = "You are a test assistant."
181-
model_uuid = "%s"
182-
}`, name, defaultModelUUID)
183-
}
184-
185149
func testAccCheckDataSourceDigitalOceanAgentConfig_complete(name, description, instruction, model_uuid, project_id, region string) string {
186150
return fmt.Sprintf(`
187-
resource "digitalocean_agent" "foo" {
151+
resource "digitalocean_genai_agent" "foo" {
188152
name = "%s"
189-
description = "%s"
190153
instruction = "%s"
191-
model = "%s"
154+
description = "%s"
192155
model_uuid = "%s"
193156
project_id = "%s"
194157
region = "tor1"
195158
196-
}`, name, description, instruction, model_uuid, project_id, region)
159+
}`, name, instruction, description, model_uuid, project_id)
197160
}
198161

199162
func testAccCheckDataSourceDigitalOceanAgentConfig_withTags(name, tagName string) string {
200163
return fmt.Sprintf(`
201-
resource "digitalocean_tag" "foo" {
202-
name = "%s"
203-
}
204-
205-
resource "digitalocean_agent" "foo" {
164+
resource "digitalocean_genai_agent" "foo" {
206165
name = "%s"
207-
description = "Test agent with tags"
208166
instruction = "You are a tagged test assistant."
167+
description = "Test agent with tags"
209168
model_uuid = "%s"
210-
tags = [digitalocean_tag.foo.id]
211-
}`, tagName, name, defaultModelUUID)
169+
project_id = "%s"
170+
region = "tor1"
171+
tags = ["%s"]
172+
}`, name, defaultProjecID, defaultModelUUID, tagName)
212173
}
213174

214175
func testAccCheckDataSourceDigitalOceanAgentConfig_nonExistent() string {
215176
return `
216-
data "digitalocean_agent" "foobar" {
177+
data "digitalocean_genai_agent" "foobar" {
217178
agent_id = "non-existent-agent-id-12345"
218179
}`
219180
}
220181

221-
func TestAccDataSourceDigitalOceanAgent_WithKnowledgeBase(t *testing.T) {
222-
var agent godo.Agent
223-
agentName := acceptance.RandomTestName()
224-
resourceConfig := testAccCheckDataSourceDigitalOceanAgentConfig_withKnowledgeBase(agentName)
225-
dataSourceConfig := `
226-
data "digitalocean_agent" "foobar" {
227-
agent_id = digitalocean_agent.foo.agent_id
182+
func TestAccDataSourceDigitalOceanAgentVersions_Lifecycle(t *testing.T) {
183+
name := acceptance.RandomTestName() + "-agent"
184+
185+
createCfg := testAccAgentConfig(name, initialInstr)
186+
updateCfg := testAccAgentConfig(name, updatedInstr)
187+
188+
const dsCfg = `
189+
data "digitalocean_genai_agent_versions" "versions" {
190+
agent_id = digitalocean_genai_agent.foo.id
228191
}`
229192

230193
resource.ParallelTest(t, resource.TestCase{
231194
PreCheck: func() { acceptance.TestAccPreCheck(t) },
232195
ProviderFactories: acceptance.TestAccProviderFactories,
196+
233197
Steps: []resource.TestStep{
198+
{Config: createCfg},
199+
234200
{
235-
Config: resourceConfig,
201+
Config: createCfg + dsCfg,
202+
Check: resource.ComposeTestCheckFunc(
203+
resource.TestCheckResourceAttr("data.digitalocean_genai_agent_versions.versions",
204+
"agent_versions.#", "1"),
205+
checkExactlyOneApplied("data.digitalocean_genai_agent_versions.versions"),
206+
),
236207
},
237208
{
238-
Config: resourceConfig + dataSourceConfig,
209+
Config: updateCfg + dsCfg,
239210
Check: resource.ComposeTestCheckFunc(
240-
testAccCheckDataSourceDigitalOceanAgentExists("data.digitalocean_agent.foobar", &agent),
241-
resource.TestCheckResourceAttr(
242-
"data.digitalocean_agent.foobar", "name", agentName),
211+
resource.TestCheckResourceAttr("data.digitalocean_genai_agent_versions.versions",
212+
"agent_versions.#", "2"),
213+
checkExactlyOneApplied("data.digitalocean_genai_agent_versions.versions"),
243214
resource.TestCheckResourceAttr(
244-
"data.digitalocean_agent.foobar", "knowledge_base.#", "1"),
245-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "agent_id"),
246-
resource.TestCheckResourceAttrSet("data.digitalocean_agent.foobar", "uuid"),
215+
"data.digitalocean_genai_agent_versions.versions",
216+
"agent_versions.0.instruction", updatedInstr),
247217
),
248218
},
219+
{Config: updateCfg},
249220
},
250221
})
251222
}
252223

253-
func testAccCheckDataSourceDigitalOceanAgentConfig_withKnowledgeBase(name string) string {
224+
func testAccAgentConfig(name, instruction string) string {
254225
return fmt.Sprintf(`
255-
resource "digitalocean_agent" "foo" {
226+
227+
resource "digitalocean_genai_agent" "foo" {
256228
name = "%s"
257-
description = "Test agent with knowledge base"
258-
instruction = "You are an assistant with access to a knowledge base."
229+
instruction = "%s"
259230
model_uuid = "%s"
231+
project_id = "%s"
232+
region = "tor1"
233+
234+
}`, name, instruction, defaultModelUUID, defaultProjecID)
235+
}
260236

261-
knowledge_base {
262-
name = "test-kb"
263-
description = "Test knowledge base"
264-
}
265-
}`, name, defaultModelUUID)
237+
func checkExactlyOneApplied(resName string) resource.TestCheckFunc {
238+
return func(s *terraform.State) error {
239+
rs, ok := s.RootModule().Resources[resName]
240+
if !ok {
241+
return fmt.Errorf("resource %s not found in state", resName)
242+
}
243+
applied := 0
244+
for k, v := range rs.Primary.Attributes {
245+
if strings.HasSuffix(k, ".currently_applied") && v == "true" {
246+
applied++
247+
}
248+
}
249+
if applied != 1 {
250+
return fmt.Errorf("expected exactly 1 currently_applied=true, got %d", applied)
251+
}
252+
return nil
253+
}
266254
}

digitalocean/genai/datasource_agents.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,22 @@ func DataSourceDigitalOceanAgents() *schema.Resource {
2121

2222
return datalist.NewResource(dataListConfig)
2323
}
24+
25+
func DataSourceDigitalOceanAgentVersions() *schema.Resource {
26+
27+
dataListConfig := &datalist.ResourceConfig{
28+
RecordSchema: AgentVersionSchemaRead(),
29+
ResultAttributeName: "agent_versions",
30+
ExtraQuerySchema: map[string]*schema.Schema{
31+
"agent_id": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
Description: "The ID of the agent to fetch versions for",
35+
},
36+
},
37+
FlattenRecord: flattenDigitalOceanAgentVersion,
38+
GetRecords: getDigitalOceanAgentVersions,
39+
}
40+
41+
return datalist.NewResource(dataListConfig)
42+
}

0 commit comments

Comments
 (0)