Skip to content

Commit 705b9cc

Browse files
feat(coderd): add workspace timings endpoint (coder#14648)
1 parent c330af0 commit 705b9cc

File tree

19 files changed

+640
-2
lines changed

19 files changed

+640
-2
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

+1
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,7 @@ func New(options *Options) *API {
11571157
r.Post("/", api.postWorkspaceAgentPortShare)
11581158
r.Delete("/", api.deleteWorkspaceAgentPortShare)
11591159
})
1160+
r.Get("/timings", api.workspaceTimings)
11601161
})
11611162
})
11621163
r.Route("/workspacebuilds/{workspacebuild}", func(r chi.Router) {

coderd/database/dbauthz/dbauthz.go

+4
Original file line numberDiff line numberDiff line change
@@ -1791,6 +1791,10 @@ func (q *querier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (data
17911791
return job, nil
17921792
}
17931793

1794+
func (q *querier) GetProvisionerJobTimingsByJobID(ctx context.Context, jobID uuid.UUID) ([]database.ProvisionerJobTiming, error) {
1795+
return q.db.GetProvisionerJobTimingsByJobID(ctx, jobID)
1796+
}
1797+
17941798
// TODO: we need to add a provisioner job resource
17951799
func (q *querier) GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUID) ([]database.ProvisionerJob, error) {
17961800
// if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {

coderd/database/dbauthz/dbauthz_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,23 @@ func (s *MethodTestSuite) TestProvisionerJob() {
551551
check.Args(database.UpdateProvisionerJobWithCancelByIDParams{ID: j.ID}).
552552
Asserts(v.RBACObject(tpl), []policy.Action{policy.ActionRead, policy.ActionUpdate}).Returns()
553553
}))
554+
s.Run("GetProvisionerJobTimingsByJobID", s.Subtest(func(db database.Store, check *expects) {
555+
jobID := uuid.New()
556+
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{ID: jobID})
557+
t := dbgen.ProvisionerJobTimings(s.T(), db, database.InsertProvisionerJobTimingsParams{
558+
JobID: jobID,
559+
StartedAt: []time.Time{dbtime.Now(), dbtime.Now()},
560+
EndedAt: []time.Time{dbtime.Now(), dbtime.Now()},
561+
Stage: []database.ProvisionerJobTimingStage{
562+
database.ProvisionerJobTimingStageInit,
563+
database.ProvisionerJobTimingStagePlan,
564+
},
565+
Source: []string{"source1", "source2"},
566+
Action: []string{"action1", "action2"},
567+
Resource: []string{"resource1", "resource2"},
568+
})
569+
check.Args(j.ID).Asserts().Returns(t)
570+
}))
554571
s.Run("GetProvisionerJobsByIDs", s.Subtest(func(db database.Store, check *expects) {
555572
a := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
556573
b := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})

coderd/database/dbgen/dbgen.go

+6
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,12 @@ func CustomRole(t testing.TB, db database.Store, seed database.CustomRole) datab
893893
return role
894894
}
895895

896+
func ProvisionerJobTimings(t testing.TB, db database.Store, seed database.InsertProvisionerJobTimingsParams) []database.ProvisionerJobTiming {
897+
timings, err := db.InsertProvisionerJobTimings(genCtx, seed)
898+
require.NoError(t, err, "insert provisioner job timings")
899+
return timings
900+
}
901+
896902
func must[V any](v V, err error) V {
897903
if err != nil {
898904
panic(err)

coderd/database/dbmem/dbmem.go

+41-2
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ type data struct {
195195
workspaces []database.Workspace
196196
workspaceProxies []database.WorkspaceProxy
197197
customRoles []database.CustomRole
198+
provisionerJobTimings []database.ProvisionerJobTiming
198199
runtimeConfig map[string]string
199200
// Locks is a map of lock names. Any keys within the map are currently
200201
// locked.
@@ -3290,6 +3291,26 @@ func (q *FakeQuerier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (
32903291
return q.getProvisionerJobByIDNoLock(ctx, id)
32913292
}
32923293

3294+
func (q *FakeQuerier) GetProvisionerJobTimingsByJobID(_ context.Context, jobID uuid.UUID) ([]database.ProvisionerJobTiming, error) {
3295+
q.mutex.RLock()
3296+
defer q.mutex.RUnlock()
3297+
3298+
timings := make([]database.ProvisionerJobTiming, 0)
3299+
for _, timing := range q.provisionerJobTimings {
3300+
if timing.JobID == jobID {
3301+
timings = append(timings, timing)
3302+
}
3303+
}
3304+
if len(timings) == 0 {
3305+
return nil, sql.ErrNoRows
3306+
}
3307+
sort.Slice(timings, func(i, j int) bool {
3308+
return timings[i].StartedAt.Before(timings[j].StartedAt)
3309+
})
3310+
3311+
return timings, nil
3312+
}
3313+
32933314
func (q *FakeQuerier) GetProvisionerJobsByIDs(_ context.Context, ids []uuid.UUID) ([]database.ProvisionerJob, error) {
32943315
q.mutex.RLock()
32953316
defer q.mutex.RUnlock()
@@ -6783,13 +6804,31 @@ func (q *FakeQuerier) InsertProvisionerJobLogs(_ context.Context, arg database.I
67836804
return logs, nil
67846805
}
67856806

6786-
func (*FakeQuerier) InsertProvisionerJobTimings(_ context.Context, arg database.InsertProvisionerJobTimingsParams) ([]database.ProvisionerJobTiming, error) {
6807+
func (q *FakeQuerier) InsertProvisionerJobTimings(_ context.Context, arg database.InsertProvisionerJobTimingsParams) ([]database.ProvisionerJobTiming, error) {
67876808
err := validateDatabaseType(arg)
67886809
if err != nil {
67896810
return nil, err
67906811
}
67916812

6792-
return nil, nil
6813+
q.mutex.Lock()
6814+
defer q.mutex.Unlock()
6815+
6816+
insertedTimings := make([]database.ProvisionerJobTiming, 0, len(arg.StartedAt))
6817+
for i := range arg.StartedAt {
6818+
timing := database.ProvisionerJobTiming{
6819+
JobID: arg.JobID,
6820+
StartedAt: arg.StartedAt[i],
6821+
EndedAt: arg.EndedAt[i],
6822+
Stage: arg.Stage[i],
6823+
Source: arg.Source[i],
6824+
Action: arg.Action[i],
6825+
Resource: arg.Resource[i],
6826+
}
6827+
q.provisionerJobTimings = append(q.provisionerJobTimings, timing)
6828+
insertedTimings = append(insertedTimings, timing)
6829+
}
6830+
6831+
return insertedTimings, nil
67936832
}
67946833

67956834
func (q *FakeQuerier) InsertProvisionerKey(_ context.Context, arg database.InsertProvisionerKeyParams) (database.ProvisionerKey, error) {

coderd/database/dbmetrics/dbmetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/querier.go

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

0 commit comments

Comments
 (0)