Skip to content

Commit e4b4e2f

Browse files
committed
feat(coderd): add endpoint to list provisioner jobs
Closes #15190 Updates #15084 Supercedes #15940
1 parent ef1b04c commit e4b4e2f

26 files changed

+1509
-197
lines changed

cli/testdata/coder_list_--output_json.golden

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@
4343
"scope": "organization"
4444
},
4545
"queue_position": 0,
46-
"queue_size": 0
46+
"queue_size": 0,
47+
"organization_id": "===========[first org ID]===========",
48+
"input": {
49+
"workspace_build_id": "========[workspace build ID]========"
50+
},
51+
"type": "workspace_build"
4752
},
4853
"reason": "initiator",
4954
"resources": [],

coderd/apidoc/docs.go

Lines changed: 108 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: 104 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,9 @@ func New(options *Options) *API {
10101010
r.Route("/provisionerdaemons", func(r chi.Router) {
10111011
r.Get("/", api.provisionerDaemons)
10121012
})
1013+
r.Route("/provisionerjobs", func(r chi.Router) {
1014+
r.Get("/", api.provisionerJobs)
1015+
})
10131016
})
10141017
})
10151018
r.Route("/templates", func(r chi.Router) {

coderd/database/dbauthz/dbauthz.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,6 +1988,11 @@ func (q *querier) GetProvisionerJobsByIDsWithQueuePosition(ctx context.Context,
19881988
return q.db.GetProvisionerJobsByIDsWithQueuePosition(ctx, ids)
19891989
}
19901990

1991+
// TODO: we need to add a provisioner job resource
1992+
func (q *querier) GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner(ctx context.Context, arg database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams) ([]database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerRow, error) {
1993+
return q.db.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner(ctx, arg)
1994+
}
1995+
19911996
// TODO: We need to create a ProvisionerJob resource type
19921997
func (q *querier) GetProvisionerJobsCreatedAfter(ctx context.Context, createdAt time.Time) ([]database.ProvisionerJob, error) {
19931998
// if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3245,6 +3245,41 @@ func (s *MethodTestSuite) TestExtraMethods() {
32453245
LastSeenAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
32463246
}).Asserts(rbac.ResourceProvisionerDaemon, policy.ActionUpdate)
32473247
}))
3248+
s.Run("GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner", s.Subtest(func(db database.Store, check *expects) {
3249+
org := dbgen.Organization(s.T(), db, database.Organization{})
3250+
tags := database.StringMap(map[string]string{
3251+
provisionersdk.TagScope: provisionersdk.ScopeOrganization,
3252+
})
3253+
t := dbgen.Template(s.T(), db, database.Template{})
3254+
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true}})
3255+
w := dbgen.Workspace(s.T(), db, database.WorkspaceTable{OrganizationID: org.ID, TemplateID: t.ID})
3256+
wb := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: w.ID, TemplateVersionID: tv.ID})
3257+
j1, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
3258+
OrganizationID: org.ID,
3259+
Type: database.ProvisionerJobTypeTemplateVersionImport,
3260+
Input: []byte(`{"template_version_id":"` + tv.ID.String() + `"}`),
3261+
Tags: tags,
3262+
Provisioner: database.ProvisionerTypeEcho,
3263+
StorageMethod: database.ProvisionerStorageMethodFile,
3264+
})
3265+
s.NoError(err, "insert provisioner job")
3266+
j2, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
3267+
OrganizationID: org.ID,
3268+
Type: database.ProvisionerJobTypeWorkspaceBuild,
3269+
Input: []byte(`{"workspace_build_id":"` + wb.ID.String() + `"}`),
3270+
Tags: tags,
3271+
Provisioner: database.ProvisionerTypeEcho,
3272+
StorageMethod: database.ProvisionerStorageMethodFile,
3273+
})
3274+
s.NoError(err, "insert provisioner job")
3275+
ds, err := db.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner(context.Background(), database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams{
3276+
OrganizationID: uuid.NullUUID{Valid: true, UUID: org.ID},
3277+
})
3278+
s.NoError(err, "get provisioner jobs by org")
3279+
check.Args(database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams{
3280+
OrganizationID: uuid.NullUUID{Valid: true, UUID: org.ID},
3281+
}).Asserts(j1, policy.ActionRead, j2, policy.ActionRead).Returns(ds)
3282+
}))
32483283
}
32493284

32503285
func (s *MethodTestSuite) TestTailnetFunctions() {

0 commit comments

Comments
 (0)