Skip to content

Commit 8293890

Browse files
committed
Merge branch 'jjs/prebuilds-metrics' of github.com:/coder/coder into dk/prebuilds
2 parents 4afd88e + 41d1b66 commit 8293890

40 files changed

+907
-390
lines changed

agent/agent.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,9 @@ func (a *agent) run() (retErr error) {
10421042
})
10431043

10441044
err = connMan.wait()
1045-
a.logger.Error(context.Background(), "connection manager errored", slog.Error(err))
1045+
if err != nil {
1046+
a.logger.Warn(context.Background(), "connection manager errored", slog.Error(err))
1047+
}
10461048
return err
10471049
}
10481050

@@ -1959,7 +1961,7 @@ func (a *apiConnRoutineManager) startAgentAPI(
19591961
a.eg.Go(func() error {
19601962
logger.Debug(ctx, "starting agent routine")
19611963
err := f(ctx, a.aAPI)
1962-
if xerrors.Is(err, context.Canceled) && ctx.Err() != nil {
1964+
if errors.Is(err, context.Canceled) && ctx.Err() != nil {
19631965
logger.Debug(ctx, "swallowing context canceled")
19641966
// Don't propagate context canceled errors to the error group, because we don't want the
19651967
// graceful context being canceled to halt the work of routines with
@@ -1996,7 +1998,7 @@ func (a *apiConnRoutineManager) startTailnetAPI(
19961998
a.eg.Go(func() error {
19971999
logger.Debug(ctx, "starting tailnet routine")
19982000
err := f(ctx, a.tAPI)
1999-
if xerrors.Is(err, context.Canceled) && ctx.Err() != nil {
2001+
if errors.Is(err, context.Canceled) && ctx.Err() != nil {
20002002
logger.Debug(ctx, "swallowing context canceled")
20012003
// Don't propagate context canceled errors to the error group, because we don't want the
20022004
// graceful context being canceled to halt the work of routines with

cli/agent.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,10 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
380380
SSHMaxTimeout: sshMaxTimeout,
381381
Subsystems: subsystems,
382382

383-
PrometheusRegistry: prometheusRegistry,
384-
BlockFileTransfer: blockFileTransfer,
385-
Execer: execer,
386-
ContainerLister: containerLister,
383+
PrometheusRegistry: prometheusRegistry,
384+
BlockFileTransfer: blockFileTransfer,
385+
Execer: execer,
386+
ContainerLister: containerLister,
387387
ExperimentalDevcontainersEnabled: experimentalDevcontainersEnabled,
388388
})
389389

cli/testdata/coder_server_--help.golden

+6
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,12 @@ workspaces stopping during the day due to template scheduling.
658658
must be *. Only one hour and minute can be specified (ranges or comma
659659
separated values are not supported).
660660

661+
WORKSPACE PREBUILDS OPTIONS:
662+
Configure how workspace prebuilds behave.
663+
664+
--workspace-prebuilds-reconciliation-interval duration, $CODER_WORKSPACE_PREBUILDS_RECONCILIATION_INTERVAL (default: 15s)
665+
How often to reconcile workspace prebuilds state.
666+
661667
⚠️ DANGEROUS OPTIONS:
662668
--dangerous-allow-path-app-sharing bool, $CODER_DANGEROUS_ALLOW_PATH_APP_SHARING
663669
Allow workspace apps that are not served from subdomains to be shared.

cli/testdata/server-config.yaml.golden

+12
Original file line numberDiff line numberDiff line change
@@ -677,3 +677,15 @@ notifications:
677677
# How often to query the database for queued notifications.
678678
# (default: 15s, type: duration)
679679
fetchInterval: 15s
680+
# Configure how workspace prebuilds behave.
681+
workspace_prebuilds:
682+
# How often to reconcile workspace prebuilds state.
683+
# (default: 15s, type: duration)
684+
reconciliation_interval: 15s
685+
# Interval to increase reconciliation backoff by when unrecoverable errors occur.
686+
# (default: 15s, type: duration)
687+
reconciliation_backoff_interval: 15s
688+
# Interval to look back to determine number of failed builds, which influences
689+
# backoff.
690+
# (default: 1h0m0s, type: duration)
691+
reconciliation_backoff_lookback_period: 1h0m0s

coderd/apidoc/docs.go

+45
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+37
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbauthz/dbauthz_test.go

+68-2
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

+31
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

+14-14
Original file line numberDiff line numberDiff line change
@@ -1709,8 +1709,8 @@ func (*FakeQuerier) BulkMarkNotificationMessagesSent(_ context.Context, arg data
17091709
return int64(len(arg.IDs)), nil
17101710
}
17111711

1712-
func (q *FakeQuerier) ClaimPrebuild(ctx context.Context, newOwnerID database.ClaimPrebuildParams) (database.ClaimPrebuildRow, error) {
1713-
panic("not implemented")
1712+
func (*FakeQuerier) ClaimPrebuild(_ context.Context, _ database.ClaimPrebuildParams) (database.ClaimPrebuildRow, error) {
1713+
return database.ClaimPrebuildRow{}, ErrUnimplemented
17141714
}
17151715

17161716
func (*FakeQuerier) CleanTailnetCoordinators(_ context.Context) error {
@@ -4017,12 +4017,12 @@ func (q *FakeQuerier) GetParameterSchemasByJobID(_ context.Context, jobID uuid.U
40174017
return parameters, nil
40184018
}
40194019

4020-
func (q *FakeQuerier) GetPrebuildMetrics(ctx context.Context) ([]database.GetPrebuildMetricsRow, error) {
4021-
panic("not implemented")
4020+
func (*FakeQuerier) GetPrebuildMetrics(_ context.Context) ([]database.GetPrebuildMetricsRow, error) {
4021+
return nil, ErrUnimplemented
40224022
}
40234023

4024-
func (q *FakeQuerier) GetPrebuildsInProgress(ctx context.Context) ([]database.GetPrebuildsInProgressRow, error) {
4025-
panic("not implemented")
4024+
func (*FakeQuerier) GetPrebuildsInProgress(_ context.Context) ([]database.GetPrebuildsInProgressRow, error) {
4025+
return nil, ErrUnimplemented
40264026
}
40274027

40284028
func (q *FakeQuerier) GetPresetByWorkspaceBuildID(_ context.Context, workspaceBuildID uuid.UUID) (database.TemplateVersionPreset, error) {
@@ -4067,8 +4067,8 @@ func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context,
40674067
return parameters, nil
40684068
}
40694069

4070-
func (q *FakeQuerier) GetPresetsBackoff(ctx context.Context, period time.Time) ([]database.GetPresetsBackoffRow, error) {
4071-
panic("not implemented")
4070+
func (*FakeQuerier) GetPresetsBackoff(_ context.Context, _ time.Time) ([]database.GetPresetsBackoffRow, error) {
4071+
return nil, ErrUnimplemented
40724072
}
40734073

40744074
func (q *FakeQuerier) GetPresetsByTemplateVersionID(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPreset, error) {
@@ -4734,8 +4734,8 @@ func (q *FakeQuerier) GetReplicasUpdatedAfter(_ context.Context, updatedAt time.
47344734
return replicas, nil
47354735
}
47364736

4737-
func (q *FakeQuerier) GetRunningPrebuilds(ctx context.Context) ([]database.GetRunningPrebuildsRow, error) {
4738-
panic("not implemented")
4737+
func (*FakeQuerier) GetRunningPrebuilds(_ context.Context) ([]database.GetRunningPrebuildsRow, error) {
4738+
return nil, ErrUnimplemented
47394739
}
47404740

47414741
func (q *FakeQuerier) GetRuntimeConfig(_ context.Context, key string) (string, error) {
@@ -5777,8 +5777,8 @@ func (q *FakeQuerier) GetTemplateParameterInsights(ctx context.Context, arg data
57775777
return rows, nil
57785778
}
57795779

5780-
func (q *FakeQuerier) GetTemplatePresetsWithPrebuilds(ctx context.Context, templateID uuid.NullUUID) ([]database.GetTemplatePresetsWithPrebuildsRow, error) {
5781-
panic("not implemented")
5780+
func (*FakeQuerier) GetTemplatePresetsWithPrebuilds(_ context.Context, _ uuid.NullUUID) ([]database.GetTemplatePresetsWithPrebuildsRow, error) {
5781+
return nil, ErrUnimplemented
57825782
}
57835783

57845784
func (q *FakeQuerier) GetTemplateUsageStats(_ context.Context, arg database.GetTemplateUsageStatsParams) ([]database.TemplateUsageStat, error) {
@@ -8551,13 +8551,13 @@ func (q *FakeQuerier) InsertPresetParameters(_ context.Context, arg database.Ins
85518551
return presetParameters, nil
85528552
}
85538553

8554-
func (q *FakeQuerier) InsertPresetPrebuild(ctx context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
8554+
func (*FakeQuerier) InsertPresetPrebuild(_ context.Context, arg database.InsertPresetPrebuildParams) (database.TemplateVersionPresetPrebuild, error) {
85558555
err := validateDatabaseType(arg)
85568556
if err != nil {
85578557
return database.TemplateVersionPresetPrebuild{}, err
85588558
}
85598559

8560-
panic("not implemented")
8560+
return database.TemplateVersionPresetPrebuild{}, ErrUnimplemented
85618561
}
85628562

85638563
func (q *FakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {

0 commit comments

Comments
 (0)