Skip to content

Commit 30a924d

Browse files
feat: implement autoscaling mechanism for prebuilds
1 parent e4648b6 commit 30a924d

26 files changed

+1414
-809
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,6 +2267,13 @@ func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, ar
22672267
return q.db.GetPresetParametersByTemplateVersionID(ctx, args)
22682268
}
22692269

2270+
func (q *querier) GetPresetPrebuildSchedules(ctx context.Context) ([]database.TemplateVersionPresetPrebuildSchedule, error) {
2271+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate.All()); err != nil {
2272+
return nil, err
2273+
}
2274+
return q.db.GetPresetPrebuildSchedules(ctx)
2275+
}
2276+
22702277
func (q *querier) GetPresetsAtFailureLimit(ctx context.Context, hardLimit int64) ([]database.GetPresetsAtFailureLimitRow, error) {
22712278
// GetPresetsAtFailureLimit returns a list of template version presets that have reached the hard failure limit.
22722279
// Request the same authorization permissions as GetPresetsBackoff, since the methods are similar.
@@ -3618,6 +3625,15 @@ func (q *querier) InsertPresetParameters(ctx context.Context, arg database.Inser
36183625
return q.db.InsertPresetParameters(ctx, arg)
36193626
}
36203627

3628+
func (q *querier) InsertPresetPrebuildSchedule(ctx context.Context, arg database.InsertPresetPrebuildScheduleParams) ([]database.TemplateVersionPresetPrebuildSchedule, error) {
3629+
err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTemplate)
3630+
if err != nil {
3631+
return nil, err
3632+
}
3633+
3634+
return q.db.InsertPresetPrebuildSchedule(ctx, arg)
3635+
}
3636+
36213637
func (q *querier) InsertProvisionerJob(ctx context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
36223638
// TODO: Remove this once we have a proper rbac check for provisioner jobs.
36233639
// Details in https://github.com/coder/coder/issues/16160

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,28 @@ func (s *MethodTestSuite) TestOrganization() {
979979
}
980980
check.Args(insertPresetParametersParams).Asserts(rbac.ResourceTemplate, policy.ActionUpdate)
981981
}))
982+
s.Run("InsertPresetPrebuildSchedule", s.Subtest(func(db database.Store, check *expects) {
983+
org := dbgen.Organization(s.T(), db, database.Organization{})
984+
user := dbgen.User(s.T(), db, database.User{})
985+
template := dbgen.Template(s.T(), db, database.Template{
986+
CreatedBy: user.ID,
987+
OrganizationID: org.ID,
988+
})
989+
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
990+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
991+
OrganizationID: org.ID,
992+
CreatedBy: user.ID,
993+
})
994+
insertPresetParams := database.InsertPresetParams{
995+
TemplateVersionID: templateVersion.ID,
996+
Name: "test",
997+
}
998+
preset := dbgen.Preset(s.T(), db, insertPresetParams)
999+
insertPresetPrebuildScheduleParams := database.InsertPresetPrebuildScheduleParams{
1000+
PresetID: preset.ID,
1001+
}
1002+
check.Args(insertPresetPrebuildScheduleParams).Asserts(rbac.ResourceTemplate, policy.ActionUpdate)
1003+
}))
9821004
s.Run("DeleteOrganizationMember", s.Subtest(func(db database.Store, check *expects) {
9831005
o := dbgen.Organization(s.T(), db, database.Organization{})
9841006
u := dbgen.User(s.T(), db, database.User{})

coderd/database/dbmem/dbmem.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4369,6 +4369,10 @@ func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context,
43694369
return parameters, nil
43704370
}
43714371

4372+
func (q *FakeQuerier) GetPresetPrebuildSchedules(ctx context.Context) ([]database.TemplateVersionPresetPrebuildSchedule, error) {
4373+
panic("not implemented")
4374+
}
4375+
43724376
func (q *FakeQuerier) GetPresetsAtFailureLimit(ctx context.Context, hardLimit int64) ([]database.GetPresetsAtFailureLimitRow, error) {
43734377
return nil, ErrUnimplemented
43744378
}
@@ -9156,6 +9160,15 @@ func (q *FakeQuerier) InsertPresetParameters(_ context.Context, arg database.Ins
91569160
return presetParameters, nil
91579161
}
91589162

9163+
func (q *FakeQuerier) InsertPresetPrebuildSchedule(ctx context.Context, arg database.InsertPresetPrebuildScheduleParams) ([]database.TemplateVersionPresetPrebuildSchedule, error) {
9164+
err := validateDatabaseType(arg)
9165+
if err != nil {
9166+
return nil, err
9167+
}
9168+
9169+
panic("not implemented")
9170+
}
9171+
91599172
func (q *FakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
91609173
if err := validateDatabaseType(arg); err != nil {
91619174
return database.ProvisionerJob{}, 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: 30 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: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/foreign_key_constraint.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.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- Drop the autoscaling schedules table
2+
DROP TABLE template_version_preset_prebuild_schedules;
3+
4+
-- Remove added columns from template_version_presets table
5+
ALTER TABLE template_version_presets
6+
DROP COLUMN autoscaling_enabled,
7+
DROP COLUMN autoscaling_timezone;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- Add new columns to template_version_presets table
2+
ALTER TABLE template_version_presets
3+
ADD COLUMN autoscaling_enabled BOOLEAN DEFAULT false NOT NULL, -- Do we need it?
4+
ADD COLUMN autoscaling_timezone TEXT DEFAULT 'UTC' NOT NULL;
5+
6+
-- New table for autoscaling schedules
7+
CREATE TABLE template_version_preset_prebuild_schedules (
8+
id UUID PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
9+
preset_id UUID NOT NULL,
10+
cron_expression TEXT NOT NULL,
11+
instances INTEGER NOT NULL,
12+
FOREIGN KEY (preset_id) REFERENCES template_version_presets (id) ON DELETE CASCADE
13+
);

coderd/database/models.go

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

coderd/database/querier.go

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

0 commit comments

Comments
 (0)