Skip to content

Commit 664d9b7

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

27 files changed

+1583
-239
lines changed

cli/testdata/coder_list_--output_json.golden

+6-1
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

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

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

+5
Original file line numberDiff line numberDiff line change
@@ -1980,6 +1980,11 @@ func (q *querier) GetProvisionerJobsByIDsWithQueuePosition(ctx context.Context,
19801980
return q.db.GetProvisionerJobsByIDsWithQueuePosition(ctx, ids)
19811981
}
19821982

1983+
// TODO: we need to add a provisioner job resource
1984+
func (q *querier) GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner(ctx context.Context, arg database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams) ([]database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerRow, error) {
1985+
return q.db.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner(ctx, arg)
1986+
}
1987+
19831988
// TODO: We need to create a ProvisionerJob resource type
19841989
func (q *querier) GetProvisionerJobsCreatedAfter(ctx context.Context, createdAt time.Time) ([]database.ProvisionerJob, error) {
19851990
// if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {

coderd/database/dbauthz/dbauthz_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -2175,6 +2175,41 @@ func (s *MethodTestSuite) TestExtraMethods() {
21752175
LastSeenAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
21762176
}).Asserts(rbac.ResourceProvisionerDaemon, policy.ActionUpdate)
21772177
}))
2178+
s.Run("GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner", s.Subtest(func(db database.Store, check *expects) {
2179+
org := dbgen.Organization(s.T(), db, database.Organization{})
2180+
tags := database.StringMap(map[string]string{
2181+
provisionersdk.TagScope: provisionersdk.ScopeOrganization,
2182+
})
2183+
t := dbgen.Template(s.T(), db, database.Template{})
2184+
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true}})
2185+
w := dbgen.Workspace(s.T(), db, database.WorkspaceTable{OrganizationID: org.ID, TemplateID: t.ID})
2186+
wb := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: w.ID, TemplateVersionID: tv.ID})
2187+
j1, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
2188+
OrganizationID: org.ID,
2189+
Type: database.ProvisionerJobTypeTemplateVersionImport,
2190+
Input: []byte(`{"template_version_id":"` + tv.ID.String() + `"}`),
2191+
Tags: tags,
2192+
Provisioner: database.ProvisionerTypeEcho,
2193+
StorageMethod: database.ProvisionerStorageMethodFile,
2194+
})
2195+
s.NoError(err, "insert provisioner job")
2196+
j2, err := db.InsertProvisionerJob(context.Background(), database.InsertProvisionerJobParams{
2197+
OrganizationID: org.ID,
2198+
Type: database.ProvisionerJobTypeWorkspaceBuild,
2199+
Input: []byte(`{"workspace_build_id":"` + wb.ID.String() + `"}`),
2200+
Tags: tags,
2201+
Provisioner: database.ProvisionerTypeEcho,
2202+
StorageMethod: database.ProvisionerStorageMethodFile,
2203+
})
2204+
s.NoError(err, "insert provisioner job")
2205+
ds, err := db.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner(context.Background(), database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams{
2206+
OrganizationID: uuid.NullUUID{Valid: true, UUID: org.ID},
2207+
})
2208+
s.NoError(err, "get provisioner jobs by org")
2209+
check.Args(database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams{
2210+
OrganizationID: uuid.NullUUID{Valid: true, UUID: org.ID},
2211+
}).Asserts(j1, policy.ActionRead, j2, policy.ActionRead).Returns(ds)
2212+
}))
21782213
}
21792214

21802215
// All functions in this method test suite are not implemented in dbmem, but

0 commit comments

Comments
 (0)