@@ -18,6 +18,7 @@ import (
18
18
19
19
"cdr.dev/slog"
20
20
21
+ "github.com/coder/coder/v2/coderd/prebuilds"
21
22
"github.com/coder/coder/v2/coderd/rbac/policy"
22
23
"github.com/coder/coder/v2/coderd/rbac/rolestore"
23
24
@@ -358,6 +359,27 @@ var (
358
359
}),
359
360
Scope : rbac .ScopeAll ,
360
361
}.WithCachedASTValue ()
362
+
363
+ subjectPrebuildsOrchestrator = rbac.Subject {
364
+ FriendlyName : "Prebuilds Orchestrator" ,
365
+ ID : prebuilds .OwnerID .String (),
366
+ Roles : rbac .Roles ([]rbac.Role {
367
+ {
368
+ Identifier : rbac.RoleIdentifier {Name : "prebuilds-orchestrator" },
369
+ DisplayName : "Coder" ,
370
+ Site : rbac .Permissions (map [string ][]policy.Action {
371
+ // May use template, read template-related info, & insert template-related resources (preset prebuilds).
372
+ rbac .ResourceTemplate .Type : {policy .ActionRead , policy .ActionUpdate , policy .ActionUse },
373
+ // May CRUD workspaces, and start/stop them.
374
+ rbac .ResourceWorkspace .Type : {
375
+ policy .ActionCreate , policy .ActionDelete , policy .ActionRead , policy .ActionUpdate ,
376
+ policy .ActionWorkspaceStart , policy .ActionWorkspaceStop ,
377
+ },
378
+ }),
379
+ },
380
+ }),
381
+ Scope : rbac .ScopeAll ,
382
+ }.WithCachedASTValue ()
361
383
)
362
384
363
385
// AsProvisionerd returns a context with an actor that has permissions required
@@ -412,6 +434,12 @@ func AsSystemReadProvisionerDaemons(ctx context.Context) context.Context {
412
434
return context .WithValue (ctx , authContextKey {}, subjectSystemReadProvisionerDaemons )
413
435
}
414
436
437
+ // AsPrebuildsOrchestrator returns a context with an actor that has permissions
438
+ // to read orchestrator workspace prebuilds.
439
+ func AsPrebuildsOrchestrator (ctx context.Context ) context.Context {
440
+ return context .WithValue (ctx , authContextKey {}, subjectPrebuildsOrchestrator )
441
+ }
442
+
415
443
var AsRemoveActor = rbac.Subject {
416
444
ID : "remove-actor" ,
417
445
}
@@ -1106,6 +1134,15 @@ func (q *querier) BulkMarkNotificationMessagesSent(ctx context.Context, arg data
1106
1134
return q .db .BulkMarkNotificationMessagesSent (ctx , arg )
1107
1135
}
1108
1136
1137
+ func (q * querier ) ClaimPrebuild (ctx context.Context , newOwnerID database.ClaimPrebuildParams ) (database.ClaimPrebuildRow , error ) {
1138
+ if err := q .authorizeContext (ctx , policy .ActionUpdate , rbac .ResourceWorkspace ); err != nil {
1139
+ return database.ClaimPrebuildRow {
1140
+ ID : uuid .Nil ,
1141
+ }, err
1142
+ }
1143
+ return q .db .ClaimPrebuild (ctx , newOwnerID )
1144
+ }
1145
+
1109
1146
func (q * querier ) CleanTailnetCoordinators (ctx context.Context ) error {
1110
1147
if err := q .authorizeContext (ctx , policy .ActionDelete , rbac .ResourceTailnetCoordinator ); err != nil {
1111
1148
return err
@@ -2020,6 +2057,20 @@ func (q *querier) GetParameterSchemasByJobID(ctx context.Context, jobID uuid.UUI
2020
2057
return q .db .GetParameterSchemasByJobID (ctx , jobID )
2021
2058
}
2022
2059
2060
+ func (q * querier ) GetPrebuildMetrics (ctx context.Context ) ([]database.GetPrebuildMetricsRow , error ) {
2061
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2062
+ return nil , err
2063
+ }
2064
+ return q .db .GetPrebuildMetrics (ctx )
2065
+ }
2066
+
2067
+ func (q * querier ) GetPrebuildsInProgress (ctx context.Context ) ([]database.GetPrebuildsInProgressRow , error ) {
2068
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2069
+ return nil , err
2070
+ }
2071
+ return q .db .GetPrebuildsInProgress (ctx )
2072
+ }
2073
+
2023
2074
func (q * querier ) GetPresetByWorkspaceBuildID (ctx context.Context , workspaceID uuid.UUID ) (database.TemplateVersionPreset , error ) {
2024
2075
if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2025
2076
return database.TemplateVersionPreset {}, err
@@ -2037,6 +2088,13 @@ func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, te
2037
2088
return q .db .GetPresetParametersByTemplateVersionID (ctx , templateVersionID )
2038
2089
}
2039
2090
2091
+ func (q * querier ) GetPresetsBackoff (ctx context.Context , lookback time.Time ) ([]database.GetPresetsBackoffRow , error ) {
2092
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2093
+ return nil , err
2094
+ }
2095
+ return q .db .GetPresetsBackoff (ctx , lookback )
2096
+ }
2097
+
2040
2098
func (q * querier ) GetPresetsByTemplateVersionID (ctx context.Context , templateVersionID uuid.UUID ) ([]database.TemplateVersionPreset , error ) {
2041
2099
// An actor can read template version presets if they can read the related template version.
2042
2100
_ , err := q .GetTemplateVersionByID (ctx , templateVersionID )
@@ -2088,13 +2146,13 @@ func (q *querier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (data
2088
2146
// can read the job.
2089
2147
_ , err := q .GetWorkspaceBuildByJobID (ctx , id )
2090
2148
if err != nil {
2091
- return database.ProvisionerJob {}, err
2149
+ return database.ProvisionerJob {}, xerrors . Errorf ( "fetch related workspace build: %w" , err )
2092
2150
}
2093
2151
case database .ProvisionerJobTypeTemplateVersionDryRun , database .ProvisionerJobTypeTemplateVersionImport :
2094
2152
// Authorized call to get template version.
2095
2153
_ , err := authorizedTemplateVersionFromJob (ctx , q , job )
2096
2154
if err != nil {
2097
- return database.ProvisionerJob {}, err
2155
+ return database.ProvisionerJob {}, xerrors . Errorf ( "fetch related template version: %w" , err )
2098
2156
}
2099
2157
default :
2100
2158
return database.ProvisionerJob {}, xerrors .Errorf ("unknown job type: %q" , job .Type )
@@ -2187,6 +2245,13 @@ func (q *querier) GetReplicasUpdatedAfter(ctx context.Context, updatedAt time.Ti
2187
2245
return q .db .GetReplicasUpdatedAfter (ctx , updatedAt )
2188
2246
}
2189
2247
2248
+ func (q * querier ) GetRunningPrebuilds (ctx context.Context ) ([]database.GetRunningPrebuildsRow , error ) {
2249
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2250
+ return nil , err
2251
+ }
2252
+ return q .db .GetRunningPrebuilds (ctx )
2253
+ }
2254
+
2190
2255
func (q * querier ) GetRuntimeConfig (ctx context.Context , key string ) (string , error ) {
2191
2256
if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceSystem ); err != nil {
2192
2257
return "" , err
@@ -2311,6 +2376,16 @@ func (q *querier) GetTemplateParameterInsights(ctx context.Context, arg database
2311
2376
return q .db .GetTemplateParameterInsights (ctx , arg )
2312
2377
}
2313
2378
2379
+ func (q * querier ) GetTemplatePresetsWithPrebuilds (ctx context.Context , templateID uuid.NullUUID ) ([]database.GetTemplatePresetsWithPrebuildsRow , error ) {
2380
+ // Although this fetches presets. It filters them by prebuilds and is only of use to the prebuild system.
2381
+ // As such, we authorize this in line with other prebuild queries, not with other preset queries.
2382
+
2383
+ if err := q .authorizeContext (ctx , policy .ActionRead , rbac .ResourceTemplate ); err != nil {
2384
+ return nil , err
2385
+ }
2386
+ return q .db .GetTemplatePresetsWithPrebuilds (ctx , templateID )
2387
+ }
2388
+
2314
2389
func (q * querier ) GetTemplateUsageStats (ctx context.Context , arg database.GetTemplateUsageStatsParams ) ([]database.TemplateUsageStat , error ) {
2315
2390
if err := q .authorizeTemplateInsights (ctx , arg .TemplateIDs ); err != nil {
2316
2391
return nil , err
@@ -3235,6 +3310,13 @@ func (q *querier) InsertPresetParameters(ctx context.Context, arg database.Inser
3235
3310
return q .db .InsertPresetParameters (ctx , arg )
3236
3311
}
3237
3312
3313
+ func (q * querier ) InsertPresetPrebuild (ctx context.Context , arg database.InsertPresetPrebuildParams ) (database.TemplateVersionPresetPrebuild , error ) {
3314
+ if err := q .authorizeContext (ctx , policy .ActionCreate , rbac .ResourceSystem ); err != nil {
3315
+ return database.TemplateVersionPresetPrebuild {}, err
3316
+ }
3317
+ return q .db .InsertPresetPrebuild (ctx , arg )
3318
+ }
3319
+
3238
3320
// TODO: We need to create a ProvisionerJob resource type
3239
3321
func (q * querier ) InsertProvisionerJob (ctx context.Context , arg database.InsertProvisionerJobParams ) (database.ProvisionerJob , error ) {
3240
3322
// if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
0 commit comments