Skip to content

Commit 5e0d28a

Browse files
committed
chore: move prompt param validation to ConvertState with other validations, add test
Signed-off-by: Danny Kopping <[email protected]>
1 parent efe5da9 commit 5e0d28a

24 files changed

+1211
-164
lines changed

provisioner/terraform/resources.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"math"
7+
"slices"
78
"strings"
89

910
"github.com/awalterschulze/gographviz"
@@ -1031,12 +1032,22 @@ func ConvertState(ctx context.Context, modules []*tfjson.StateModule, rawGraph s
10311032
externalAuthProviders = append(externalAuthProviders, it)
10321033
}
10331034

1035+
hasAITasks := hasAITaskResources(graph)
1036+
if hasAITasks {
1037+
hasPromptParam := slices.ContainsFunc(parameters, func(param *proto.RichParameter) bool {
1038+
return param.Name == provider.TaskPromptParameterName
1039+
})
1040+
if !hasPromptParam {
1041+
return nil, xerrors.Errorf("coder_parameter named '%s' is required when 'coder_ai_task' resource is defined", provider.TaskPromptParameterName)
1042+
}
1043+
}
1044+
10341045
return &State{
10351046
Resources: resources,
10361047
Parameters: parameters,
10371048
Presets: presets,
10381049
ExternalAuthProviders: externalAuthProviders,
1039-
HasAITasks: hasAITaskResources(graph),
1050+
HasAITasks: hasAITasks,
10401051
AITasks: aiTasks,
10411052
}, nil
10421053
}

provisioner/terraform/resources_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import (
1111
"strings"
1212
"testing"
1313

14+
"github.com/coder/terraform-provider-coder/v2/provider"
1415
"github.com/google/go-cmp/cmp"
1516
tfjson "github.com/hashicorp/terraform-json"
1617
"github.com/stretchr/testify/require"
1718
protobuf "google.golang.org/protobuf/proto"
1819

1920
"cdr.dev/slog"
2021
"cdr.dev/slog/sloggers/slogtest"
22+
2123
"github.com/coder/coder/v2/testutil"
2224

2325
"github.com/coder/coder/v2/cryptorand"
@@ -1447,6 +1449,55 @@ func TestInstanceIDAssociation(t *testing.T) {
14471449
}
14481450
}
14491451

1452+
func TestAITasks(t *testing.T) {
1453+
t.Parallel()
1454+
ctx, logger := ctxAndLogger(t)
1455+
1456+
t.Run("Prompt parameter is required", func(t *testing.T) {
1457+
t.Parallel()
1458+
1459+
// nolint:dogsled
1460+
_, filename, _, _ := runtime.Caller(0)
1461+
1462+
dir := filepath.Join(filepath.Dir(filename), "testdata", "resources", "ai-tasks-missing-prompt")
1463+
tfPlanRaw, err := os.ReadFile(filepath.Join(dir, "ai-tasks-missing-prompt.tfplan.json"))
1464+
require.NoError(t, err)
1465+
var tfPlan tfjson.Plan
1466+
err = json.Unmarshal(tfPlanRaw, &tfPlan)
1467+
require.NoError(t, err)
1468+
tfPlanGraph, err := os.ReadFile(filepath.Join(dir, "ai-tasks-missing-prompt.tfplan.dot"))
1469+
require.NoError(t, err)
1470+
1471+
state, err := terraform.ConvertState(ctx, []*tfjson.StateModule{tfPlan.PlannedValues.RootModule, tfPlan.PriorState.Values.RootModule}, string(tfPlanGraph), logger)
1472+
require.Nil(t, state)
1473+
require.ErrorContains(t, err, fmt.Sprintf("coder_parameter named '%s' is required when 'coder_ai_task' resource is defined", provider.TaskPromptParameterName))
1474+
})
1475+
1476+
t.Run("Multiple tasks can be defined", func(t *testing.T) {
1477+
t.Parallel()
1478+
1479+
// nolint:dogsled
1480+
_, filename, _, _ := runtime.Caller(0)
1481+
1482+
dir := filepath.Join(filepath.Dir(filename), "testdata", "resources", "ai-tasks-multiple")
1483+
tfPlanRaw, err := os.ReadFile(filepath.Join(dir, "ai-tasks-multiple.tfplan.json"))
1484+
require.NoError(t, err)
1485+
var tfPlan tfjson.Plan
1486+
err = json.Unmarshal(tfPlanRaw, &tfPlan)
1487+
require.NoError(t, err)
1488+
tfPlanGraph, err := os.ReadFile(filepath.Join(dir, "ai-tasks-multiple.tfplan.dot"))
1489+
require.NoError(t, err)
1490+
1491+
state, err := terraform.ConvertState(ctx, []*tfjson.StateModule{tfPlan.PlannedValues.RootModule, tfPlan.PriorState.Values.RootModule}, string(tfPlanGraph), logger)
1492+
require.NotNil(t, state)
1493+
require.NoError(t, err)
1494+
require.True(t, state.HasAITasks)
1495+
// Multiple coder_ai_tasks resources can be defined, but only 1 is allowed.
1496+
// This is validated once all parameters are resolved etc as part of the workspace build, but for now we can allow it.
1497+
require.Len(t, state.AITasks, 2)
1498+
})
1499+
}
1500+
14501501
// sortResource ensures resources appear in a consistent ordering
14511502
// to prevent tests from flaking.
14521503
func sortResources(resources []*proto.Resource) {

provisioner/terraform/testdata/resources/ai-tasks-missing-prompt/ai-tasks-missing-prompt.tfplan.dot

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)