Skip to content

Commit 01163ea

Browse files
authored
feat: allow users to pause prebuilt workspace reconciliation (#18700)
This PR provides two commands: * `coder prebuilds pause` * `coder prebuilds resume` These allow the suspension of all prebuilds activity, intended for use if prebuilds are misbehaving.
1 parent 4072d22 commit 01163ea

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1336
-4
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/audit/diff.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type Auditable interface {
2424
database.NotificationsSettings |
2525
database.OAuth2ProviderApp |
2626
database.OAuth2ProviderAppSecret |
27+
database.PrebuildsSettings |
2728
database.CustomRole |
2829
database.AuditableOrganizationMember |
2930
database.Organization |

coderd/audit/request.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ func ResourceTarget[T Auditable](tgt T) string {
113113
return "" // no target?
114114
case database.NotificationsSettings:
115115
return "" // no target?
116+
case database.PrebuildsSettings:
117+
return "" // no target?
116118
case database.OAuth2ProviderApp:
117119
return typed.Name
118120
case database.OAuth2ProviderAppSecret:
@@ -176,6 +178,9 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
176178
case database.NotificationsSettings:
177179
// Artificial ID for auditing purposes
178180
return typed.ID
181+
case database.PrebuildsSettings:
182+
// Artificial ID for auditing purposes
183+
return typed.ID
179184
case database.OAuth2ProviderApp:
180185
return typed.ID
181186
case database.OAuth2ProviderAppSecret:
@@ -231,6 +236,8 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
231236
return database.ResourceTypeHealthSettings
232237
case database.NotificationsSettings:
233238
return database.ResourceTypeNotificationsSettings
239+
case database.PrebuildsSettings:
240+
return database.ResourceTypePrebuildsSettings
234241
case database.OAuth2ProviderApp:
235242
return database.ResourceTypeOauth2ProviderApp
236243
case database.OAuth2ProviderAppSecret:
@@ -288,6 +295,9 @@ func ResourceRequiresOrgID[T Auditable]() bool {
288295
case database.NotificationsSettings:
289296
// Artificial ID for auditing purposes
290297
return false
298+
case database.PrebuildsSettings:
299+
// Artificial ID for auditing purposes
300+
return false
291301
case database.OAuth2ProviderApp:
292302
return false
293303
case database.OAuth2ProviderAppSecret:

coderd/database/dbauthz/dbauthz.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,6 +2304,10 @@ func (q *querier) GetPrebuildMetrics(ctx context.Context) ([]database.GetPrebuil
23042304
return q.db.GetPrebuildMetrics(ctx)
23052305
}
23062306

2307+
func (q *querier) GetPrebuildsSettings(ctx context.Context) (string, error) {
2308+
return q.db.GetPrebuildsSettings(ctx)
2309+
}
2310+
23072311
func (q *querier) GetPresetByID(ctx context.Context, presetID uuid.UUID) (database.GetPresetByIDRow, error) {
23082312
empty := database.GetPresetByIDRow{}
23092313

@@ -5101,6 +5105,13 @@ func (q *querier) UpsertOAuthSigningKey(ctx context.Context, value string) error
51015105
return q.db.UpsertOAuthSigningKey(ctx, value)
51025106
}
51035107

5108+
func (q *querier) UpsertPrebuildsSettings(ctx context.Context, value string) error {
5109+
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceDeploymentConfig); err != nil {
5110+
return err
5111+
}
5112+
return q.db.UpsertPrebuildsSettings(ctx, value)
5113+
}
5114+
51045115
func (q *querier) UpsertProvisionerDaemon(ctx context.Context, arg database.UpsertProvisionerDaemonParams) (database.ProvisionerDaemon, error) {
51055116
res := rbac.ResourceProvisionerDaemon.InOrg(arg.OrganizationID)
51065117
if arg.Tags[provisionersdk.TagScope] == provisionersdk.ScopeUser {

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5071,6 +5071,12 @@ func (s *MethodTestSuite) TestPrebuilds() {
50715071
check.Args().
50725072
Asserts(rbac.ResourceWorkspace.All(), policy.ActionRead)
50735073
}))
5074+
s.Run("GetPrebuildsSettings", s.Subtest(func(db database.Store, check *expects) {
5075+
check.Args().Asserts()
5076+
}))
5077+
s.Run("UpsertPrebuildsSettings", s.Subtest(func(db database.Store, check *expects) {
5078+
check.Args("foo").Asserts(rbac.ResourceDeploymentConfig, policy.ActionUpdate)
5079+
}))
50745080
s.Run("CountInProgressPrebuilds", s.Subtest(func(_ database.Store, check *expects) {
50755081
check.Args().
50765082
Asserts(rbac.ResourceWorkspace.All(), policy.ActionRead).

coderd/database/dbmem/dbmem.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ type data struct {
297297
presets []database.TemplateVersionPreset
298298
presetParameters []database.TemplateVersionPresetParameter
299299
presetPrebuildSchedules []database.TemplateVersionPresetPrebuildSchedule
300+
prebuildsSettings []byte
300301
}
301302

302303
func tryPercentileCont(fs []float64, p float64) float64 {
@@ -4277,7 +4278,14 @@ func (*FakeQuerier) GetPrebuildMetrics(_ context.Context) ([]database.GetPrebuil
42774278
return make([]database.GetPrebuildMetricsRow, 0), nil
42784279
}
42794280

4280-
func (q *FakeQuerier) GetPresetByID(ctx context.Context, presetID uuid.UUID) (database.GetPresetByIDRow, error) {
4281+
func (q *FakeQuerier) GetPrebuildsSettings(_ context.Context) (string, error) {
4282+
q.mutex.RLock()
4283+
defer q.mutex.RUnlock()
4284+
4285+
return string(slices.Clone(q.prebuildsSettings)), nil
4286+
}
4287+
4288+
func (q *FakeQuerier) GetPresetByID(_ context.Context, presetID uuid.UUID) (database.GetPresetByIDRow, error) {
42814289
q.mutex.RLock()
42824290
defer q.mutex.RUnlock()
42834291

@@ -12316,6 +12324,14 @@ func (q *FakeQuerier) UpsertOAuthSigningKey(_ context.Context, value string) err
1231612324
return nil
1231712325
}
1231812326

12327+
func (q *FakeQuerier) UpsertPrebuildsSettings(_ context.Context, value string) error {
12328+
q.mutex.Lock()
12329+
defer q.mutex.Unlock()
12330+
12331+
q.prebuildsSettings = []byte(value)
12332+
return nil
12333+
}
12334+
1231912335
func (q *FakeQuerier) UpsertProvisionerDaemon(_ context.Context, arg database.UpsertProvisionerDaemonParams) (database.ProvisionerDaemon, error) {
1232012336
if err := validateDatabaseType(arg); err != nil {
1232112337
return database.ProvisionerDaemon{}, err

coderd/database/dbmetrics/querymetrics.go

Lines changed: 14 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: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dump.sql

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)