Skip to content

Commit adf98d2

Browse files
committed
feat: add resource replacement notification
Signed-off-by: Danny Kopping <dannykopping@gmail.com>
1 parent b31ed5e commit adf98d2

25 files changed

+316
-93
lines changed

coderd/coderd.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,6 +1763,11 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
17631763
return nil, xerrors.Errorf("failed to create in-memory provisioner daemon: %w", err)
17641764
}
17651765

1766+
var prebuildsOrchestrator prebuilds.ReconciliationOrchestrator
1767+
if val := api.PrebuildsReconciler.Load(); val != nil {
1768+
prebuildsOrchestrator = *val
1769+
}
1770+
17661771
mux := drpcmux.New()
17671772
api.Logger.Debug(dialCtx, "starting in-memory provisioner daemon", slog.F("name", name))
17681773
logger := api.Logger.Named(fmt.Sprintf("inmem-provisionerd-%s", name))
@@ -1790,6 +1795,7 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
17901795
Clock: api.Clock,
17911796
},
17921797
api.NotificationsEnqueuer,
1798+
prebuildsOrchestrator,
17931799
)
17941800
if err != nil {
17951801
return nil, err

coderd/database/dbauthz/dbauthz.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,6 +2524,13 @@ func (q *querier) GetTemplateParameterInsights(ctx context.Context, arg database
25242524
return q.db.GetTemplateParameterInsights(ctx, arg)
25252525
}
25262526

2527+
func (q *querier) GetTemplatePresetsByID(ctx context.Context, id uuid.UUID) (database.TemplateVersionPreset, error) {
2528+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate.All()); err != nil {
2529+
return database.TemplateVersionPreset{}, err
2530+
}
2531+
return q.db.GetTemplatePresetsByID(ctx, id)
2532+
}
2533+
25272534
func (q *querier) GetTemplatePresetsWithPrebuilds(ctx context.Context, templateID uuid.NullUUID) ([]database.GetTemplatePresetsWithPrebuildsRow, error) {
25282535
// GetTemplatePresetsWithPrebuilds retrieves template versions with configured presets and prebuilds.
25292536
// Presets and prebuilds are part of the template, so if you can access templates - you can access them as well.

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4873,6 +4873,27 @@ func (s *MethodTestSuite) TestPrebuilds() {
48734873
Asserts(rbac.ResourceTemplate.All(), policy.ActionRead).
48744874
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
48754875
}))
4876+
s.Run("GetTemplatePresetsByID", s.Subtest(func(db database.Store, check *expects) {
4877+
org := dbgen.Organization(s.T(), db, database.Organization{})
4878+
user := dbgen.User(s.T(), db, database.User{})
4879+
t := dbgen.Template(s.T(), db, database.Template{
4880+
OrganizationID: org.ID,
4881+
CreatedBy: user.ID,
4882+
})
4883+
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
4884+
TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true},
4885+
OrganizationID: org.ID,
4886+
CreatedBy: user.ID,
4887+
})
4888+
preset := dbgen.Preset(s.T(), db, database.InsertPresetParams{
4889+
TemplateVersionID: tv.ID,
4890+
Name: "my-preset",
4891+
DesiredInstances: sql.NullInt32{Int32: 1, Valid: true},
4892+
})
4893+
check.Args(preset.ID).
4894+
Asserts(rbac.ResourceTemplate.All(), policy.ActionRead).
4895+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4896+
}))
48764897
s.Run("GetPresetByID", s.Subtest(func(db database.Store, check *expects) {
48774898
org := dbgen.Organization(s.T(), db, database.Organization{})
48784899
user := dbgen.User(s.T(), db, database.User{})

coderd/database/dbmem/dbmem.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6072,6 +6072,10 @@ func (q *FakeQuerier) GetTemplateParameterInsights(ctx context.Context, arg data
60726072
return rows, nil
60736073
}
60746074

6075+
func (q *FakeQuerier) GetTemplatePresetsByID(ctx context.Context, id uuid.UUID) (database.TemplateVersionPreset, error) {
6076+
return database.TemplateVersionPreset{}, ErrUnimplemented
6077+
}
6078+
60756079
func (*FakeQuerier) GetTemplatePresetsWithPrebuilds(_ context.Context, _ uuid.NullUUID) ([]database.GetTemplatePresetsWithPrebuildsRow, error) {
60766080
return nil, ErrUnimplemented
60776081
}

coderd/database/dbmetrics/querymetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/migrations/000320_resource_replacements_notification.up.sql

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ VALUES ('89d9745a-816e-4695-a17f-3d0a229e2b8d',
55
E'There might be a problem with a recently claimed prebuilt workspace',
66
$$
77
Workspace **{{.Labels.workspace}}** was claimed from a prebuilt workspace by **{{.Labels.claimant}}**.
8+
89
During the claim, Terraform destroyed and recreated the following resources
910
because one or more immutable attributes changed:
1011

@@ -16,12 +17,18 @@ When Terraform must change an immutable attribute, it replaces the entire resour
1617
If you’re using prebuilds to speed up provisioning, unexpected replacements will slow down
1718
workspace startup—even when claiming a prebuilt environment.
1819

19-
For tips on preventing replacements and improving claim performance, see [this guide](https://coder.com/docs/TODO).
20+
For tips on preventing replacements and improving claim performance, see [this guide](https://coder.com/docs/admin/templates/extending-templates/prebuilt-workspaces.md#preventing-resource-replacement).
21+
22+
NOTE: this prebuilt workspace used the **{{.Labels.preset}}** preset.
2023
$$,
21-
'Workspace Events',
24+
'Template Events',
2225
'[
2326
{
2427
"label": "View workspace build",
2528
"url": "{{base_url}}/@{{.Labels.claimant}}/{{.Labels.workspace}}/builds/{{.Labels.workspace_build_num}}"
29+
},
30+
{
31+
"label": "View template version",
32+
"url": "{{base_url}}/templates/{{.Labels.org}}/{{.Labels.template}}/versions/{{.Labels.template_version}}"
2633
}
2734
]'::jsonb);

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/prebuilds.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ FROM templates t
4242
WHERE tvp.desired_instances IS NOT NULL -- Consider only presets that have a prebuild configuration.
4343
AND (t.id = sqlc.narg('template_id')::uuid OR sqlc.narg('template_id') IS NULL);
4444

45+
-- name: GetTemplatePresetsByID :one
46+
SELECT *
47+
FROM template_version_presets
48+
WHERE id = $1;
49+
4550
-- name: GetRunningPrebuiltWorkspaces :many
4651
SELECT
4752
p.id,

0 commit comments

Comments
 (0)