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)
pFad - Phonifier reborn

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

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


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy