@@ -213,16 +213,31 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
213
213
return
214
214
}
215
215
216
- var ttl time.Duration
216
+ var (
217
+ defaultTTL time.Duration
218
+ maxTTL time.Duration
219
+ )
217
220
if createTemplate .DefaultTTLMillis != nil {
218
- ttl = time .Duration (* createTemplate .DefaultTTLMillis ) * time .Millisecond
221
+ defaultTTL = time .Duration (* createTemplate .DefaultTTLMillis ) * time .Millisecond
222
+ }
223
+ if createTemplate .MaxTTLMillis != nil {
224
+ maxTTL = time .Duration (* createTemplate .MaxTTLMillis ) * time .Millisecond
225
+ }
226
+
227
+ var validErrs []codersdk.ValidationError
228
+ if defaultTTL < 0 {
229
+ validErrs = append (validErrs , codersdk.ValidationError {Field : "default_ttl_ms" , Detail : "Must be a positive integer." })
230
+ }
231
+ if maxTTL < 0 {
232
+ validErrs = append (validErrs , codersdk.ValidationError {Field : "max_ttl_ms" , Detail : "Must be a positive integer." })
233
+ }
234
+ if maxTTL != 0 && defaultTTL > maxTTL {
235
+ validErrs = append (validErrs , codersdk.ValidationError {Field : "default_ttl_ms" , Detail : "Must be less than or equal to max_ttl_ms if max_ttl_ms is set." })
219
236
}
220
- if ttl < 0 {
237
+ if len ( validErrs ) > 0 {
221
238
httpapi .Write (ctx , rw , http .StatusBadRequest , codersdk.Response {
222
- Message : "Invalid create template request." ,
223
- Validations : []codersdk.ValidationError {
224
- {Field : "default_ttl_ms" , Detail : "Must be a positive integer." },
225
- },
239
+ Message : "Invalid create template request." ,
240
+ Validations : validErrs ,
226
241
})
227
242
return
228
243
}
@@ -245,7 +260,6 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
245
260
Provisioner : importJob .Provisioner ,
246
261
ActiveVersionID : templateVersion .ID ,
247
262
Description : createTemplate .Description ,
248
- DefaultTTL : int64 (ttl ),
249
263
CreatedBy : apiKey .UserID ,
250
264
UserACL : database.TemplateACL {},
251
265
GroupACL : database.TemplateACL {
@@ -259,6 +273,17 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque
259
273
return xerrors .Errorf ("insert template: %s" , err )
260
274
}
261
275
276
+ if defaultTTL != 0 || maxTTL != 0 {
277
+ dbTemplate , err = (* api .TemplateScheduleStore .Load ()).SetTemplateScheduleOptions (ctx , tx , dbTemplate , provisionerdserver.TemplateScheduleOptions {
278
+ UserSchedulingEnabled : true ,
279
+ DefaultTTL : defaultTTL ,
280
+ MaxTTL : maxTTL ,
281
+ })
282
+ if err != nil {
283
+ return xerrors .Errorf ("set template schedule options: %s" , err )
284
+ }
285
+ }
286
+
262
287
templateAudit .New = dbTemplate
263
288
264
289
err = tx .UpdateTemplateVersionByID (ctx , database.UpdateTemplateVersionByIDParams {
@@ -453,6 +478,12 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
453
478
if req .DefaultTTLMillis < 0 {
454
479
validErrs = append (validErrs , codersdk.ValidationError {Field : "default_ttl_ms" , Detail : "Must be a positive integer." })
455
480
}
481
+ if req .MaxTTLMillis < 0 {
482
+ validErrs = append (validErrs , codersdk.ValidationError {Field : "max_ttl_ms" , Detail : "Must be a positive integer." })
483
+ }
484
+ if req .MaxTTLMillis != 0 && req .DefaultTTLMillis > req .MaxTTLMillis {
485
+ validErrs = append (validErrs , codersdk.ValidationError {Field : "default_ttl_ms" , Detail : "Must be less than or equal to max_ttl_ms if max_ttl_ms is set." })
486
+ }
456
487
457
488
if len (validErrs ) > 0 {
458
489
httpapi .Write (ctx , rw , http .StatusBadRequest , codersdk.Response {
@@ -469,7 +500,8 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
469
500
req .DisplayName == template .DisplayName &&
470
501
req .Icon == template .Icon &&
471
502
req .AllowUserCancelWorkspaceJobs == template .AllowUserCancelWorkspaceJobs &&
472
- req .DefaultTTLMillis == time .Duration (template .DefaultTTL ).Milliseconds () {
503
+ req .DefaultTTLMillis == time .Duration (template .DefaultTTL ).Milliseconds () &&
504
+ req .MaxTTLMillis == time .Duration (template .MaxTTL ).Milliseconds () {
473
505
return nil
474
506
}
475
507
@@ -647,6 +679,7 @@ func (api *API) convertTemplate(
647
679
Description : template .Description ,
648
680
Icon : template .Icon ,
649
681
DefaultTTLMillis : time .Duration (template .DefaultTTL ).Milliseconds (),
682
+ MaxTTLMillis : time .Duration (template .MaxTTL ).Milliseconds (),
650
683
CreatedByID : template .CreatedBy ,
651
684
CreatedByName : createdByName ,
652
685
AllowUserCancelWorkspaceJobs : template .AllowUserCancelWorkspaceJobs ,
0 commit comments