Skip to content

Commit 0fb3743

Browse files
committed
chore: use new provider, accept values for default
Signed-off-by: Danny Kopping <dannykopping@gmail.com>
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+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy