Skip to content

Commit 7185a57

Browse files
committed
feat: add migrations and queries to support prebuilds
1 parent 5285c12 commit 7185a57

31 files changed

+1285
-28
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,15 @@ func (q *querier) BulkMarkNotificationMessagesSent(ctx context.Context, arg data
11061106
return q.db.BulkMarkNotificationMessagesSent(ctx, arg)
11071107
}
11081108

1109+
func (q *querier) ClaimPrebuild(ctx context.Context, newOwnerID database.ClaimPrebuildParams) (database.ClaimPrebuildRow, error) {
1110+
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceWorkspace); err != nil {
1111+
return database.ClaimPrebuildRow{
1112+
ID: uuid.Nil,
1113+
}, err
1114+
}
1115+
return q.db.ClaimPrebuild(ctx, newOwnerID)
1116+
}
1117+
11091118
func (q *querier) CleanTailnetCoordinators(ctx context.Context) error {
11101119
if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
11111120
return err
@@ -2016,6 +2025,20 @@ func (q *querier) GetParameterSchemasByJobID(ctx context.Context, jobID uuid.UUI
20162025
return q.db.GetParameterSchemasByJobID(ctx, jobID)
20172026
}
20182027

2028+
func (q *querier) GetPrebuildMetrics(ctx context.Context) ([]database.GetPrebuildMetricsRow, error) {
2029+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate); err != nil {
2030+
return nil, err
2031+
}
2032+
return q.db.GetPrebuildMetrics(ctx)
2033+
}
2034+
2035+
func (q *querier) GetPrebuildsInProgress(ctx context.Context) ([]database.GetPrebuildsInProgressRow, error) {
2036+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate); err != nil {
2037+
return nil, err
2038+
}
2039+
return q.db.GetPrebuildsInProgress(ctx)
2040+
}
2041+
20192042
func (q *querier) GetPresetByWorkspaceBuildID(ctx context.Context, workspaceID uuid.UUID) (database.TemplateVersionPreset, error) {
20202043
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate); err != nil {
20212044
return database.TemplateVersionPreset{}, err
@@ -2033,6 +2056,13 @@ func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, te
20332056
return q.db.GetPresetParametersByTemplateVersionID(ctx, templateVersionID)
20342057
}
20352058

2059+
func (q *querier) GetPresetsBackoff(ctx context.Context, lookback time.Time) ([]database.GetPresetsBackoffRow, error) {
2060+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate); err != nil {
2061+
return nil, err
2062+
}
2063+
return q.db.GetPresetsBackoff(ctx, lookback)
2064+
}
2065+
20362066
func (q *querier) GetPresetsByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPreset, error) {
20372067
// An actor can read template version presets if they can read the related template version.
20382068
_, err := q.GetTemplateVersionByID(ctx, templateVersionID)
@@ -2084,13 +2114,13 @@ func (q *querier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (data
20842114
// can read the job.
20852115
_, err := q.GetWorkspaceBuildByJobID(ctx, id)
20862116
if err != nil {
2087-
return database.ProvisionerJob{}, err
2117+
return database.ProvisionerJob{}, xerrors.Errorf("fetch related workspace build: %w", err)
20882118
}
20892119
case database.ProvisionerJobTypeTemplateVersionDryRun, database.ProvisionerJobTypeTemplateVersionImport:
20902120
// Authorized call to get template version.
20912121
_, err := authorizedTemplateVersionFromJob(ctx, q, job)
20922122
if err != nil {
2093-
return database.ProvisionerJob{}, err
2123+
return database.ProvisionerJob{}, xerrors.Errorf("fetch related template version: %w", err)
20942124
}
20952125
default:
20962126
return database.ProvisionerJob{}, xerrors.Errorf("unknown job type: %q", job.Type)
@@ -2183,6 +2213,13 @@ func (q *querier) GetReplicasUpdatedAfter(ctx context.Context, updatedAt time.Ti
21832213
return q.db.GetReplicasUpdatedAfter(ctx, updatedAt)
21842214
}
21852215

2216+
func (q *querier) GetRunningPrebuilds(ctx context.Context) ([]database.GetRunningPrebuildsRow, error) {
2217+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate); err != nil {
2218+
return nil, err
2219+
}
2220+
return q.db.GetRunningPrebuilds(ctx)
2221+
}
2222+
21862223
func (q *querier) GetRuntimeConfig(ctx context.Context, key string) (string, error) {
21872224
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
21882225
return "", err
@@ -2307,6 +2344,13 @@ func (q *querier) GetTemplateParameterInsights(ctx context.Context, arg database
23072344
return q.db.GetTemplateParameterInsights(ctx, arg)
23082345
}
23092346

2347+
func (q *querier) GetTemplatePresetsWithPrebuilds(ctx context.Context, templateID uuid.NullUUID) ([]database.GetTemplatePresetsWithPrebuildsRow, error) {
2348+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTemplate); err != nil {
2349+
return nil, err
2350+
}
2351+
return q.db.GetTemplatePresetsWithPrebuilds(ctx, templateID)
2352+
}
2353+
23102354
func (q *querier) GetTemplateUsageStats(ctx context.Context, arg database.GetTemplateUsageStatsParams) ([]database.TemplateUsageStat, error) {
23112355
if err := q.authorizeTemplateInsights(ctx, arg.TemplateIDs); err != nil {
23122356
return nil, err
@@ -3231,6 +3275,13 @@ func (q *querier) InsertPresetParameters(ctx context.Context, arg database.Inser
32313275
return q.db.InsertPresetParameters(ctx, arg)
32323276
}
32333277

3278+
func (q *querier) InsertPresetPrebuild(ctx context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
3279+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
3280+
return database.TemplateVersionPresetPrebuild{}, err
3281+
}
3282+
return q.db.InsertPresetPrebuild(ctx, arg)
3283+
}
3284+
32343285
// TODO: We need to create a ProvisionerJob resource type
32353286
func (q *querier) InsertProvisionerJob(ctx context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
32363287
// if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -979,8 +979,8 @@ func (s *MethodTestSuite) TestOrganization() {
979979
})
980980

981981
check.Args(database.OrganizationMembersParams{
982-
OrganizationID: uuid.UUID{},
983-
UserID: uuid.UUID{},
982+
OrganizationID: o.ID,
983+
UserID: u.ID,
984984
}).Asserts(
985985
mem, policy.ActionRead,
986986
)
@@ -4642,6 +4642,72 @@ func (s *MethodTestSuite) TestNotifications() {
46424642
}))
46434643
}
46444644

4645+
func (s *MethodTestSuite) TestPrebuilds() {
4646+
s.Run("ClaimPrebuild", s.Subtest(func(db database.Store, check *expects) {
4647+
check.Args(database.ClaimPrebuildParams{}).
4648+
Asserts(rbac.ResourceWorkspace, policy.ActionUpdate).
4649+
ErrorsWithInMemDB(dbmem.ErrUnimplemented).
4650+
ErrorsWithPG(sql.ErrNoRows)
4651+
4652+
}))
4653+
s.Run("GetPrebuildMetrics", s.Subtest(func(_ database.Store, check *expects) {
4654+
check.Args().
4655+
Asserts(rbac.ResourceTemplate, policy.ActionRead).
4656+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4657+
4658+
}))
4659+
s.Run("GetPrebuildsInProgress", s.Subtest(func(_ database.Store, check *expects) {
4660+
check.Args().
4661+
Asserts(rbac.ResourceTemplate, policy.ActionRead).
4662+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4663+
4664+
}))
4665+
s.Run("GetPresetsBackoff", s.Subtest(func(_ database.Store, check *expects) {
4666+
check.Args(time.Time{}).
4667+
Asserts(rbac.ResourceTemplate, policy.ActionRead).
4668+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4669+
4670+
}))
4671+
s.Run("GetRunningPrebuilds", s.Subtest(func(_ database.Store, check *expects) {
4672+
check.Args().
4673+
Asserts(rbac.ResourceTemplate, policy.ActionRead).
4674+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4675+
4676+
}))
4677+
s.Run("GetTemplatePresetsWithPrebuilds", s.Subtest(func(db database.Store, check *expects) {
4678+
user := dbgen.User(s.T(), db, database.User{})
4679+
check.Args(uuid.NullUUID{UUID: user.ID, Valid: true}).
4680+
Asserts(rbac.ResourceTemplate, policy.ActionRead).
4681+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4682+
4683+
}))
4684+
s.Run("InsertPresetPrebuild", s.Subtest(func(db database.Store, check *expects) {
4685+
org := dbgen.Organization(s.T(), db, database.Organization{})
4686+
user := dbgen.User(s.T(), db, database.User{})
4687+
template := dbgen.Template(s.T(), db, database.Template{
4688+
CreatedBy: user.ID,
4689+
OrganizationID: org.ID,
4690+
})
4691+
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
4692+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
4693+
OrganizationID: org.ID,
4694+
CreatedBy: user.ID,
4695+
})
4696+
preset := dbgen.Preset(s.T(), db, database.InsertPresetParams{
4697+
Name: coderdtest.RandomName(s.T()),
4698+
TemplateVersionID: templateVersion.ID,
4699+
})
4700+
check.Args(database.InsertPresetPrebuildParams{
4701+
ID: uuid.New(),
4702+
PresetID: preset.ID,
4703+
DesiredInstances: 1,
4704+
}).
4705+
Asserts(rbac.ResourceSystem, policy.ActionCreate).
4706+
ErrorsWithInMemDB(dbmem.ErrUnimplemented)
4707+
4708+
}))
4709+
}
4710+
46454711
func (s *MethodTestSuite) TestOAuth2ProviderApps() {
46464712
s.Run("GetOAuth2ProviderApps", s.Subtest(func(db database.Store, check *expects) {
46474713
apps := []database.OAuth2ProviderApp{

coderd/database/dbgen/dbgen.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,37 @@ func TelemetryItem(t testing.TB, db database.Store, seed database.TelemetryItem)
11581158
return item
11591159
}
11601160

1161+
func Preset(t testing.TB, db database.Store, seed database.InsertPresetParams) database.TemplateVersionPreset {
1162+
preset, err := db.InsertPreset(genCtx, database.InsertPresetParams{
1163+
TemplateVersionID: takeFirst(seed.TemplateVersionID, uuid.New()),
1164+
Name: takeFirst(seed.Name, testutil.GetRandomName(t)),
1165+
CreatedAt: takeFirst(seed.CreatedAt, dbtime.Now()),
1166+
})
1167+
require.NoError(t, err, "insert preset")
1168+
return preset
1169+
}
1170+
1171+
func PresetParameter(t testing.TB, db database.Store, seed database.InsertPresetParametersParams) []database.TemplateVersionPresetParameter {
1172+
parameters, err := db.InsertPresetParameters(genCtx, database.InsertPresetParametersParams{
1173+
TemplateVersionPresetID: takeFirst(seed.TemplateVersionPresetID, uuid.New()),
1174+
Names: takeFirstSlice(seed.Names, []string{testutil.GetRandomName(t)}),
1175+
Values: takeFirstSlice(seed.Values, []string{testutil.GetRandomName(t)}),
1176+
})
1177+
1178+
require.NoError(t, err, "insert preset parameters")
1179+
return parameters
1180+
}
1181+
1182+
func PresetPrebuild(t testing.TB, db database.Store, seed database.InsertPresetPrebuildParams) database.TemplateVersionPresetPrebuild {
1183+
prebuild, err := db.InsertPresetPrebuild(genCtx, database.InsertPresetPrebuildParams{
1184+
ID: takeFirst(seed.ID, uuid.New()),
1185+
PresetID: takeFirst(seed.PresetID, uuid.New()),
1186+
DesiredInstances: takeFirst(seed.DesiredInstances, 1),
1187+
})
1188+
require.NoError(t, err, "insert preset prebuild")
1189+
return prebuild
1190+
}
1191+
11611192
func provisionerJobTiming(t testing.TB, db database.Store, seed database.ProvisionerJobTiming) database.ProvisionerJobTiming {
11621193
timing, err := db.InsertProvisionerJobTimings(genCtx, database.InsertProvisionerJobTimingsParams{
11631194
JobID: takeFirst(seed.JobID, uuid.New()),

coderd/database/dbmem/dbmem.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,6 +1709,10 @@ func (*FakeQuerier) BulkMarkNotificationMessagesSent(_ context.Context, arg data
17091709
return int64(len(arg.IDs)), nil
17101710
}
17111711

1712+
func (*FakeQuerier) ClaimPrebuild(_ context.Context, _ database.ClaimPrebuildParams) (database.ClaimPrebuildRow, error) {
1713+
return database.ClaimPrebuildRow{}, ErrUnimplemented
1714+
}
1715+
17121716
func (*FakeQuerier) CleanTailnetCoordinators(_ context.Context) error {
17131717
return ErrUnimplemented
17141718
}
@@ -4013,6 +4017,14 @@ func (q *FakeQuerier) GetParameterSchemasByJobID(_ context.Context, jobID uuid.U
40134017
return parameters, nil
40144018
}
40154019

4020+
func (*FakeQuerier) GetPrebuildMetrics(_ context.Context) ([]database.GetPrebuildMetricsRow, error) {
4021+
return nil, ErrUnimplemented
4022+
}
4023+
4024+
func (*FakeQuerier) GetPrebuildsInProgress(_ context.Context) ([]database.GetPrebuildsInProgressRow, error) {
4025+
return nil, ErrUnimplemented
4026+
}
4027+
40164028
func (q *FakeQuerier) GetPresetByWorkspaceBuildID(_ context.Context, workspaceBuildID uuid.UUID) (database.TemplateVersionPreset, error) {
40174029
q.mutex.RLock()
40184030
defer q.mutex.RUnlock()
@@ -4055,6 +4067,10 @@ func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context,
40554067
return parameters, nil
40564068
}
40574069

4070+
func (*FakeQuerier) GetPresetsBackoff(_ context.Context, _ time.Time) ([]database.GetPresetsBackoffRow, error) {
4071+
return nil, ErrUnimplemented
4072+
}
4073+
40584074
func (q *FakeQuerier) GetPresetsByTemplateVersionID(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPreset, error) {
40594075
q.mutex.RLock()
40604076
defer q.mutex.RUnlock()
@@ -4718,6 +4734,10 @@ func (q *FakeQuerier) GetReplicasUpdatedAfter(_ context.Context, updatedAt time.
47184734
return replicas, nil
47194735
}
47204736

4737+
func (*FakeQuerier) GetRunningPrebuilds(_ context.Context) ([]database.GetRunningPrebuildsRow, error) {
4738+
return nil, ErrUnimplemented
4739+
}
4740+
47214741
func (q *FakeQuerier) GetRuntimeConfig(_ context.Context, key string) (string, error) {
47224742
q.mutex.Lock()
47234743
defer q.mutex.Unlock()
@@ -5757,6 +5777,10 @@ func (q *FakeQuerier) GetTemplateParameterInsights(ctx context.Context, arg data
57575777
return rows, nil
57585778
}
57595779

5780+
func (*FakeQuerier) GetTemplatePresetsWithPrebuilds(_ context.Context, _ uuid.NullUUID) ([]database.GetTemplatePresetsWithPrebuildsRow, error) {
5781+
return nil, ErrUnimplemented
5782+
}
5783+
57605784
func (q *FakeQuerier) GetTemplateUsageStats(_ context.Context, arg database.GetTemplateUsageStatsParams) ([]database.TemplateUsageStat, error) {
57615785
err := validateDatabaseType(arg)
57625786
if err != nil {
@@ -8527,6 +8551,15 @@ func (q *FakeQuerier) InsertPresetParameters(_ context.Context, arg database.Ins
85278551
return presetParameters, nil
85288552
}
85298553

8554+
func (*FakeQuerier) InsertPresetPrebuild(_ context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
8555+
err := validateDatabaseType(arg)
8556+
if err != nil {
8557+
return database.TemplateVersionPresetPrebuild{}, err
8558+
}
8559+
8560+
return database.TemplateVersionPresetPrebuild{}, ErrUnimplemented
8561+
}
8562+
85308563
func (q *FakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
85318564
if err := validateDatabaseType(arg); err != nil {
85328565
return database.ProvisionerJob{}, err

0 commit comments

Comments
 (0)