Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0fb3743

Browse files
committed
chore: use new provider, accept values for default
Signed-off-by: Danny Kopping <[email protected]>
1 parent 7e75433 commit 0fb3743

12 files changed

+276
-0
lines changed

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
protobuf "google.golang.org/protobuf/proto"
2929

3030
"cdr.dev/slog"
31+
3132
"github.com/coder/coder/v2/coderd/util/slice"
3233

3334
"github.com/coder/coder/v2/codersdk/drpcsdk"
@@ -2217,6 +2218,7 @@ func InsertWorkspacePresetAndParameters(ctx context.Context, db database.Store,
22172218
CreatedAt: t,
22182219
DesiredInstances: desiredInstances,
22192220
InvalidateAfterSecs: ttl,
2221+
IsDefault: protoPreset.GetDefault(),
22202222
})
22212223
if err != nil {
22222224
return xerrors.Errorf("insert preset: %w", err)

provisioner/terraform/resources.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,7 @@ func ConvertState(ctx context.Context, modules []*tfjson.StateModule, rawGraph s
922922
Instances: prebuildInstances,
923923
ExpirationPolicy: expirationPolicy,
924924
},
925+
Default: preset.Default,
925926
}
926927

927928
if slice.Contains(duplicatedPresetNames, preset.Name) {
@@ -940,6 +941,17 @@ func ConvertState(ctx context.Context, modules []*tfjson.StateModule, rawGraph s
940941
)
941942
}
942943

944+
// Validate that only one preset is marked as default.
945+
var defaultPresets int
946+
for _, preset := range presets {
947+
if preset.Default {
948+
defaultPresets++
949+
}
950+
}
951+
if defaultPresets > 1 {
952+
return nil, xerrors.Errorf("a maximum of 1 coder_workspace_preset can be marked as default, but %d are set", defaultPresets)
953+
}
954+
943955
// A map is used to ensure we don't have duplicates!
944956
externalAuthProvidersMap := map[string]*proto.ExternalAuthProviderResource{}
945957
for _, tfResources := range tfResourcesByLabel {

provisioner/terraform/resources_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818

1919
"cdr.dev/slog"
2020
"cdr.dev/slog/sloggers/slogtest"
21+
2122
"github.com/coder/coder/v2/testutil"
2223

2324
"github.com/coder/coder/v2/cryptorand"
@@ -1308,6 +1309,90 @@ func TestParameterValidation(t *testing.T) {
13081309
require.ErrorContains(t, err, "coder_parameter names must be unique but \"identical-0\", \"identical-1\" and \"identical-2\" appear multiple times")
13091310
}
13101311

1312+
func TestDefaultPresets(t *testing.T) {
1313+
t.Parallel()
1314+
1315+
// nolint:dogsled
1316+
_, filename, _, _ := runtime.Caller(0)
1317+
dir := filepath.Join(filepath.Dir(filename), "testdata", "resources", "presets")
1318+
1319+
cases := map[string]struct {
1320+
fixtureFile string
1321+
expectError bool
1322+
errorMsg string
1323+
validate func(t *testing.T, state *terraform.State)
1324+
}{
1325+
"multiple defaults should fail": {
1326+
fixtureFile: "multiple-defaults",
1327+
expectError: true,
1328+
errorMsg: "a maximum of 1 coder_workspace_preset can be marked as default, but 2 are set",
1329+
},
1330+
"single default should succeed": {
1331+
fixtureFile: "single-default",
1332+
expectError: false,
1333+
validate: func(t *testing.T, state *terraform.State) {
1334+
require.Len(t, state.Presets, 2)
1335+
var defaultCount int
1336+
for _, preset := range state.Presets {
1337+
if preset.Default {
1338+
defaultCount++
1339+
require.Equal(t, "development", preset.Name)
1340+
}
1341+
}
1342+
require.Equal(t, 1, defaultCount)
1343+
},
1344+
},
1345+
"no defaults should succeed": {
1346+
fixtureFile: "no-defaults",
1347+
expectError: false,
1348+
validate: func(t *testing.T, state *terraform.State) {
1349+
require.Len(t, state.Presets, 2)
1350+
for _, preset := range state.Presets {
1351+
require.False(t, preset.Default)
1352+
}
1353+
},
1354+
},
1355+
}
1356+
1357+
for name, tc := range cases {
1358+
tc := tc
1359+
t.Run(name, func(t *testing.T) {
1360+
t.Parallel()
1361+
ctx, logger := ctxAndLogger(t)
1362+
1363+
tfPlanRaw, err := os.ReadFile(filepath.Join(dir, tc.fixtureFile+".tfplan.json"))
1364+
require.NoError(t, err)
1365+
var tfPlan tfjson.Plan
1366+
err = json.Unmarshal(tfPlanRaw, &tfPlan)
1367+
require.NoError(t, err)
1368+
tfPlanGraph, err := os.ReadFile(filepath.Join(dir, tc.fixtureFile+".tfplan.dot"))
1369+
require.NoError(t, err)
1370+
1371+
modules := []*tfjson.StateModule{tfPlan.PlannedValues.RootModule}
1372+
if tfPlan.PriorState != nil {
1373+
modules = append(modules, tfPlan.PriorState.Values.RootModule)
1374+
} else {
1375+
modules = append(modules, tfPlan.PlannedValues.RootModule)
1376+
}
1377+
state, err := terraform.ConvertState(ctx, modules, string(tfPlanGraph), logger)
1378+
1379+
if tc.expectError {
1380+
require.Error(t, err)
1381+
require.Nil(t, state)
1382+
if tc.errorMsg != "" {
1383+
require.ErrorContains(t, err, tc.errorMsg)
1384+
}
1385+
} else {
1386+
require.NoError(t, err)
1387+
require.NotNil(t, state)
1388+
if tc.validate != nil {
1389+
tc.validate(t, state)
1390+
}
1391+
}
1392+
})
1393+
}
1394+
}
1395+
13111396
func TestInstanceTypeAssociation(t *testing.T) {
13121397
t.Parallel()
13131398
type tc struct {
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "2.3.0-pre2"
6+
}
7+
}
8+
}
9+
10+
data "coder_parameter" "instance_type" {
11+
name = "instance_type"
12+
type = "string"
13+
description = "Instance type"
14+
default = "t3.micro"
15+
}
16+
17+
data "coder_workspace_preset" "development" {
18+
name = "development"
19+
default = true
20+
parameters = {
21+
(data.coder_parameter.instance_type.name) = "t3.micro"
22+
}
23+
prebuilds {
24+
instances = 1
25+
}
26+
}
27+
28+
data "coder_workspace_preset" "production" {
29+
name = "production"
30+
default = true
31+
parameters = {
32+
(data.coder_parameter.instance_type.name) = "t3.large"
33+
}
34+
prebuilds {
35+
instances = 2
36+
}
37+
}
38+
39+
resource "coder_agent" "dev" {
40+
os = "linux"
41+
arch = "amd64"
42+
}
43+
44+
resource "null_resource" "dev" {
45+
depends_on = [coder_agent.dev]
46+
}

provisioner/terraform/testdata/resources/presets/multiple-defaults.tfplan.dot

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

provisioner/terraform/testdata/resources/presets/multiple-defaults.tfplan.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "2.3.0-pre2"
6+
}
7+
}
8+
}
9+
10+
data "coder_parameter" "instance_type" {
11+
name = "instance_type"
12+
type = "string"
13+
description = "Instance type"
14+
default = "t3.micro"
15+
}
16+
17+
data "coder_workspace_preset" "development" {
18+
name = "development"
19+
default = false
20+
parameters = {
21+
(data.coder_parameter.instance_type.name) = "t3.micro"
22+
}
23+
prebuilds {
24+
instances = 1
25+
}
26+
}
27+
28+
data "coder_workspace_preset" "production" {
29+
name = "production"
30+
default = false
31+
parameters = {
32+
(data.coder_parameter.instance_type.name) = "t3.large"
33+
}
34+
prebuilds {
35+
instances = 2
36+
}
37+
}
38+
39+
resource "coder_agent" "dev" {
40+
os = "linux"
41+
arch = "amd64"
42+
}
43+
44+
resource "null_resource" "dev" {
45+
depends_on = [coder_agent.dev]
46+
}

provisioner/terraform/testdata/resources/presets/no-defaults.tfplan.dot

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

provisioner/terraform/testdata/resources/presets/no-defaults.tfplan.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "2.3.0-pre2"
6+
}
7+
}
8+
}
9+
10+
data "coder_parameter" "instance_type" {
11+
name = "instance_type"
12+
type = "string"
13+
description = "Instance type"
14+
default = "t3.micro"
15+
}
16+
17+
data "coder_workspace_preset" "development" {
18+
name = "development"
19+
default = true
20+
parameters = {
21+
(data.coder_parameter.instance_type.name) = "t3.micro"
22+
}
23+
prebuilds {
24+
instances = 1
25+
}
26+
}
27+
28+
data "coder_workspace_preset" "production" {
29+
name = "production"
30+
default = false
31+
parameters = {
32+
(data.coder_parameter.instance_type.name) = "t3.large"
33+
}
34+
prebuilds {
35+
instances = 2
36+
}
37+
}
38+
39+
resource "coder_agent" "dev" {
40+
os = "linux"
41+
arch = "amd64"
42+
}
43+
44+
resource "null_resource" "dev" {
45+
depends_on = [coder_agent.dev]
46+
}

provisioner/terraform/testdata/resources/presets/single-default.tfplan.dot

Lines changed: 12 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)