@@ -22,7 +22,6 @@ import (
22
22
const DefaultServiceAccountName string = "default-editor"
23
23
const SharedMemoryVolumeName string = "dshm"
24
24
const SharedMemoryVolumePath string = "/dev/shm"
25
- const WorkspacePath string = "/home/jovyan"
26
25
27
26
type volumetype string
28
27
@@ -294,6 +293,9 @@ func (s *server) NewNotebook(w http.ResponseWriter, r *http.Request) {
294
293
if req .CustomImageCheck {
295
294
image = req .CustomImage
296
295
}
296
+ if s .Config .SpawnerFormDefaults .Image .ReadOnly {
297
+ image = s .Config .SpawnerFormDefaults .Image .Value
298
+ }
297
299
298
300
// Setup the notebook
299
301
// TODO: Work with default CPU/memory limits from config
@@ -311,14 +313,8 @@ func (s *server) NewNotebook(w http.ResponseWriter, r *http.Request) {
311
313
Name : req .Name ,
312
314
Image : image ,
313
315
Resources : corev1.ResourceRequirements {
314
- Limits : corev1.ResourceList {
315
- corev1 .ResourceCPU : req .CPU ,
316
- corev1 .ResourceMemory : req .Memory ,
317
- },
318
- Requests : corev1.ResourceList {
319
- corev1 .ResourceCPU : req .CPU ,
320
- corev1 .ResourceMemory : req .Memory ,
321
- },
316
+ Requests : corev1.ResourceList {},
317
+ Limits : corev1.ResourceList {},
322
318
},
323
319
},
324
320
},
@@ -327,26 +323,97 @@ func (s *server) NewNotebook(w http.ResponseWriter, r *http.Request) {
327
323
},
328
324
}
329
325
330
- // Add workspace volume
331
- if ! req .NoWorkspace {
332
- req .Workspace .Path = WorkspacePath
333
- err = s .handleVolume (r .Context (), req .Workspace , & notebook )
326
+ // Resources
327
+ if s .Config .SpawnerFormDefaults .CPU .ReadOnly {
328
+ val , err := resource .ParseQuantity (s .Config .SpawnerFormDefaults .CPU .Value )
334
329
if err != nil {
335
330
s .error (w , r , err )
336
331
return
337
332
}
333
+
334
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceCPU ] = val
335
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceCPU ] = val
336
+ } else {
337
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceCPU ] = req .CPU
338
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceCPU ] = req .CPU
338
339
}
339
340
340
- for _ , volreq := range req . DataVolumes {
341
- err = s . handleVolume ( r . Context (), volreq , & notebook )
341
+ if s . Config . SpawnerFormDefaults . Memory . ReadOnly {
342
+ val , err := resource . ParseQuantity ( s . Config . SpawnerFormDefaults . Memory . Value )
342
343
if err != nil {
343
344
s .error (w , r , err )
344
345
return
345
346
}
347
+
348
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceMemory ] = val
349
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceMemory ] = val
350
+ } else {
351
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceMemory ] = req .Memory
352
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceMemory ] = req .Memory
353
+ }
354
+
355
+ // Add workspace volume
356
+ if s .Config .SpawnerFormDefaults .WorkspaceVolume .ReadOnly {
357
+ size , err := resource .ParseQuantity (s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .Size .Value )
358
+ if err != nil {
359
+ s .error (w , r , err )
360
+ return
361
+ }
362
+
363
+ workspaceVol := volumerequest {
364
+ Name : s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .Name .Value ,
365
+ Size : size ,
366
+ Path : s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .MountPath .Value ,
367
+ Mode : corev1 .PersistentVolumeAccessMode (s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .AccessModes .Value ),
368
+ Class : s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .Class .Value ,
369
+ }
370
+ err = s .handleVolume (r .Context (), workspaceVol , & notebook )
371
+ if err != nil {
372
+ s .error (w , r , err )
373
+ return
374
+ }
375
+ } else if ! req .NoWorkspace {
376
+ req .Workspace .Path = s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .MountPath .Value
377
+ err = s .handleVolume (r .Context (), req .Workspace , & notebook )
378
+ if err != nil {
379
+ s .error (w , r , err )
380
+ return
381
+ }
382
+ }
383
+
384
+ if s .Config .SpawnerFormDefaults .DataVolumes .ReadOnly {
385
+ for _ , volreq := range s .Config .SpawnerFormDefaults .DataVolumes .Values {
386
+ size , err := resource .ParseQuantity (s .Config .SpawnerFormDefaults .WorkspaceVolume .Value .Size .Value )
387
+ if err != nil {
388
+ s .error (w , r , err )
389
+ return
390
+ }
391
+
392
+ vol := volumerequest {
393
+ Name : volreq .Name .Value ,
394
+ Size : size ,
395
+ Path : volreq .MountPath .Value ,
396
+ Mode : corev1 .PersistentVolumeAccessMode (volreq .AccessModes .Value ),
397
+ Class : volreq .Class .Value ,
398
+ }
399
+ err = s .handleVolume (r .Context (), vol , & notebook )
400
+ if err != nil {
401
+ s .error (w , r , err )
402
+ return
403
+ }
404
+ }
405
+ } else {
406
+ for _ , volreq := range req .DataVolumes {
407
+ err = s .handleVolume (r .Context (), volreq , & notebook )
408
+ if err != nil {
409
+ s .error (w , r , err )
410
+ return
411
+ }
412
+ }
346
413
}
347
414
348
415
// Add shared memory, if enabled
349
- if req .EnableSharedMemory {
416
+ if ( s . Config . SpawnerFormDefaults . SharedMemory . ReadOnly && s . Config . SpawnerFormDefaults . SharedMemory . Value ) || ( ! s . Config . SpawnerFormDefaults . SharedMemory . ReadOnly && req .EnableSharedMemory ) {
350
417
notebook .Spec .Template .Spec .Volumes = append (notebook .Spec .Template .Spec .Volumes , corev1.Volume {
351
418
Name : SharedMemoryVolumeName ,
352
419
VolumeSource : corev1.VolumeSource {
@@ -363,15 +430,28 @@ func (s *server) NewNotebook(w http.ResponseWriter, r *http.Request) {
363
430
}
364
431
365
432
// Add GPU
366
- if req .GPUs .Quantity != "none" {
367
- qty , err := resource .ParseQuantity (req .GPUs .Quantity )
368
- if err != nil {
369
- s .error (w , r , err )
370
- return
433
+ if s .Config .SpawnerFormDefaults .GPUs .ReadOnly {
434
+ if s .Config .SpawnerFormDefaults .GPUs .Value .Quantity != "none" {
435
+ qty , err := resource .ParseQuantity (s .Config .SpawnerFormDefaults .GPUs .Value .Quantity )
436
+ if err != nil {
437
+ s .error (w , r , err )
438
+ return
439
+ }
440
+
441
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceName (s .Config .SpawnerFormDefaults .GPUs .Value .Vendor )] = qty
442
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceName (s .Config .SpawnerFormDefaults .GPUs .Value .Vendor )] = qty
371
443
}
444
+ } else {
445
+ if req .GPUs .Quantity != "none" {
446
+ qty , err := resource .ParseQuantity (req .GPUs .Quantity )
447
+ if err != nil {
448
+ s .error (w , r , err )
449
+ return
450
+ }
372
451
373
- notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceName (req .GPUs .Vendor )] = qty
374
- notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceName (req .GPUs .Vendor )] = qty
452
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Requests [corev1 .ResourceName (req .GPUs .Vendor )] = qty
453
+ notebook .Spec .Template .Spec .Containers [0 ].Resources .Limits [corev1 .ResourceName (req .GPUs .Vendor )] = qty
454
+ }
375
455
}
376
456
377
457
log .Printf ("creating notebook %q for %q" , notebook .ObjectMeta .Name , namespace )
0 commit comments