@@ -170,10 +170,10 @@ var (
170
170
Identifier : rbac.RoleIdentifier {Name : "provisionerd" },
171
171
DisplayName : "Provisioner Daemon" ,
172
172
Site : rbac .Permissions (map [string ][]policy.Action {
173
- // TODO: Add ProvisionerJob resource type.
174
- rbac .ResourceFile .Type : {policy .ActionRead },
175
- rbac .ResourceSystem .Type : {policy .WildcardSymbol },
176
- rbac .ResourceTemplate .Type : {policy .ActionRead , policy .ActionUpdate },
173
+ rbac . ResourceProvisionerJobs . Type : { policy . ActionRead , policy . ActionUpdate , policy . ActionCreate },
174
+ rbac .ResourceFile .Type : {policy .ActionRead },
175
+ rbac .ResourceSystem .Type : {policy .WildcardSymbol },
176
+ rbac .ResourceTemplate .Type : {policy .ActionRead , policy .ActionUpdate },
177
177
// Unsure why provisionerd needs update and read personal
178
178
rbac .ResourceUser .Type : {policy .ActionRead , policy .ActionReadPersonal , policy .ActionUpdatePersonal },
179
179
rbac .ResourceWorkspaceDormant .Type : {policy .ActionDelete , policy .ActionRead , policy .ActionUpdate , policy .ActionWorkspaceStop },
@@ -219,19 +219,20 @@ var (
219
219
Scope : rbac .ScopeAll ,
220
220
}.WithCachedASTValue ()
221
221
222
- // See unhanger package.
223
- subjectHangDetector = rbac.Subject {
224
- Type : rbac .SubjectTypeHangDetector ,
225
- FriendlyName : "Hang Detector " ,
222
+ // See reaper package.
223
+ subjectJobReaper = rbac.Subject {
224
+ Type : rbac .SubjectTypeJobReaper ,
225
+ FriendlyName : "Job Reaper " ,
226
226
ID : uuid .Nil .String (),
227
227
Roles : rbac .Roles ([]rbac.Role {
228
228
{
229
- Identifier : rbac.RoleIdentifier {Name : "hangdetector " },
230
- DisplayName : "Hang Detector Daemon" ,
229
+ Identifier : rbac.RoleIdentifier {Name : "jobreaper " },
230
+ DisplayName : "Job Reaper Daemon" ,
231
231
Site : rbac .Permissions (map [string ][]policy.Action {
232
- rbac .ResourceSystem .Type : {policy .WildcardSymbol },
233
- rbac .ResourceTemplate .Type : {policy .ActionRead },
234
- rbac .ResourceWorkspace .Type : {policy .ActionRead , policy .ActionUpdate },
232
+ rbac .ResourceSystem .Type : {policy .WildcardSymbol },
233
+ rbac .ResourceTemplate .Type : {policy .ActionRead },
234
+ rbac .ResourceWorkspace .Type : {policy .ActionRead , policy .ActionUpdate },
235
+ rbac .ResourceProvisionerJobs .Type : {policy .ActionRead , policy .ActionUpdate },
235
236
}),
236
237
Org : map [string ][]rbac.Permission {},
237
238
User : []rbac.Permission {},
@@ -346,6 +347,7 @@ var (
346
347
rbac .ResourceNotificationTemplate .Type : {policy .ActionCreate , policy .ActionUpdate , policy .ActionDelete },
347
348
rbac .ResourceCryptoKey .Type : {policy .ActionCreate , policy .ActionUpdate , policy .ActionDelete },
348
349
rbac .ResourceFile .Type : {policy .ActionCreate , policy .ActionRead },
350
+ rbac .ResourceProvisionerJobs .Type : {policy .ActionRead , policy .ActionUpdate , policy .ActionCreate },
349
351
}),
350
352
Org : map [string ][]rbac.Permission {},
351
353
User : []rbac.Permission {},
@@ -407,10 +409,10 @@ func AsAutostart(ctx context.Context) context.Context {
407
409
return As (ctx , subjectAutostart )
408
410
}
409
411
410
- // AsHangDetector returns a context with an actor that has permissions required
411
- // for unhanger .Detector to function.
412
- func AsHangDetector (ctx context.Context ) context.Context {
413
- return As (ctx , subjectHangDetector )
412
+ // AsJobReaper returns a context with an actor that has permissions required
413
+ // for reaper .Detector to function.
414
+ func AsJobReaper (ctx context.Context ) context.Context {
415
+ return As (ctx , subjectJobReaper )
414
416
}
415
417
416
418
// AsKeyRotator returns a context with an actor that has permissions required for rotating crypto keys.
@@ -1085,11 +1087,10 @@ func (q *querier) AcquireNotificationMessages(ctx context.Context, arg database.
1085
1087
return q .db .AcquireNotificationMessages (ctx , arg )
1086
1088
}
1087
1089
1088
- // TODO: We need to create a ProvisionerJob resource type
1089
1090
func (q * querier ) AcquireProvisionerJob (ctx context.Context , arg database.AcquireProvisionerJobParams ) (database.ProvisionerJob , error ) {
1090
- // if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem ); err != nil {
1091
- // return database.ProvisionerJob{}, err
1092
- // }
1091
+ if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceProvisionerJobs ); err != nil {
1092
+ return database.ProvisionerJob {}, err
1093
+ }
1093
1094
return q .db .AcquireProvisionerJob (ctx , arg )
1094
1095
}
1095
1096
@@ -1912,14 +1913,6 @@ func (q *querier) GetHealthSettings(ctx context.Context) (string, error) {
1912
1913
return q .db .GetHealthSettings (ctx )
1913
1914
}
1914
1915
1915
- // TODO: We need to create a ProvisionerJob resource type
1916
- func (q * querier ) GetHungProvisionerJobs (ctx context.Context , hungSince time.Time ) ([]database.ProvisionerJob , error ) {
1917
- // if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
1918
- // return nil, err
1919
- // }
1920
- return q .db .GetHungProvisionerJobs (ctx , hungSince )
1921
- }
1922
-
1923
1916
func (q * querier ) GetInboxNotificationByID (ctx context.Context , id uuid.UUID ) (database.InboxNotification , error ) {
1924
1917
return fetchWithAction (q .log , q .auth , policy .ActionRead , q .db .GetInboxNotificationByID )(ctx , id )
1925
1918
}
@@ -2307,6 +2300,13 @@ func (q *querier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (data
2307
2300
return job , nil
2308
2301
}
2309
2302
2303
+ func (q * querier ) GetProvisionerJobByIDForUpdate (ctx context.Context , id uuid.UUID ) (database.ProvisionerJob , error ) {
2304
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceProvisionerJobs ); err != nil {
2305
+ return database.ProvisionerJob {}, err
2306
+ }
2307
+ return q .db .GetProvisionerJobByIDForUpdate (ctx , id )
2308
+ }
2309
+
2310
2310
func (q * querier ) GetProvisionerJobTimingsByJobID (ctx context.Context , jobID uuid.UUID ) ([]database.ProvisionerJobTiming , error ) {
2311
2311
_ , err := q .GetProvisionerJobByID (ctx , jobID )
2312
2312
if err != nil {
@@ -2315,31 +2315,49 @@ func (q *querier) GetProvisionerJobTimingsByJobID(ctx context.Context, jobID uui
2315
2315
return q .db .GetProvisionerJobTimingsByJobID (ctx , jobID )
2316
2316
}
2317
2317
2318
- // TODO: We have a ProvisionerJobs resource, but it hasn't been checked for this use-case.
2319
2318
func (q * querier ) GetProvisionerJobsByIDs (ctx context.Context , ids []uuid.UUID ) ([]database.ProvisionerJob , error ) {
2320
- // if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
2321
- // return nil, err
2322
- // }
2323
- return q .db .GetProvisionerJobsByIDs (ctx , ids )
2319
+ provisionerJobs , err := q .db .GetProvisionerJobsByIDs (ctx , ids )
2320
+ if err != nil {
2321
+ return nil , err
2322
+ }
2323
+ orgIDs := make (map [uuid.UUID ]struct {})
2324
+ for _ , job := range provisionerJobs {
2325
+ orgIDs [job .OrganizationID ] = struct {}{}
2326
+ }
2327
+ for orgID := range orgIDs {
2328
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceProvisionerJobs .InOrg (orgID )); err != nil {
2329
+ return nil , err
2330
+ }
2331
+ }
2332
+ return provisionerJobs , nil
2324
2333
}
2325
2334
2326
- // TODO: We have a ProvisionerJobs resource, but it hasn't been checked for this use-case.
2327
2335
func (q * querier ) GetProvisionerJobsByIDsWithQueuePosition (ctx context.Context , ids []uuid.UUID ) ([]database.GetProvisionerJobsByIDsWithQueuePositionRow , error ) {
2336
+ // TODO: Remove this once we have a proper rbac check for provisioner jobs.
2337
+ // Details in https://github.com/coder/coder/issues/16160
2328
2338
return q .db .GetProvisionerJobsByIDsWithQueuePosition (ctx , ids )
2329
2339
}
2330
2340
2331
2341
func (q * querier ) GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner (ctx context.Context , arg database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerParams ) ([]database.GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisionerRow , error ) {
2342
+ // TODO: Remove this once we have a proper rbac check for provisioner jobs.
2343
+ // Details in https://github.com/coder/coder/issues/16160
2332
2344
return fetchWithPostFilter (q .auth , policy .ActionRead , q .db .GetProvisionerJobsByOrganizationAndStatusWithQueuePositionAndProvisioner )(ctx , arg )
2333
2345
}
2334
2346
2335
- // TODO: We have a ProvisionerJobs resource, but it hasn't been checked for this use-case.
2336
2347
func (q * querier ) GetProvisionerJobsCreatedAfter (ctx context.Context , createdAt time.Time ) ([]database.ProvisionerJob , error ) {
2337
- // if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem ); err != nil {
2338
- // return nil, err
2339
- // }
2348
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceProvisionerJobs ); err != nil {
2349
+ return nil , err
2350
+ }
2340
2351
return q .db .GetProvisionerJobsCreatedAfter (ctx , createdAt )
2341
2352
}
2342
2353
2354
+ func (q * querier ) GetProvisionerJobsToBeReaped (ctx context.Context , arg database.GetProvisionerJobsToBeReapedParams ) ([]database.ProvisionerJob , error ) {
2355
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceProvisionerJobs ); err != nil {
2356
+ return nil , err
2357
+ }
2358
+ return q .db .GetProvisionerJobsToBeReaped (ctx , arg )
2359
+ }
2360
+
2343
2361
func (q * querier ) GetProvisionerKeyByHashedSecret (ctx context.Context , hashedSecret []byte ) (database.ProvisionerKey , error ) {
2344
2362
return fetch (q .log , q .auth , q .db .GetProvisionerKeyByHashedSecret )(ctx , hashedSecret )
2345
2363
}
@@ -3533,27 +3551,22 @@ func (q *querier) InsertPresetParameters(ctx context.Context, arg database.Inser
3533
3551
return q .db .InsertPresetParameters (ctx , arg )
3534
3552
}
3535
3553
3536
- // TODO: We need to create a ProvisionerJob resource type
3537
3554
func (q * querier ) InsertProvisionerJob (ctx context.Context , arg database.InsertProvisionerJobParams ) (database.ProvisionerJob , error ) {
3538
- // if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
3539
- // return database.ProvisionerJob{}, err
3540
- // }
3555
+ // TODO: Remove this once we have a proper rbac check for provisioner jobs.
3556
+ // Details in https://github.com/coder/coder/issues/16160
3541
3557
return q .db .InsertProvisionerJob (ctx , arg )
3542
3558
}
3543
3559
3544
- // TODO: We need to create a ProvisionerJob resource type
3545
3560
func (q * querier ) InsertProvisionerJobLogs (ctx context.Context , arg database.InsertProvisionerJobLogsParams ) ([]database.ProvisionerJobLog , error ) {
3546
- // if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
3547
- // return nil, err
3548
- // }
3561
+ // TODO: Remove this once we have a proper rbac check for provisioner jobs.
3562
+ // Details in https://github.com/coder/coder/issues/16160
3549
3563
return q .db .InsertProvisionerJobLogs (ctx , arg )
3550
3564
}
3551
3565
3552
- // TODO: We need to create a ProvisionerJob resource type
3553
3566
func (q * querier ) InsertProvisionerJobTimings (ctx context.Context , arg database.InsertProvisionerJobTimingsParams ) ([]database.ProvisionerJobTiming , error ) {
3554
- // if err := q.authorizeContext(ctx, policy.ActionCreate , rbac.ResourceSystem ); err != nil {
3555
- // return nil, err
3556
- // }
3567
+ if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceProvisionerJobs ); err != nil {
3568
+ return nil , err
3569
+ }
3557
3570
return q .db .InsertProvisionerJobTimings (ctx , arg )
3558
3571
}
3559
3572
@@ -4176,15 +4189,17 @@ func (q *querier) UpdateProvisionerDaemonLastSeenAt(ctx context.Context, arg dat
4176
4189
return q .db .UpdateProvisionerDaemonLastSeenAt (ctx , arg )
4177
4190
}
4178
4191
4179
- // TODO: We need to create a ProvisionerJob resource type
4180
4192
func (q * querier ) UpdateProvisionerJobByID (ctx context.Context , arg database.UpdateProvisionerJobByIDParams ) error {
4181
- // if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem ); err != nil {
4182
- // return err
4183
- // }
4193
+ if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceProvisionerJobs ); err != nil {
4194
+ return err
4195
+ }
4184
4196
return q .db .UpdateProvisionerJobByID (ctx , arg )
4185
4197
}
4186
4198
4187
4199
func (q * querier ) UpdateProvisionerJobWithCancelByID (ctx context.Context , arg database.UpdateProvisionerJobWithCancelByIDParams ) error {
4200
+ // TODO: Remove this once we have a proper rbac check for provisioner jobs.
4201
+ // Details in https://github.com/coder/coder/issues/16160
4202
+
4188
4203
job , err := q .db .GetProvisionerJobByID (ctx , arg .ID )
4189
4204
if err != nil {
4190
4205
return err
@@ -4251,14 +4266,20 @@ func (q *querier) UpdateProvisionerJobWithCancelByID(ctx context.Context, arg da
4251
4266
return q .db .UpdateProvisionerJobWithCancelByID (ctx , arg )
4252
4267
}
4253
4268
4254
- // TODO: We need to create a ProvisionerJob resource type
4255
4269
func (q * querier ) UpdateProvisionerJobWithCompleteByID (ctx context.Context , arg database.UpdateProvisionerJobWithCompleteByIDParams ) error {
4256
- // if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem ); err != nil {
4257
- // return err
4258
- // }
4270
+ if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceProvisionerJobs ); err != nil {
4271
+ return err
4272
+ }
4259
4273
return q .db .UpdateProvisionerJobWithCompleteByID (ctx , arg )
4260
4274
}
4261
4275
4276
+ func (q * querier ) UpdateProvisionerJobWithCompleteWithStartedAtByID (ctx context.Context , arg database.UpdateProvisionerJobWithCompleteWithStartedAtByIDParams ) error {
4277
+ if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceProvisionerJobs ); err != nil {
4278
+ return err
4279
+ }
4280
+ return q .db .UpdateProvisionerJobWithCompleteWithStartedAtByID (ctx , arg )
4281
+ }
4282
+
4262
4283
func (q * querier ) UpdateReplica (ctx context.Context , arg database.UpdateReplicaParams ) (database.Replica , error ) {
4263
4284
if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceSystem ); err != nil {
4264
4285
return database.Replica {}, err
0 commit comments