mirror of
https://github.com/coder/coder.git
synced 2025-07-30 22:19:53 +00:00
feat: allow for default presets (#18445)
This commit is contained in:
@@ -103,5 +103,4 @@ Read [cursor rules](.cursorrules).
|
||||
|
||||
The frontend is contained in the site folder.
|
||||
|
||||
For building Frontend refer to [this document](docs/contributing/frontend.md)
|
||||
For building Frontend refer to [this document](docs/about/contributing/frontend.md)
|
||||
|
3
coderd/apidoc/docs.go
generated
3
coderd/apidoc/docs.go
generated
@@ -14519,6 +14519,9 @@ const docTemplate = `{
|
||||
"codersdk.Preset": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"default": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"id": {
|
||||
"type": "string"
|
||||
},
|
||||
|
3
coderd/apidoc/swagger.json
generated
3
coderd/apidoc/swagger.json
generated
@@ -13145,6 +13145,9 @@
|
||||
"codersdk.Preset": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"default": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"id": {
|
||||
"type": "string"
|
||||
},
|
||||
|
@@ -416,6 +416,7 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse {
|
||||
DesiredInstances: preset.DesiredInstances,
|
||||
InvalidateAfterSecs: preset.InvalidateAfterSecs,
|
||||
SchedulingTimezone: preset.SchedulingTimezone,
|
||||
IsDefault: false,
|
||||
})
|
||||
}
|
||||
|
||||
|
@@ -1303,6 +1303,7 @@ func Preset(t testing.TB, db database.Store, seed database.InsertPresetParams) d
|
||||
DesiredInstances: seed.DesiredInstances,
|
||||
InvalidateAfterSecs: seed.InvalidateAfterSecs,
|
||||
SchedulingTimezone: seed.SchedulingTimezone,
|
||||
IsDefault: seed.IsDefault,
|
||||
})
|
||||
require.NoError(t, err, "insert preset")
|
||||
return preset
|
||||
|
@@ -9198,6 +9198,7 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP
|
||||
Valid: true,
|
||||
},
|
||||
PrebuildStatus: database.PrebuildStatusHealthy,
|
||||
IsDefault: arg.IsDefault,
|
||||
}
|
||||
q.presets = append(q.presets, preset)
|
||||
return preset, nil
|
||||
|
5
coderd/database/dump.sql
generated
5
coderd/database/dump.sql
generated
@@ -1513,7 +1513,8 @@ CREATE TABLE template_version_presets (
|
||||
desired_instances integer,
|
||||
invalidate_after_secs integer DEFAULT 0,
|
||||
prebuild_status prebuild_status DEFAULT 'healthy'::prebuild_status NOT NULL,
|
||||
scheduling_timezone text DEFAULT ''::text NOT NULL
|
||||
scheduling_timezone text DEFAULT ''::text NOT NULL,
|
||||
is_default boolean DEFAULT false NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE template_version_terraform_values (
|
||||
@@ -2690,6 +2691,8 @@ CREATE INDEX idx_tailnet_tunnels_dst_id ON tailnet_tunnels USING hash (dst_id);
|
||||
|
||||
CREATE INDEX idx_tailnet_tunnels_src_id ON tailnet_tunnels USING hash (src_id);
|
||||
|
||||
CREATE UNIQUE INDEX idx_template_version_presets_default ON template_version_presets USING btree (template_version_id) WHERE (is_default = true);
|
||||
|
||||
CREATE INDEX idx_template_versions_has_ai_task ON template_versions USING btree (has_ai_task);
|
||||
|
||||
CREATE UNIQUE INDEX idx_unique_preset_name ON template_version_presets USING btree (name, template_version_id);
|
||||
|
@@ -0,0 +1,2 @@
|
||||
DROP INDEX IF EXISTS idx_template_version_presets_default;
|
||||
ALTER TABLE template_version_presets DROP COLUMN IF EXISTS is_default;
|
@@ -0,0 +1,6 @@
|
||||
ALTER TABLE template_version_presets ADD COLUMN is_default BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
|
||||
-- Add a unique constraint to ensure only one default preset per template version
|
||||
CREATE UNIQUE INDEX idx_template_version_presets_default
|
||||
ON template_version_presets (template_version_id)
|
||||
WHERE is_default = TRUE;
|
@@ -3414,6 +3414,7 @@ type TemplateVersionPreset struct {
|
||||
InvalidateAfterSecs sql.NullInt32 `db:"invalidate_after_secs" json:"invalidate_after_secs"`
|
||||
PrebuildStatus PrebuildStatus `db:"prebuild_status" json:"prebuild_status"`
|
||||
SchedulingTimezone string `db:"scheduling_timezone" json:"scheduling_timezone"`
|
||||
IsDefault bool `db:"is_default" json:"is_default"`
|
||||
}
|
||||
|
||||
type TemplateVersionPresetParameter struct {
|
||||
|
@@ -6629,7 +6629,7 @@ func (q *sqlQuerier) GetActivePresetPrebuildSchedules(ctx context.Context) ([]Te
|
||||
}
|
||||
|
||||
const getPresetByID = `-- name: GetPresetByID :one
|
||||
SELECT tvp.id, tvp.template_version_id, tvp.name, tvp.created_at, tvp.desired_instances, tvp.invalidate_after_secs, tvp.prebuild_status, tvp.scheduling_timezone, tv.template_id, tv.organization_id FROM
|
||||
SELECT tvp.id, tvp.template_version_id, tvp.name, tvp.created_at, tvp.desired_instances, tvp.invalidate_after_secs, tvp.prebuild_status, tvp.scheduling_timezone, tvp.is_default, tv.template_id, tv.organization_id FROM
|
||||
template_version_presets tvp
|
||||
INNER JOIN template_versions tv ON tvp.template_version_id = tv.id
|
||||
WHERE tvp.id = $1
|
||||
@@ -6644,6 +6644,7 @@ type GetPresetByIDRow struct {
|
||||
InvalidateAfterSecs sql.NullInt32 `db:"invalidate_after_secs" json:"invalidate_after_secs"`
|
||||
PrebuildStatus PrebuildStatus `db:"prebuild_status" json:"prebuild_status"`
|
||||
SchedulingTimezone string `db:"scheduling_timezone" json:"scheduling_timezone"`
|
||||
IsDefault bool `db:"is_default" json:"is_default"`
|
||||
TemplateID uuid.NullUUID `db:"template_id" json:"template_id"`
|
||||
OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"`
|
||||
}
|
||||
@@ -6660,6 +6661,7 @@ func (q *sqlQuerier) GetPresetByID(ctx context.Context, presetID uuid.UUID) (Get
|
||||
&i.InvalidateAfterSecs,
|
||||
&i.PrebuildStatus,
|
||||
&i.SchedulingTimezone,
|
||||
&i.IsDefault,
|
||||
&i.TemplateID,
|
||||
&i.OrganizationID,
|
||||
)
|
||||
@@ -6668,7 +6670,7 @@ func (q *sqlQuerier) GetPresetByID(ctx context.Context, presetID uuid.UUID) (Get
|
||||
|
||||
const getPresetByWorkspaceBuildID = `-- name: GetPresetByWorkspaceBuildID :one
|
||||
SELECT
|
||||
template_version_presets.id, template_version_presets.template_version_id, template_version_presets.name, template_version_presets.created_at, template_version_presets.desired_instances, template_version_presets.invalidate_after_secs, template_version_presets.prebuild_status, template_version_presets.scheduling_timezone
|
||||
template_version_presets.id, template_version_presets.template_version_id, template_version_presets.name, template_version_presets.created_at, template_version_presets.desired_instances, template_version_presets.invalidate_after_secs, template_version_presets.prebuild_status, template_version_presets.scheduling_timezone, template_version_presets.is_default
|
||||
FROM
|
||||
template_version_presets
|
||||
INNER JOIN workspace_builds ON workspace_builds.template_version_preset_id = template_version_presets.id
|
||||
@@ -6688,6 +6690,7 @@ func (q *sqlQuerier) GetPresetByWorkspaceBuildID(ctx context.Context, workspaceB
|
||||
&i.InvalidateAfterSecs,
|
||||
&i.PrebuildStatus,
|
||||
&i.SchedulingTimezone,
|
||||
&i.IsDefault,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
@@ -6769,7 +6772,7 @@ func (q *sqlQuerier) GetPresetParametersByTemplateVersionID(ctx context.Context,
|
||||
|
||||
const getPresetsByTemplateVersionID = `-- name: GetPresetsByTemplateVersionID :many
|
||||
SELECT
|
||||
id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone
|
||||
id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone, is_default
|
||||
FROM
|
||||
template_version_presets
|
||||
WHERE
|
||||
@@ -6794,6 +6797,7 @@ func (q *sqlQuerier) GetPresetsByTemplateVersionID(ctx context.Context, template
|
||||
&i.InvalidateAfterSecs,
|
||||
&i.PrebuildStatus,
|
||||
&i.SchedulingTimezone,
|
||||
&i.IsDefault,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -6816,7 +6820,8 @@ INSERT INTO template_version_presets (
|
||||
created_at,
|
||||
desired_instances,
|
||||
invalidate_after_secs,
|
||||
scheduling_timezone
|
||||
scheduling_timezone,
|
||||
is_default
|
||||
)
|
||||
VALUES (
|
||||
$1,
|
||||
@@ -6825,8 +6830,9 @@ VALUES (
|
||||
$4,
|
||||
$5,
|
||||
$6,
|
||||
$7
|
||||
) RETURNING id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone
|
||||
$7,
|
||||
$8
|
||||
) RETURNING id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone, is_default
|
||||
`
|
||||
|
||||
type InsertPresetParams struct {
|
||||
@@ -6837,6 +6843,7 @@ type InsertPresetParams struct {
|
||||
DesiredInstances sql.NullInt32 `db:"desired_instances" json:"desired_instances"`
|
||||
InvalidateAfterSecs sql.NullInt32 `db:"invalidate_after_secs" json:"invalidate_after_secs"`
|
||||
SchedulingTimezone string `db:"scheduling_timezone" json:"scheduling_timezone"`
|
||||
IsDefault bool `db:"is_default" json:"is_default"`
|
||||
}
|
||||
|
||||
func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) (TemplateVersionPreset, error) {
|
||||
@@ -6848,6 +6855,7 @@ func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) (
|
||||
arg.DesiredInstances,
|
||||
arg.InvalidateAfterSecs,
|
||||
arg.SchedulingTimezone,
|
||||
arg.IsDefault,
|
||||
)
|
||||
var i TemplateVersionPreset
|
||||
err := row.Scan(
|
||||
@@ -6859,6 +6867,7 @@ func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) (
|
||||
&i.InvalidateAfterSecs,
|
||||
&i.PrebuildStatus,
|
||||
&i.SchedulingTimezone,
|
||||
&i.IsDefault,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
@@ -6,7 +6,8 @@ INSERT INTO template_version_presets (
|
||||
created_at,
|
||||
desired_instances,
|
||||
invalidate_after_secs,
|
||||
scheduling_timezone
|
||||
scheduling_timezone,
|
||||
is_default
|
||||
)
|
||||
VALUES (
|
||||
@id,
|
||||
@@ -15,7 +16,8 @@ VALUES (
|
||||
@created_at,
|
||||
@desired_instances,
|
||||
@invalidate_after_secs,
|
||||
@scheduling_timezone
|
||||
@scheduling_timezone,
|
||||
@is_default
|
||||
) RETURNING *;
|
||||
|
||||
-- name: InsertPresetParameters :many
|
||||
|
@@ -106,6 +106,7 @@ const (
|
||||
UniqueIndexCustomRolesNameLower UniqueConstraint = "idx_custom_roles_name_lower" // CREATE UNIQUE INDEX idx_custom_roles_name_lower ON custom_roles USING btree (lower(name));
|
||||
UniqueIndexOrganizationNameLower UniqueConstraint = "idx_organization_name_lower" // CREATE UNIQUE INDEX idx_organization_name_lower ON organizations USING btree (lower(name)) WHERE (deleted = false);
|
||||
UniqueIndexProvisionerDaemonsOrgNameOwnerKey UniqueConstraint = "idx_provisioner_daemons_org_name_owner_key" // CREATE UNIQUE INDEX idx_provisioner_daemons_org_name_owner_key ON provisioner_daemons USING btree (organization_id, name, lower(COALESCE((tags ->> 'owner'::text), ''::text)));
|
||||
UniqueIndexTemplateVersionPresetsDefault UniqueConstraint = "idx_template_version_presets_default" // CREATE UNIQUE INDEX idx_template_version_presets_default ON template_version_presets USING btree (template_version_id) WHERE (is_default = true);
|
||||
UniqueIndexUniquePresetName UniqueConstraint = "idx_unique_preset_name" // CREATE UNIQUE INDEX idx_unique_preset_name ON template_version_presets USING btree (name, template_version_id);
|
||||
UniqueIndexUsersEmail UniqueConstraint = "idx_users_email" // CREATE UNIQUE INDEX idx_users_email ON users USING btree (email) WHERE (deleted = false);
|
||||
UniqueIndexUsersUsername UniqueConstraint = "idx_users_username" // CREATE UNIQUE INDEX idx_users_username ON users USING btree (username) WHERE (deleted = false);
|
||||
|
@@ -41,8 +41,9 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request)
|
||||
var res []codersdk.Preset
|
||||
for _, preset := range presets {
|
||||
sdkPreset := codersdk.Preset{
|
||||
ID: preset.ID,
|
||||
Name: preset.Name,
|
||||
ID: preset.ID,
|
||||
Name: preset.Name,
|
||||
Default: preset.IsDefault,
|
||||
}
|
||||
for _, presetParam := range presetParams {
|
||||
if presetParam.TemplateVersionPresetID != preset.ID {
|
||||
|
@@ -1,8 +1,10 @@
|
||||
package coderd_test
|
||||
|
||||
import (
|
||||
"slices"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||
@@ -137,3 +139,93 @@ func TestTemplateVersionPresets(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestTemplateVersionPresetsDefault(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
type expectedPreset struct {
|
||||
name string
|
||||
isDefault bool
|
||||
}
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
presets []database.InsertPresetParams
|
||||
expected []expectedPreset
|
||||
}{
|
||||
{
|
||||
name: "no presets",
|
||||
presets: nil,
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
name: "single default preset",
|
||||
presets: []database.InsertPresetParams{
|
||||
{Name: "Default Preset", IsDefault: true},
|
||||
},
|
||||
expected: []expectedPreset{
|
||||
{name: "Default Preset", isDefault: true},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "single non-default preset",
|
||||
presets: []database.InsertPresetParams{
|
||||
{Name: "Regular Preset", IsDefault: false},
|
||||
},
|
||||
expected: []expectedPreset{
|
||||
{name: "Regular Preset", isDefault: false},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "mixed presets",
|
||||
presets: []database.InsertPresetParams{
|
||||
{Name: "Default Preset", IsDefault: true},
|
||||
{Name: "Regular Preset", IsDefault: false},
|
||||
},
|
||||
expected: []expectedPreset{
|
||||
{name: "Default Preset", isDefault: true},
|
||||
{name: "Regular Preset", isDefault: false},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
ctx := testutil.Context(t, testutil.WaitShort)
|
||||
|
||||
client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||
user := coderdtest.CreateFirstUser(t, client)
|
||||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
|
||||
|
||||
// Create presets
|
||||
for _, preset := range tc.presets {
|
||||
preset.TemplateVersionID = version.ID
|
||||
_ = dbgen.Preset(t, db, preset)
|
||||
}
|
||||
|
||||
// Get presets via API
|
||||
userSubject, _, err := httpmw.UserRBACSubject(ctx, db, user.UserID, rbac.ScopeAll)
|
||||
require.NoError(t, err)
|
||||
userCtx := dbauthz.As(ctx, userSubject)
|
||||
|
||||
gotPresets, err := client.TemplateVersionPresets(userCtx, version.ID)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify results
|
||||
require.Len(t, gotPresets, len(tc.expected))
|
||||
|
||||
for _, expected := range tc.expected {
|
||||
found := slices.ContainsFunc(gotPresets, func(preset codersdk.Preset) bool {
|
||||
if preset.Name != expected.name {
|
||||
return false
|
||||
}
|
||||
|
||||
return assert.Equal(t, expected.isDefault, preset.Default)
|
||||
})
|
||||
require.True(t, found, "Expected preset %s not found", expected.name)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@@ -2230,6 +2230,7 @@ func InsertWorkspacePresetAndParameters(ctx context.Context, db database.Store,
|
||||
DesiredInstances: desiredInstances,
|
||||
InvalidateAfterSecs: ttl,
|
||||
SchedulingTimezone: schedulingTimezone,
|
||||
IsDefault: protoPreset.GetDefault(),
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("insert preset: %w", err)
|
||||
|
@@ -14,6 +14,7 @@ type Preset struct {
|
||||
ID uuid.UUID
|
||||
Name string
|
||||
Parameters []PresetParameter
|
||||
Default bool
|
||||
}
|
||||
|
||||
type PresetParameter struct {
|
||||
|
2
docs/reference/api/schemas.md
generated
2
docs/reference/api/schemas.md
generated
@@ -5497,6 +5497,7 @@ Git clone makes use of this by parsing the URL from: 'Username for "https://gith
|
||||
|
||||
```json
|
||||
{
|
||||
"default": true,
|
||||
"id": "string",
|
||||
"name": "string",
|
||||
"parameters": [
|
||||
@@ -5512,6 +5513,7 @@ Git clone makes use of this by parsing the URL from: 'Username for "https://gith
|
||||
|
||||
| Name | Type | Required | Restrictions | Description |
|
||||
|--------------|---------------------------------------------------------------|----------|--------------|-------------|
|
||||
| `default` | boolean | false | | |
|
||||
| `id` | string | false | | |
|
||||
| `name` | string | false | | |
|
||||
| `parameters` | array of [codersdk.PresetParameter](#codersdkpresetparameter) | false | | |
|
||||
|
18
docs/reference/api/templates.md
generated
18
docs/reference/api/templates.md
generated
@@ -2911,6 +2911,7 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/p
|
||||
```json
|
||||
[
|
||||
{
|
||||
"default": true,
|
||||
"id": "string",
|
||||
"name": "string",
|
||||
"parameters": [
|
||||
@@ -2933,14 +2934,15 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/p
|
||||
|
||||
Status Code **200**
|
||||
|
||||
| Name | Type | Required | Restrictions | Description |
|
||||
|----------------|--------|----------|--------------|-------------|
|
||||
| `[array item]` | array | false | | |
|
||||
| `» id` | string | false | | |
|
||||
| `» name` | string | false | | |
|
||||
| `» parameters` | array | false | | |
|
||||
| `»» name` | string | false | | |
|
||||
| `»» value` | string | false | | |
|
||||
| Name | Type | Required | Restrictions | Description |
|
||||
|----------------|---------|----------|--------------|-------------|
|
||||
| `[array item]` | array | false | | |
|
||||
| `» default` | boolean | false | | |
|
||||
| `» id` | string | false | | |
|
||||
| `» name` | string | false | | |
|
||||
| `» parameters` | array | false | | |
|
||||
| `»» name` | string | false | | |
|
||||
| `»» value` | string | false | | |
|
||||
|
||||
To perform this operation, you must be authenticated. [Learn more](authentication.md).
|
||||
|
||||
|
3
go.mod
3
go.mod
@@ -72,6 +72,9 @@ replace github.com/aquasecurity/trivy => github.com/coder/trivy v0.0.0-202505271
|
||||
// https://github.com/spf13/afero/pull/487
|
||||
replace github.com/spf13/afero => github.com/aslilac/afero v0.0.0-20250403163713-f06e86036696
|
||||
|
||||
// TODO: replace once we cut release.
|
||||
replace github.com/coder/terraform-provider-coder/v2 => github.com/coder/terraform-provider-coder/v2 v2.7.1-0.20250623193313-e890833351e2
|
||||
|
||||
require (
|
||||
cdr.dev/slog v1.6.2-0.20241112041820-0ec81e6e67bb
|
||||
cloud.google.com/go/compute/metadata v0.7.0
|
||||
|
4
go.sum
4
go.sum
@@ -928,8 +928,8 @@ github.com/coder/tailscale v1.1.1-0.20250611020837-f14d20d23d8c h1:d/qBIi3Ez7Kko
|
||||
github.com/coder/tailscale v1.1.1-0.20250611020837-f14d20d23d8c/go.mod h1:l7ml5uu7lFh5hY28lGYM4b/oFSmuPHYX6uk4RAu23Lc=
|
||||
github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e h1:JNLPDi2P73laR1oAclY6jWzAbucf70ASAvf5mh2cME0=
|
||||
github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e/go.mod h1:Gz/z9Hbn+4KSp8A2FBtNszfLSdT2Tn/uAKGuVqqWmDI=
|
||||
github.com/coder/terraform-provider-coder/v2 v2.7.0 h1:0WV89TuboHnoy4J8MwNnCtNjF3Onx2Ny959FC2ClGQg=
|
||||
github.com/coder/terraform-provider-coder/v2 v2.7.0/go.mod h1:WrdLSbihuzH1RZhwrU+qmkqEhUbdZT/sjHHdarm5b5g=
|
||||
github.com/coder/terraform-provider-coder/v2 v2.7.1-0.20250623193313-e890833351e2 h1:vtGzECz5CyzuxMODexWdIRxhYLqyTcHafuJpH60PYhM=
|
||||
github.com/coder/terraform-provider-coder/v2 v2.7.1-0.20250623193313-e890833351e2/go.mod h1:WrdLSbihuzH1RZhwrU+qmkqEhUbdZT/sjHHdarm5b5g=
|
||||
github.com/coder/trivy v0.0.0-20250527170238-9416a59d7019 h1:MHkv/W7l9eRAN9gOG0qZ1TLRGWIIfNi92273vPAQ8Fs=
|
||||
github.com/coder/trivy v0.0.0-20250527170238-9416a59d7019/go.mod h1:eqk+w9RLBmbd/cB5XfPZFuVn77cf/A6fB7qmEVeSmXk=
|
||||
github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE=
|
||||
|
@@ -939,6 +939,7 @@ func ConvertState(ctx context.Context, modules []*tfjson.StateModule, rawGraph s
|
||||
ExpirationPolicy: expirationPolicy,
|
||||
Scheduling: scheduling,
|
||||
},
|
||||
Default: preset.Default,
|
||||
}
|
||||
|
||||
if slice.Contains(duplicatedPresetNames, preset.Name) {
|
||||
@@ -957,6 +958,17 @@ func ConvertState(ctx context.Context, modules []*tfjson.StateModule, rawGraph s
|
||||
)
|
||||
}
|
||||
|
||||
// Validate that only one preset is marked as default.
|
||||
var defaultPresets int
|
||||
for _, preset := range presets {
|
||||
if preset.Default {
|
||||
defaultPresets++
|
||||
}
|
||||
}
|
||||
if defaultPresets > 1 {
|
||||
return nil, xerrors.Errorf("a maximum of 1 coder_workspace_preset can be marked as default, but %d are set", defaultPresets)
|
||||
}
|
||||
|
||||
// A map is used to ensure we don't have duplicates!
|
||||
externalAuthProvidersMap := map[string]*proto.ExternalAuthProviderResource{}
|
||||
for _, tfResources := range tfResourcesByLabel {
|
||||
|
@@ -18,6 +18,7 @@ import (
|
||||
|
||||
"cdr.dev/slog"
|
||||
"cdr.dev/slog/sloggers/slogtest"
|
||||
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
|
||||
"github.com/coder/coder/v2/cryptorand"
|
||||
@@ -1323,6 +1324,80 @@ func TestParameterValidation(t *testing.T) {
|
||||
require.ErrorContains(t, err, "coder_parameter names must be unique but \"identical-0\", \"identical-1\" and \"identical-2\" appear multiple times")
|
||||
}
|
||||
|
||||
func TestDefaultPresets(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
// nolint:dogsled
|
||||
_, filename, _, _ := runtime.Caller(0)
|
||||
dir := filepath.Join(filepath.Dir(filename), "testdata", "resources")
|
||||
|
||||
cases := map[string]struct {
|
||||
fixtureFile string
|
||||
expectError bool
|
||||
errorMsg string
|
||||
validate func(t *testing.T, state *terraform.State)
|
||||
}{
|
||||
"multiple defaults should fail": {
|
||||
fixtureFile: "presets-multiple-defaults",
|
||||
expectError: true,
|
||||
errorMsg: "a maximum of 1 coder_workspace_preset can be marked as default, but 2 are set",
|
||||
},
|
||||
"single default should succeed": {
|
||||
fixtureFile: "presets-single-default",
|
||||
expectError: false,
|
||||
validate: func(t *testing.T, state *terraform.State) {
|
||||
require.Len(t, state.Presets, 2)
|
||||
var defaultCount int
|
||||
for _, preset := range state.Presets {
|
||||
if preset.Default {
|
||||
defaultCount++
|
||||
require.Equal(t, "development", preset.Name)
|
||||
}
|
||||
}
|
||||
require.Equal(t, 1, defaultCount)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
tc := tc
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
ctx, logger := ctxAndLogger(t)
|
||||
|
||||
tfPlanRaw, err := os.ReadFile(filepath.Join(dir, tc.fixtureFile, tc.fixtureFile+".tfplan.json"))
|
||||
require.NoError(t, err)
|
||||
var tfPlan tfjson.Plan
|
||||
err = json.Unmarshal(tfPlanRaw, &tfPlan)
|
||||
require.NoError(t, err)
|
||||
tfPlanGraph, err := os.ReadFile(filepath.Join(dir, tc.fixtureFile, tc.fixtureFile+".tfplan.dot"))
|
||||
require.NoError(t, err)
|
||||
|
||||
modules := []*tfjson.StateModule{tfPlan.PlannedValues.RootModule}
|
||||
if tfPlan.PriorState != nil {
|
||||
modules = append(modules, tfPlan.PriorState.Values.RootModule)
|
||||
} else {
|
||||
modules = append(modules, tfPlan.PlannedValues.RootModule)
|
||||
}
|
||||
state, err := terraform.ConvertState(ctx, modules, string(tfPlanGraph), logger)
|
||||
|
||||
if tc.expectError {
|
||||
require.Error(t, err)
|
||||
require.Nil(t, state)
|
||||
if tc.errorMsg != "" {
|
||||
require.ErrorContains(t, err, tc.errorMsg)
|
||||
}
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, state)
|
||||
if tc.validate != nil {
|
||||
tc.validate(t, state)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestInstanceTypeAssociation(t *testing.T) {
|
||||
t.Parallel()
|
||||
type tc struct {
|
||||
|
@@ -130,7 +130,7 @@
|
||||
"type": "coder_external_auth",
|
||||
"name": "github",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"access_token": "",
|
||||
"id": "github",
|
||||
@@ -144,7 +144,7 @@
|
||||
"type": "coder_external_auth",
|
||||
"name": "gitlab",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"access_token": "",
|
||||
"id": "gitlab",
|
||||
@@ -208,7 +208,7 @@
|
||||
"constant_value": "github"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_external_auth.gitlab",
|
||||
@@ -224,7 +224,7 @@
|
||||
"constant_value": true
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@
|
||||
"type": "coder_external_auth",
|
||||
"name": "github",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"access_token": "",
|
||||
"id": "github",
|
||||
@@ -24,7 +24,7 @@
|
||||
"type": "coder_external_auth",
|
||||
"name": "gitlab",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"access_token": "",
|
||||
"id": "gitlab",
|
||||
|
46
provisioner/terraform/testdata/resources/presets-multiple-defaults/multiple-defaults.tf
vendored
Normal file
46
provisioner/terraform/testdata/resources/presets-multiple-defaults/multiple-defaults.tf
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = ">= 2.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_parameter" "instance_type" {
|
||||
name = "instance_type"
|
||||
type = "string"
|
||||
description = "Instance type"
|
||||
default = "t3.micro"
|
||||
}
|
||||
|
||||
data "coder_workspace_preset" "development" {
|
||||
name = "development"
|
||||
default = true
|
||||
parameters = {
|
||||
(data.coder_parameter.instance_type.name) = "t3.micro"
|
||||
}
|
||||
prebuilds {
|
||||
instances = 1
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_workspace_preset" "production" {
|
||||
name = "production"
|
||||
default = true
|
||||
parameters = {
|
||||
(data.coder_parameter.instance_type.name) = "t3.large"
|
||||
}
|
||||
prebuilds {
|
||||
instances = 2
|
||||
}
|
||||
}
|
||||
|
||||
resource "coder_agent" "dev" {
|
||||
os = "linux"
|
||||
arch = "amd64"
|
||||
}
|
||||
|
||||
resource "null_resource" "dev" {
|
||||
depends_on = [coder_agent.dev]
|
||||
}
|
25
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfplan.dot
generated
vendored
Normal file
25
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfplan.dot
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
digraph {
|
||||
compound = "true"
|
||||
newrank = "true"
|
||||
subgraph "root" {
|
||||
"[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"]
|
||||
"[root] data.coder_parameter.instance_type (expand)" [label = "data.coder_parameter.instance_type", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.development (expand)" [label = "data.coder_workspace_preset.development", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.production (expand)" [label = "data.coder_workspace_preset.production", shape = "box"]
|
||||
"[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"]
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"]
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"]
|
||||
"[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_parameter.instance_type (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_workspace_preset.development (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] data.coder_workspace_preset.production (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.development (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.production (expand)"
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)"
|
||||
}
|
||||
}
|
352
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfplan.json
generated
vendored
Normal file
352
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfplan.json
generated
vendored
Normal file
@@ -0,0 +1,352 @@
|
||||
{
|
||||
"format_version": "1.2",
|
||||
"terraform_version": "1.12.2",
|
||||
"planned_values": {
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"api_key_scope": "all",
|
||||
"arch": "amd64",
|
||||
"auth": "token",
|
||||
"connection_timeout": 120,
|
||||
"dir": null,
|
||||
"env": null,
|
||||
"metadata": [],
|
||||
"motd_file": null,
|
||||
"order": null,
|
||||
"os": "linux",
|
||||
"resources_monitoring": [],
|
||||
"shutdown_script": null,
|
||||
"startup_script": null,
|
||||
"startup_script_behavior": "non-blocking",
|
||||
"troubleshooting_url": null
|
||||
},
|
||||
"sensitive_values": {
|
||||
"display_apps": [],
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/hashicorp/null",
|
||||
"schema_version": 0,
|
||||
"values": {
|
||||
"triggers": null
|
||||
},
|
||||
"sensitive_values": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"resource_changes": [
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"change": {
|
||||
"actions": [
|
||||
"create"
|
||||
],
|
||||
"before": null,
|
||||
"after": {
|
||||
"api_key_scope": "all",
|
||||
"arch": "amd64",
|
||||
"auth": "token",
|
||||
"connection_timeout": 120,
|
||||
"dir": null,
|
||||
"env": null,
|
||||
"metadata": [],
|
||||
"motd_file": null,
|
||||
"order": null,
|
||||
"os": "linux",
|
||||
"resources_monitoring": [],
|
||||
"shutdown_script": null,
|
||||
"startup_script": null,
|
||||
"startup_script_behavior": "non-blocking",
|
||||
"troubleshooting_url": null
|
||||
},
|
||||
"after_unknown": {
|
||||
"display_apps": true,
|
||||
"id": true,
|
||||
"init_script": true,
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
},
|
||||
"before_sensitive": false,
|
||||
"after_sensitive": {
|
||||
"display_apps": [],
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/hashicorp/null",
|
||||
"change": {
|
||||
"actions": [
|
||||
"create"
|
||||
],
|
||||
"before": null,
|
||||
"after": {
|
||||
"triggers": null
|
||||
},
|
||||
"after_unknown": {
|
||||
"id": true
|
||||
},
|
||||
"before_sensitive": false,
|
||||
"after_sensitive": {}
|
||||
}
|
||||
}
|
||||
],
|
||||
"prior_state": {
|
||||
"format_version": "1.0",
|
||||
"terraform_version": "1.12.2",
|
||||
"values": {
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "data.coder_parameter.instance_type",
|
||||
"mode": "data",
|
||||
"type": "coder_parameter",
|
||||
"name": "instance_type",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "t3.micro",
|
||||
"description": "Instance type",
|
||||
"display_name": null,
|
||||
"ephemeral": false,
|
||||
"form_type": "input",
|
||||
"icon": null,
|
||||
"id": "618511d1-8fe3-4acc-92cd-d98955303039",
|
||||
"mutable": false,
|
||||
"name": "instance_type",
|
||||
"option": null,
|
||||
"optional": true,
|
||||
"order": null,
|
||||
"styling": "{}",
|
||||
"type": "string",
|
||||
"validation": [],
|
||||
"value": "t3.micro"
|
||||
},
|
||||
"sensitive_values": {
|
||||
"validation": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.development",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "development",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": true,
|
||||
"id": "development",
|
||||
"name": "development",
|
||||
"parameters": {
|
||||
"instance_type": "t3.micro"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 1,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.production",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "production",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": true,
|
||||
"id": "production",
|
||||
"name": "production",
|
||||
"parameters": {
|
||||
"instance_type": "t3.large"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 2,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"configuration": {
|
||||
"provider_config": {
|
||||
"coder": {
|
||||
"name": "coder",
|
||||
"full_name": "registry.terraform.io/coder/coder",
|
||||
"version_constraint": ">= 2.3.0"
|
||||
},
|
||||
"null": {
|
||||
"name": "null",
|
||||
"full_name": "registry.terraform.io/hashicorp/null"
|
||||
}
|
||||
},
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"arch": {
|
||||
"constant_value": "amd64"
|
||||
},
|
||||
"os": {
|
||||
"constant_value": "linux"
|
||||
}
|
||||
},
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_config_key": "null",
|
||||
"schema_version": 0,
|
||||
"depends_on": [
|
||||
"coder_agent.dev"
|
||||
]
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.instance_type",
|
||||
"mode": "data",
|
||||
"type": "coder_parameter",
|
||||
"name": "instance_type",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"default": {
|
||||
"constant_value": "t3.micro"
|
||||
},
|
||||
"description": {
|
||||
"constant_value": "Instance type"
|
||||
},
|
||||
"name": {
|
||||
"constant_value": "instance_type"
|
||||
},
|
||||
"type": {
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.development",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "development",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"default": {
|
||||
"constant_value": true
|
||||
},
|
||||
"name": {
|
||||
"constant_value": "development"
|
||||
},
|
||||
"parameters": {
|
||||
"references": [
|
||||
"data.coder_parameter.instance_type.name",
|
||||
"data.coder_parameter.instance_type"
|
||||
]
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"instances": {
|
||||
"constant_value": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.production",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "production",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"default": {
|
||||
"constant_value": true
|
||||
},
|
||||
"name": {
|
||||
"constant_value": "production"
|
||||
},
|
||||
"parameters": {
|
||||
"references": [
|
||||
"data.coder_parameter.instance_type.name",
|
||||
"data.coder_parameter.instance_type"
|
||||
]
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"instances": {
|
||||
"constant_value": 2
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"timestamp": "2025-06-19T12:43:59Z",
|
||||
"applyable": true,
|
||||
"complete": true,
|
||||
"errored": false
|
||||
}
|
25
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfstate.dot
generated
vendored
Normal file
25
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfstate.dot
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
digraph {
|
||||
compound = "true"
|
||||
newrank = "true"
|
||||
subgraph "root" {
|
||||
"[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"]
|
||||
"[root] data.coder_parameter.instance_type (expand)" [label = "data.coder_parameter.instance_type", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.development (expand)" [label = "data.coder_workspace_preset.development", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.production (expand)" [label = "data.coder_workspace_preset.production", shape = "box"]
|
||||
"[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"]
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"]
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"]
|
||||
"[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_parameter.instance_type (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_workspace_preset.development (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] data.coder_workspace_preset.production (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.development (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.production (expand)"
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)"
|
||||
}
|
||||
}
|
164
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfstate.json
generated
vendored
Normal file
164
provisioner/terraform/testdata/resources/presets-multiple-defaults/presets-multiple-defaults.tfstate.json
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
{
|
||||
"format_version": "1.0",
|
||||
"terraform_version": "1.12.2",
|
||||
"values": {
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "data.coder_parameter.instance_type",
|
||||
"mode": "data",
|
||||
"type": "coder_parameter",
|
||||
"name": "instance_type",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "t3.micro",
|
||||
"description": "Instance type",
|
||||
"display_name": null,
|
||||
"ephemeral": false,
|
||||
"form_type": "input",
|
||||
"icon": null,
|
||||
"id": "90b10074-c53d-4b0b-9c82-feb0e14e54f5",
|
||||
"mutable": false,
|
||||
"name": "instance_type",
|
||||
"option": null,
|
||||
"optional": true,
|
||||
"order": null,
|
||||
"styling": "{}",
|
||||
"type": "string",
|
||||
"validation": [],
|
||||
"value": "t3.micro"
|
||||
},
|
||||
"sensitive_values": {
|
||||
"validation": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.development",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "development",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": true,
|
||||
"id": "development",
|
||||
"name": "development",
|
||||
"parameters": {
|
||||
"instance_type": "t3.micro"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 1,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.production",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "production",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": true,
|
||||
"id": "production",
|
||||
"name": "production",
|
||||
"parameters": {
|
||||
"instance_type": "t3.large"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 2,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"api_key_scope": "all",
|
||||
"arch": "amd64",
|
||||
"auth": "token",
|
||||
"connection_timeout": 120,
|
||||
"dir": null,
|
||||
"display_apps": [
|
||||
{
|
||||
"port_forwarding_helper": true,
|
||||
"ssh_helper": true,
|
||||
"vscode": true,
|
||||
"vscode_insiders": false,
|
||||
"web_terminal": true
|
||||
}
|
||||
],
|
||||
"env": null,
|
||||
"id": "a6599d5f-c6b4-4f27-ae8f-0ec39e56747f",
|
||||
"init_script": "",
|
||||
"metadata": [],
|
||||
"motd_file": null,
|
||||
"order": null,
|
||||
"os": "linux",
|
||||
"resources_monitoring": [],
|
||||
"shutdown_script": null,
|
||||
"startup_script": null,
|
||||
"startup_script_behavior": "non-blocking",
|
||||
"token": "25368365-1ee0-4a55-b410-8dc98f1be40c",
|
||||
"troubleshooting_url": null
|
||||
},
|
||||
"sensitive_values": {
|
||||
"display_apps": [
|
||||
{}
|
||||
],
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/hashicorp/null",
|
||||
"schema_version": 0,
|
||||
"values": {
|
||||
"id": "3793102304452173529",
|
||||
"triggers": null
|
||||
},
|
||||
"sensitive_values": {},
|
||||
"depends_on": [
|
||||
"coder_agent.dev"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
25
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfplan.dot
generated
vendored
Normal file
25
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfplan.dot
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
digraph {
|
||||
compound = "true"
|
||||
newrank = "true"
|
||||
subgraph "root" {
|
||||
"[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"]
|
||||
"[root] data.coder_parameter.instance_type (expand)" [label = "data.coder_parameter.instance_type", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.development (expand)" [label = "data.coder_workspace_preset.development", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.production (expand)" [label = "data.coder_workspace_preset.production", shape = "box"]
|
||||
"[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"]
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"]
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"]
|
||||
"[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_parameter.instance_type (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_workspace_preset.development (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] data.coder_workspace_preset.production (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.development (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.production (expand)"
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)"
|
||||
}
|
||||
}
|
352
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfplan.json
generated
vendored
Normal file
352
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfplan.json
generated
vendored
Normal file
@@ -0,0 +1,352 @@
|
||||
{
|
||||
"format_version": "1.2",
|
||||
"terraform_version": "1.12.2",
|
||||
"planned_values": {
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"api_key_scope": "all",
|
||||
"arch": "amd64",
|
||||
"auth": "token",
|
||||
"connection_timeout": 120,
|
||||
"dir": null,
|
||||
"env": null,
|
||||
"metadata": [],
|
||||
"motd_file": null,
|
||||
"order": null,
|
||||
"os": "linux",
|
||||
"resources_monitoring": [],
|
||||
"shutdown_script": null,
|
||||
"startup_script": null,
|
||||
"startup_script_behavior": "non-blocking",
|
||||
"troubleshooting_url": null
|
||||
},
|
||||
"sensitive_values": {
|
||||
"display_apps": [],
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/hashicorp/null",
|
||||
"schema_version": 0,
|
||||
"values": {
|
||||
"triggers": null
|
||||
},
|
||||
"sensitive_values": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"resource_changes": [
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"change": {
|
||||
"actions": [
|
||||
"create"
|
||||
],
|
||||
"before": null,
|
||||
"after": {
|
||||
"api_key_scope": "all",
|
||||
"arch": "amd64",
|
||||
"auth": "token",
|
||||
"connection_timeout": 120,
|
||||
"dir": null,
|
||||
"env": null,
|
||||
"metadata": [],
|
||||
"motd_file": null,
|
||||
"order": null,
|
||||
"os": "linux",
|
||||
"resources_monitoring": [],
|
||||
"shutdown_script": null,
|
||||
"startup_script": null,
|
||||
"startup_script_behavior": "non-blocking",
|
||||
"troubleshooting_url": null
|
||||
},
|
||||
"after_unknown": {
|
||||
"display_apps": true,
|
||||
"id": true,
|
||||
"init_script": true,
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
},
|
||||
"before_sensitive": false,
|
||||
"after_sensitive": {
|
||||
"display_apps": [],
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/hashicorp/null",
|
||||
"change": {
|
||||
"actions": [
|
||||
"create"
|
||||
],
|
||||
"before": null,
|
||||
"after": {
|
||||
"triggers": null
|
||||
},
|
||||
"after_unknown": {
|
||||
"id": true
|
||||
},
|
||||
"before_sensitive": false,
|
||||
"after_sensitive": {}
|
||||
}
|
||||
}
|
||||
],
|
||||
"prior_state": {
|
||||
"format_version": "1.0",
|
||||
"terraform_version": "1.12.2",
|
||||
"values": {
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "data.coder_parameter.instance_type",
|
||||
"mode": "data",
|
||||
"type": "coder_parameter",
|
||||
"name": "instance_type",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "t3.micro",
|
||||
"description": "Instance type",
|
||||
"display_name": null,
|
||||
"ephemeral": false,
|
||||
"form_type": "input",
|
||||
"icon": null,
|
||||
"id": "9d27c698-0262-4681-9f34-3a43ecf50111",
|
||||
"mutable": false,
|
||||
"name": "instance_type",
|
||||
"option": null,
|
||||
"optional": true,
|
||||
"order": null,
|
||||
"styling": "{}",
|
||||
"type": "string",
|
||||
"validation": [],
|
||||
"value": "t3.micro"
|
||||
},
|
||||
"sensitive_values": {
|
||||
"validation": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.development",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "development",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": true,
|
||||
"id": "development",
|
||||
"name": "development",
|
||||
"parameters": {
|
||||
"instance_type": "t3.micro"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 1,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.production",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "production",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": false,
|
||||
"id": "production",
|
||||
"name": "production",
|
||||
"parameters": {
|
||||
"instance_type": "t3.large"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 2,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"configuration": {
|
||||
"provider_config": {
|
||||
"coder": {
|
||||
"name": "coder",
|
||||
"full_name": "registry.terraform.io/coder/coder",
|
||||
"version_constraint": ">= 2.3.0"
|
||||
},
|
||||
"null": {
|
||||
"name": "null",
|
||||
"full_name": "registry.terraform.io/hashicorp/null"
|
||||
}
|
||||
},
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"arch": {
|
||||
"constant_value": "amd64"
|
||||
},
|
||||
"os": {
|
||||
"constant_value": "linux"
|
||||
}
|
||||
},
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_config_key": "null",
|
||||
"schema_version": 0,
|
||||
"depends_on": [
|
||||
"coder_agent.dev"
|
||||
]
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.instance_type",
|
||||
"mode": "data",
|
||||
"type": "coder_parameter",
|
||||
"name": "instance_type",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"default": {
|
||||
"constant_value": "t3.micro"
|
||||
},
|
||||
"description": {
|
||||
"constant_value": "Instance type"
|
||||
},
|
||||
"name": {
|
||||
"constant_value": "instance_type"
|
||||
},
|
||||
"type": {
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.development",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "development",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"default": {
|
||||
"constant_value": true
|
||||
},
|
||||
"name": {
|
||||
"constant_value": "development"
|
||||
},
|
||||
"parameters": {
|
||||
"references": [
|
||||
"data.coder_parameter.instance_type.name",
|
||||
"data.coder_parameter.instance_type"
|
||||
]
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"instances": {
|
||||
"constant_value": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.production",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "production",
|
||||
"provider_config_key": "coder",
|
||||
"expressions": {
|
||||
"default": {
|
||||
"constant_value": false
|
||||
},
|
||||
"name": {
|
||||
"constant_value": "production"
|
||||
},
|
||||
"parameters": {
|
||||
"references": [
|
||||
"data.coder_parameter.instance_type.name",
|
||||
"data.coder_parameter.instance_type"
|
||||
]
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"instances": {
|
||||
"constant_value": 2
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"timestamp": "2025-06-19T12:43:58Z",
|
||||
"applyable": true,
|
||||
"complete": true,
|
||||
"errored": false
|
||||
}
|
25
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfstate.dot
generated
vendored
Normal file
25
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfstate.dot
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
digraph {
|
||||
compound = "true"
|
||||
newrank = "true"
|
||||
subgraph "root" {
|
||||
"[root] coder_agent.dev (expand)" [label = "coder_agent.dev", shape = "box"]
|
||||
"[root] data.coder_parameter.instance_type (expand)" [label = "data.coder_parameter.instance_type", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.development (expand)" [label = "data.coder_workspace_preset.development", shape = "box"]
|
||||
"[root] data.coder_workspace_preset.production (expand)" [label = "data.coder_workspace_preset.production", shape = "box"]
|
||||
"[root] null_resource.dev (expand)" [label = "null_resource.dev", shape = "box"]
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"]" [label = "provider[\"registry.terraform.io/coder/coder\"]", shape = "diamond"]
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"]" [label = "provider[\"registry.terraform.io/hashicorp/null\"]", shape = "diamond"]
|
||||
"[root] coder_agent.dev (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_parameter.instance_type (expand)" -> "[root] provider[\"registry.terraform.io/coder/coder\"]"
|
||||
"[root] data.coder_workspace_preset.development (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] data.coder_workspace_preset.production (expand)" -> "[root] data.coder_parameter.instance_type (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] null_resource.dev (expand)" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"]"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] coder_agent.dev (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.development (expand)"
|
||||
"[root] provider[\"registry.terraform.io/coder/coder\"] (close)" -> "[root] data.coder_workspace_preset.production (expand)"
|
||||
"[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)" -> "[root] null_resource.dev (expand)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/coder/coder\"] (close)"
|
||||
"[root] root" -> "[root] provider[\"registry.terraform.io/hashicorp/null\"] (close)"
|
||||
}
|
||||
}
|
164
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfstate.json
generated
vendored
Normal file
164
provisioner/terraform/testdata/resources/presets-single-default/presets-single-default.tfstate.json
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
{
|
||||
"format_version": "1.0",
|
||||
"terraform_version": "1.12.2",
|
||||
"values": {
|
||||
"root_module": {
|
||||
"resources": [
|
||||
{
|
||||
"address": "data.coder_parameter.instance_type",
|
||||
"mode": "data",
|
||||
"type": "coder_parameter",
|
||||
"name": "instance_type",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "t3.micro",
|
||||
"description": "Instance type",
|
||||
"display_name": null,
|
||||
"ephemeral": false,
|
||||
"form_type": "input",
|
||||
"icon": null,
|
||||
"id": "1c507aa1-6626-4b68-b68f-fadd95421004",
|
||||
"mutable": false,
|
||||
"name": "instance_type",
|
||||
"option": null,
|
||||
"optional": true,
|
||||
"order": null,
|
||||
"styling": "{}",
|
||||
"type": "string",
|
||||
"validation": [],
|
||||
"value": "t3.micro"
|
||||
},
|
||||
"sensitive_values": {
|
||||
"validation": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.development",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "development",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": true,
|
||||
"id": "development",
|
||||
"name": "development",
|
||||
"parameters": {
|
||||
"instance_type": "t3.micro"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 1,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.production",
|
||||
"mode": "data",
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "production",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": false,
|
||||
"id": "production",
|
||||
"name": "production",
|
||||
"parameters": {
|
||||
"instance_type": "t3.large"
|
||||
},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"instances": 2,
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"sensitive_values": {
|
||||
"parameters": {},
|
||||
"prebuilds": [
|
||||
{
|
||||
"expiration_policy": [],
|
||||
"scheduling": []
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "coder_agent.dev",
|
||||
"mode": "managed",
|
||||
"type": "coder_agent",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"api_key_scope": "all",
|
||||
"arch": "amd64",
|
||||
"auth": "token",
|
||||
"connection_timeout": 120,
|
||||
"dir": null,
|
||||
"display_apps": [
|
||||
{
|
||||
"port_forwarding_helper": true,
|
||||
"ssh_helper": true,
|
||||
"vscode": true,
|
||||
"vscode_insiders": false,
|
||||
"web_terminal": true
|
||||
}
|
||||
],
|
||||
"env": null,
|
||||
"id": "5d66372f-a526-44ee-9eac-0c16bcc57aa2",
|
||||
"init_script": "",
|
||||
"metadata": [],
|
||||
"motd_file": null,
|
||||
"order": null,
|
||||
"os": "linux",
|
||||
"resources_monitoring": [],
|
||||
"shutdown_script": null,
|
||||
"startup_script": null,
|
||||
"startup_script_behavior": "non-blocking",
|
||||
"token": "70ab06e5-ef86-4ac2-a1d9-58c8ad85d379",
|
||||
"troubleshooting_url": null
|
||||
},
|
||||
"sensitive_values": {
|
||||
"display_apps": [
|
||||
{}
|
||||
],
|
||||
"metadata": [],
|
||||
"resources_monitoring": [],
|
||||
"token": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"address": "null_resource.dev",
|
||||
"mode": "managed",
|
||||
"type": "null_resource",
|
||||
"name": "dev",
|
||||
"provider_name": "registry.terraform.io/hashicorp/null",
|
||||
"schema_version": 0,
|
||||
"values": {
|
||||
"id": "3636304087019022806",
|
||||
"triggers": null
|
||||
},
|
||||
"sensitive_values": {},
|
||||
"depends_on": [
|
||||
"coder_agent.dev"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
46
provisioner/terraform/testdata/resources/presets-single-default/single-default.tf
vendored
Normal file
46
provisioner/terraform/testdata/resources/presets-single-default/single-default.tf
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = ">= 2.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_parameter" "instance_type" {
|
||||
name = "instance_type"
|
||||
type = "string"
|
||||
description = "Instance type"
|
||||
default = "t3.micro"
|
||||
}
|
||||
|
||||
data "coder_workspace_preset" "development" {
|
||||
name = "development"
|
||||
default = true
|
||||
parameters = {
|
||||
(data.coder_parameter.instance_type.name) = "t3.micro"
|
||||
}
|
||||
prebuilds {
|
||||
instances = 1
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_workspace_preset" "production" {
|
||||
name = "production"
|
||||
default = false
|
||||
parameters = {
|
||||
(data.coder_parameter.instance_type.name) = "t3.large"
|
||||
}
|
||||
prebuilds {
|
||||
instances = 2
|
||||
}
|
||||
}
|
||||
|
||||
resource "coder_agent" "dev" {
|
||||
os = "linux"
|
||||
arch = "amd64"
|
||||
}
|
||||
|
||||
resource "null_resource" "dev" {
|
||||
depends_on = [coder_agent.dev]
|
||||
}
|
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "2.3.0-pre2"
|
||||
version = ">= 2.3.0"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
|
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "2.3.0-pre2"
|
||||
version = ">= 2.3.0"
|
||||
}
|
||||
docker = {
|
||||
source = "kreuzwerker/docker"
|
||||
|
@@ -2,7 +2,7 @@ terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = "2.3.0-pre2"
|
||||
version = ">= 2.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
27
provisioner/terraform/testdata/resources/presets/presets.tfplan.json
generated
vendored
27
provisioner/terraform/testdata/resources/presets/presets.tfplan.json
generated
vendored
@@ -130,7 +130,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "sample",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ok",
|
||||
"description": "blah blah",
|
||||
@@ -159,8 +159,9 @@
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "MyFirstProject",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": false,
|
||||
"id": "My First Project",
|
||||
"name": "My First Project",
|
||||
"parameters": {
|
||||
@@ -221,7 +222,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from module",
|
||||
@@ -250,7 +251,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from module",
|
||||
@@ -284,7 +285,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from child module",
|
||||
@@ -313,7 +314,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from child module",
|
||||
@@ -350,7 +351,7 @@
|
||||
"coder": {
|
||||
"name": "coder",
|
||||
"full_name": "registry.terraform.io/coder/coder",
|
||||
"version_constraint": "2.3.0-pre2"
|
||||
"version_constraint": ">= 2.3.0"
|
||||
},
|
||||
"module.this_is_external_module:docker": {
|
||||
"name": "docker",
|
||||
@@ -412,7 +413,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_workspace_preset.MyFirstProject",
|
||||
@@ -470,7 +471,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
],
|
||||
"module_calls": {
|
||||
@@ -501,7 +502,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.second_parameter_from_module",
|
||||
@@ -526,7 +527,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
],
|
||||
"module_calls": {
|
||||
@@ -557,7 +558,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.child_second_parameter_from_module",
|
||||
@@ -582,7 +583,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
13
provisioner/terraform/testdata/resources/presets/presets.tfstate.json
generated
vendored
13
provisioner/terraform/testdata/resources/presets/presets.tfstate.json
generated
vendored
@@ -10,7 +10,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "sample",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ok",
|
||||
"description": "blah blah",
|
||||
@@ -39,8 +39,9 @@
|
||||
"type": "coder_workspace_preset",
|
||||
"name": "MyFirstProject",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": false,
|
||||
"id": "My First Project",
|
||||
"name": "My First Project",
|
||||
"parameters": {
|
||||
@@ -162,7 +163,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from module",
|
||||
@@ -191,7 +192,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from module",
|
||||
@@ -225,7 +226,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from child module",
|
||||
@@ -254,7 +255,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from child module",
|
||||
|
@@ -130,7 +130,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": null,
|
||||
"description": null,
|
||||
@@ -159,7 +159,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "sample",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ok",
|
||||
"description": "blah blah",
|
||||
@@ -244,7 +244,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.sample",
|
||||
@@ -269,7 +269,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": null,
|
||||
"description": null,
|
||||
@@ -39,7 +39,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "sample",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ok",
|
||||
"description": "blah blah",
|
||||
|
@@ -130,7 +130,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -159,7 +159,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_max",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -200,7 +200,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_max_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "-3",
|
||||
"description": null,
|
||||
@@ -241,7 +241,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -282,7 +282,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_max",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -323,7 +323,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -426,7 +426,7 @@
|
||||
"constant_value": "number"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_max",
|
||||
@@ -452,7 +452,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_max_zero",
|
||||
@@ -478,7 +478,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_min",
|
||||
@@ -504,7 +504,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_min_max",
|
||||
@@ -533,7 +533,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_min_zero",
|
||||
@@ -559,7 +559,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -39,7 +39,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_max",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -80,7 +80,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_max_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "-3",
|
||||
"description": null,
|
||||
@@ -121,7 +121,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -162,7 +162,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_max",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -203,7 +203,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
|
40
provisioner/terraform/testdata/resources/rich-parameters/rich-parameters.tfplan.json
generated
vendored
40
provisioner/terraform/testdata/resources/rich-parameters/rich-parameters.tfplan.json
generated
vendored
@@ -130,7 +130,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": null,
|
||||
"description": null,
|
||||
@@ -176,7 +176,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -205,7 +205,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_max_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "-2",
|
||||
"description": null,
|
||||
@@ -246,7 +246,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_max",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -287,7 +287,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -328,7 +328,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "sample",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ok",
|
||||
"description": "blah blah",
|
||||
@@ -361,7 +361,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from module",
|
||||
@@ -390,7 +390,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from module",
|
||||
@@ -424,7 +424,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from child module",
|
||||
@@ -453,7 +453,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from child module",
|
||||
@@ -564,7 +564,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example",
|
||||
@@ -583,7 +583,7 @@
|
||||
"constant_value": "number"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_max_zero",
|
||||
@@ -612,7 +612,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_min_max",
|
||||
@@ -641,7 +641,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.number_example_min_zero",
|
||||
@@ -670,7 +670,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.sample",
|
||||
@@ -692,7 +692,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
],
|
||||
"module_calls": {
|
||||
@@ -723,7 +723,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.second_parameter_from_module",
|
||||
@@ -748,7 +748,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
],
|
||||
"module_calls": {
|
||||
@@ -779,7 +779,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
},
|
||||
{
|
||||
"address": "data.coder_parameter.child_second_parameter_from_module",
|
||||
@@ -804,7 +804,7 @@
|
||||
"constant_value": "string"
|
||||
}
|
||||
},
|
||||
"schema_version": 0
|
||||
"schema_version": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
20
provisioner/terraform/testdata/resources/rich-parameters/rich-parameters.tfstate.json
generated
vendored
20
provisioner/terraform/testdata/resources/rich-parameters/rich-parameters.tfstate.json
generated
vendored
@@ -10,7 +10,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": null,
|
||||
"description": null,
|
||||
@@ -56,7 +56,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -85,7 +85,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_max_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "-2",
|
||||
"description": null,
|
||||
@@ -126,7 +126,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_max",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -167,7 +167,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "number_example_min_zero",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "4",
|
||||
"description": null,
|
||||
@@ -208,7 +208,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "sample",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ok",
|
||||
"description": "blah blah",
|
||||
@@ -302,7 +302,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from module",
|
||||
@@ -331,7 +331,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from module",
|
||||
@@ -365,7 +365,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_first_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "abcdef",
|
||||
"description": "First parameter from child module",
|
||||
@@ -394,7 +394,7 @@
|
||||
"type": "coder_parameter",
|
||||
"name": "child_second_parameter_from_module",
|
||||
"provider_name": "registry.terraform.io/coder/coder",
|
||||
"schema_version": 0,
|
||||
"schema_version": 1,
|
||||
"values": {
|
||||
"default": "ghijkl",
|
||||
"description": "Second parameter from child module",
|
||||
|
@@ -38,6 +38,7 @@ import "github.com/coder/coder/v2/apiversion"
|
||||
// and schedule rules to define cron-based scaling of prebuilt workspace
|
||||
// instances based on time patterns.
|
||||
// - Added new field named `id` to `App`, which transports the ID generated by the coder_app provider to be persisted.
|
||||
// - Added new field named `default` to `Preset`.
|
||||
const (
|
||||
CurrentMajor = 1
|
||||
CurrentMinor = 7
|
||||
|
1094
provisionersdk/proto/provisioner.pb.go
generated
1094
provisionersdk/proto/provisioner.pb.go
generated
File diff suppressed because it is too large
Load Diff
@@ -100,6 +100,7 @@ message Preset {
|
||||
string name = 1;
|
||||
repeated PresetParameter parameters = 2;
|
||||
Prebuild prebuild = 3;
|
||||
bool default = 4;
|
||||
}
|
||||
|
||||
message PresetParameter {
|
||||
|
4
site/e2e/provisionerGenerated.ts
generated
4
site/e2e/provisionerGenerated.ts
generated
@@ -161,6 +161,7 @@ export interface Preset {
|
||||
name: string;
|
||||
parameters: PresetParameter[];
|
||||
prebuild: Prebuild | undefined;
|
||||
default: boolean;
|
||||
}
|
||||
|
||||
export interface PresetParameter {
|
||||
@@ -692,6 +693,9 @@ export const Preset = {
|
||||
if (message.prebuild !== undefined) {
|
||||
Prebuild.encode(message.prebuild, writer.uint32(26).fork()).ldelim();
|
||||
}
|
||||
if (message.default === true) {
|
||||
writer.uint32(32).bool(message.default);
|
||||
}
|
||||
return writer;
|
||||
},
|
||||
};
|
||||
|
1
site/src/api/typesGenerated.ts
generated
1
site/src/api/typesGenerated.ts
generated
@@ -1830,6 +1830,7 @@ export interface Preset {
|
||||
readonly ID: string;
|
||||
readonly Name: string;
|
||||
readonly Parameters: readonly PresetParameter[];
|
||||
readonly Default: boolean;
|
||||
}
|
||||
|
||||
// From codersdk/presets.go
|
||||
|
@@ -125,6 +125,7 @@ export const PresetsButNoneSelected: Story = {
|
||||
{
|
||||
ID: "preset-1",
|
||||
Name: "Preset 1",
|
||||
Default: false,
|
||||
Parameters: [
|
||||
{
|
||||
Name: MockTemplateVersionParameter1.name,
|
||||
@@ -135,6 +136,7 @@ export const PresetsButNoneSelected: Story = {
|
||||
{
|
||||
ID: "preset-2",
|
||||
Name: "Preset 2",
|
||||
Default: false,
|
||||
Parameters: [
|
||||
{
|
||||
Name: MockTemplateVersionParameter2.name,
|
||||
@@ -241,6 +243,45 @@ export const PresetNoneSelected: Story = {
|
||||
},
|
||||
};
|
||||
|
||||
export const PresetsWithDefault: Story = {
|
||||
args: {
|
||||
presets: [
|
||||
{
|
||||
ID: "preset-1",
|
||||
Name: "Preset 1",
|
||||
Default: false,
|
||||
Parameters: [
|
||||
{
|
||||
Name: MockTemplateVersionParameter1.name,
|
||||
Value: "preset 1 override",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
ID: "preset-2",
|
||||
Name: "Preset 2",
|
||||
Default: true,
|
||||
Parameters: [
|
||||
{
|
||||
Name: MockTemplateVersionParameter2.name,
|
||||
Value: "150189",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
parameters: [
|
||||
MockTemplateVersionParameter1,
|
||||
MockTemplateVersionParameter2,
|
||||
MockTemplateVersionParameter3,
|
||||
],
|
||||
},
|
||||
play: async ({ canvasElement }) => {
|
||||
const canvas = within(canvasElement);
|
||||
// Toggle off the show preset parameters switch
|
||||
await userEvent.click(canvas.getByLabelText("Show preset parameters"));
|
||||
},
|
||||
};
|
||||
|
||||
export const ExternalAuth: Story = {
|
||||
args: {
|
||||
externalAuth: [
|
||||
|
@@ -152,21 +152,31 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
|
||||
const [presetOptions, setPresetOptions] = useState([
|
||||
{ label: "None", value: "" },
|
||||
]);
|
||||
useEffect(() => {
|
||||
setPresetOptions([
|
||||
{ label: "None", value: "" },
|
||||
...presets.map((preset) => ({
|
||||
label: preset.Name,
|
||||
value: preset.ID,
|
||||
})),
|
||||
]);
|
||||
}, [presets]);
|
||||
|
||||
const [selectedPresetIndex, setSelectedPresetIndex] = useState(0);
|
||||
// Build options and keep default label/value in sync
|
||||
useEffect(() => {
|
||||
const options = [
|
||||
{ label: "None", value: "" },
|
||||
...presets.map((p) => ({
|
||||
label: p.Default ? `${p.Name} (Default)` : p.Name,
|
||||
value: p.ID,
|
||||
})),
|
||||
];
|
||||
setPresetOptions(options);
|
||||
const defaultPreset = presets.find((p) => p.Default);
|
||||
if (defaultPreset) {
|
||||
const idx = presets.indexOf(defaultPreset) + 1; // +1 for "None"
|
||||
setSelectedPresetIndex(idx);
|
||||
form.setFieldValue("template_version_preset_id", defaultPreset.ID);
|
||||
} else {
|
||||
setSelectedPresetIndex(0); // Explicitly set to "None"
|
||||
form.setFieldValue("template_version_preset_id", undefined);
|
||||
}
|
||||
}, [presets, form.setFieldValue]);
|
||||
|
||||
const [presetParameterNames, setPresetParameterNames] = useState<string[]>(
|
||||
[],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const selectedPresetOption = presetOptions[selectedPresetIndex];
|
||||
let selectedPreset: TypesGen.Preset | undefined;
|
||||
|
@@ -190,13 +190,25 @@ export const CreateWorkspacePageViewExperimental: FC<
|
||||
setPresetOptions([
|
||||
{ label: "None", value: "None" },
|
||||
...presets.map((preset) => ({
|
||||
label: preset.Name,
|
||||
label: preset.Default ? `${preset.Name} (Default)` : preset.Name,
|
||||
value: preset.ID,
|
||||
})),
|
||||
]);
|
||||
}, [presets]);
|
||||
|
||||
const [selectedPresetIndex, setSelectedPresetIndex] = useState(0);
|
||||
|
||||
// Set default preset when presets are loaded
|
||||
useEffect(() => {
|
||||
const defaultPreset = presets.find((preset) => preset.Default);
|
||||
if (defaultPreset) {
|
||||
// +1 because "None" is at index 0
|
||||
const defaultIndex =
|
||||
presets.findIndex((preset) => preset.ID === defaultPreset.ID) + 1;
|
||||
setSelectedPresetIndex(defaultIndex);
|
||||
}
|
||||
}, [presets]);
|
||||
|
||||
const [presetParameterNames, setPresetParameterNames] = useState<string[]>(
|
||||
[],
|
||||
);
|
||||
@@ -555,6 +567,7 @@ export const CreateWorkspacePageViewExperimental: FC<
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="max-w-lg">
|
||||
<Select
|
||||
value={presetOptions[selectedPresetIndex]?.value}
|
||||
onValueChange={(option) => {
|
||||
const index = presetOptions.findIndex(
|
||||
(preset) => preset.value === option,
|
||||
|
Reference in New Issue
Block a user