2
2
# Distributed under the terms of the Modified BSD License.
3
3
"""Session manager that keeps all its metadata in memory."""
4
4
5
+ from __future__ import annotations
6
+
5
7
import getpass
6
8
import json
7
9
import os
@@ -49,7 +51,7 @@ class KernelSessionManager(LoggingConfigurable):
49
51
)
50
52
51
53
@default ("enable_persistence" )
52
- def session_persistence_default (self ):
54
+ def session_persistence_default (self ) -> bool :
53
55
return bool (
54
56
os .getenv (
55
57
self .session_persistence_env , str (self .session_persistence_default_value )
@@ -66,16 +68,16 @@ def session_persistence_default(self):
66
68
)
67
69
68
70
@default ("persistence_root" )
69
- def persistence_root_default (self ):
71
+ def persistence_root_default (self ) -> str :
70
72
return os .getenv (self .persistence_root_env , "/" )
71
73
72
- def __init__ (self , kernel_manager , ** kwargs ):
74
+ def __init__ (self , kernel_manager : RemoteMappingKernelManager , ** kwargs ): # noqa: F821
73
75
super ().__init__ (** kwargs )
74
76
self .kernel_manager = kernel_manager
75
77
self ._sessions = dict ()
76
78
self ._sessionsByUser = dict ()
77
79
78
- def create_session (self , kernel_id , ** kwargs ):
80
+ def create_session (self , kernel_id : str , ** kwargs ) -> None :
79
81
"""
80
82
Creates a session associated with this kernel.
81
83
@@ -106,7 +108,7 @@ def create_session(self, kernel_id, **kwargs):
106
108
)
107
109
self ._save_session (kernel_id , kernel_session )
108
110
109
- def refresh_session (self , kernel_id ) :
111
+ def refresh_session (self , kernel_id : str ) -> None :
110
112
"""
111
113
Refreshes the session from its persisted state. Called on kernel restarts.
112
114
"""
@@ -123,7 +125,7 @@ def refresh_session(self, kernel_id):
123
125
)
124
126
self ._save_session (kernel_id , kernel_session )
125
127
126
- def _save_session (self , kernel_id , kernel_session ) :
128
+ def _save_session (self , kernel_id : str , kernel_session : dict ) -> None :
127
129
# Write/commit the addition, update dictionary
128
130
kernels_lock .acquire ()
129
131
try :
@@ -140,12 +142,13 @@ def _save_session(self, kernel_id, kernel_session):
140
142
finally :
141
143
kernels_lock .release ()
142
144
143
- def start_session (self , kernel_id ) :
145
+ def start_session (self , kernel_id : str ) -> bool | None :
144
146
kernel_session = self ._sessions .get (kernel_id , None )
145
147
if kernel_session is not None :
146
148
return self ._start_session (kernel_session )
149
+ return None
147
150
148
- def start_sessions (self ):
151
+ def start_sessions (self ) -> None :
149
152
"""
150
153
Attempt to start persisted sessions.
151
154
@@ -173,7 +176,7 @@ def start_sessions(self):
173
176
174
177
self ._delete_sessions (sessions_to_remove )
175
178
176
- def _start_session (self , kernel_session ) :
179
+ def _start_session (self , kernel_session : dict ) -> bool :
177
180
# Attempt to start kernel from persisted state. if started, record kernel_session in dictionary
178
181
# else delete session
179
182
kernel_id = kernel_session ["kernel_id" ]
@@ -189,7 +192,7 @@ def _start_session(self, kernel_session):
189
192
190
193
return True
191
194
192
- def delete_session (self , kernel_id ) :
195
+ def delete_session (self , kernel_id : str ) -> None :
193
196
"""
194
197
Removes saved session associated with kernel_id from dictionary and persisted storage.
195
198
"""
@@ -198,7 +201,7 @@ def delete_session(self, kernel_id):
198
201
if self .enable_persistence :
199
202
self .log .info ("Deleted persisted kernel session for id: %s" % kernel_id )
200
203
201
- def _delete_sessions (self , kernel_ids ) :
204
+ def _delete_sessions (self , kernel_ids : list [ str ]) -> None :
202
205
# Remove unstarted sessions and rewrite
203
206
kernels_lock .acquire ()
204
207
try :
@@ -219,7 +222,7 @@ def _delete_sessions(self, kernel_ids):
219
222
kernels_lock .release ()
220
223
221
224
@staticmethod
222
- def pre_save_transformation (session ) :
225
+ def pre_save_transformation (session : dict ) -> dict :
223
226
kernel_id = list (session .keys ())[0 ]
224
227
session_info = session [kernel_id ]
225
228
if session_info .get ("connection_info" ):
@@ -231,7 +234,7 @@ def pre_save_transformation(session):
231
234
return session
232
235
233
236
@staticmethod
234
- def post_load_transformation (session ) :
237
+ def post_load_transformation (session : dict ) -> dict :
235
238
kernel_id = list (session .keys ())[0 ]
236
239
session_info = session [kernel_id ]
237
240
if session_info .get ("connection_info" ):
@@ -243,7 +246,7 @@ def post_load_transformation(session):
243
246
return session
244
247
245
248
# abstractmethod
246
- def load_sessions (self ):
249
+ def load_sessions (self ) -> None :
247
250
"""
248
251
Load and initialize _sessions member from persistent storage. This method is called from start_sessions().
249
252
"""
@@ -252,33 +255,31 @@ def load_sessions(self):
252
255
)
253
256
254
257
# abstractmethod
255
- def load_session (self , kernel_id ) :
258
+ def load_session (self , kernel_id : str ) -> None :
256
259
"""
257
260
Load and initialize _sessions member from persistent storage for a single kernel. This method is called from
258
261
refresh_sessions().
259
262
"""
260
- raise NotImplementedError (
261
- "KernelSessionManager.load_sessions() requires an implementation!"
262
- )
263
+ raise NotImplementedError ("KernelSessionManager.load_session() requires an implementation!" )
263
264
264
265
# abstractmethod
265
- def delete_sessions (self , kernel_ids ) :
266
+ def delete_sessions (self , kernel_ids : list [ str ]) -> None :
266
267
"""
267
268
Delete the sessions in persistent storage. Caller is responsible for synchronizing call.
268
269
"""
269
270
raise NotImplementedError (
270
271
"KernelSessionManager.delete_sessions(kernel_ids) requires an implementation!"
271
272
)
272
273
273
- def save_session (self , kernel_id ) :
274
+ def save_session (self , kernel_id : str ) -> None :
274
275
"""
275
276
Saves the sessions dictionary to persistent store. Caller is responsible for synchronizing call.
276
277
"""
277
278
raise NotImplementedError (
278
279
"KernelSessionManager.save_session(kernel_id) requires an implementation!"
279
280
)
280
281
281
- def active_sessions (self , username ) :
282
+ def active_sessions (self , username : str ) -> int :
282
283
"""
283
284
Returns the number of active sessions for the given username.
284
285
@@ -296,7 +297,7 @@ def active_sessions(self, username):
296
297
return 0
297
298
298
299
@staticmethod
299
- def get_kernel_username (** kwargs ):
300
+ def get_kernel_username (** kwargs ) -> str :
300
301
"""
301
302
Returns the kernel's logical username from env dict.
302
303
@@ -331,23 +332,23 @@ class FileKernelSessionManager(KernelSessionManager):
331
332
332
333
# Change the default to Jupyter Data Dir.
333
334
@default ("persistence_root" )
334
- def persistence_root_default (self ):
335
+ def persistence_root_default (self ) -> str :
335
336
return os .getenv (self .persistence_root_env , jupyter_data_dir ())
336
337
337
- def __init__ (self , kernel_manager , ** kwargs ):
338
+ def __init__ (self , kernel_manager : RemoteMappingKernelManager , ** kwargs ): # noqa: F821
338
339
super ().__init__ (kernel_manager , ** kwargs )
339
340
if self .enable_persistence :
340
341
self .log .info (f"Kernel session persistence location: { self ._get_sessions_loc ()} " )
341
342
342
- def delete_sessions (self , kernel_ids ) :
343
+ def delete_sessions (self , kernel_ids : list [ str ]) -> None :
343
344
if self .enable_persistence :
344
345
for kernel_id in kernel_ids :
345
346
kernel_file_name = "" .join ([kernel_id , ".json" ])
346
347
kernel_session_file_path = os .path .join (self ._get_sessions_loc (), kernel_file_name )
347
348
if os .path .exists (kernel_session_file_path ):
348
349
os .remove (kernel_session_file_path )
349
350
350
- def save_session (self , kernel_id ) :
351
+ def save_session (self , kernel_id : str ) -> None :
351
352
if self .enable_persistence :
352
353
if kernel_id is not None :
353
354
kernel_file_name = "" .join ([kernel_id , ".json" ])
@@ -358,7 +359,7 @@ def save_session(self, kernel_id):
358
359
json .dump (KernelSessionManager .pre_save_transformation (temp_session ), fp )
359
360
fp .close ()
360
361
361
- def load_sessions (self ):
362
+ def load_sessions (self ) -> None :
362
363
if self .enable_persistence :
363
364
kernel_session_files = [
364
365
json_files
@@ -368,21 +369,21 @@ def load_sessions(self):
368
369
for kernel_session_file in kernel_session_files :
369
370
self ._load_session_from_file (kernel_session_file )
370
371
371
- def load_session (self , kernel_id ) :
372
+ def load_session (self , kernel_id : str ) -> None :
372
373
if self .enable_persistence :
373
374
if kernel_id is not None :
374
375
kernel_session_file = "" .join ([kernel_id , ".json" ])
375
376
self ._load_session_from_file (kernel_session_file )
376
377
377
- def _load_session_from_file (self , file_name ) :
378
+ def _load_session_from_file (self , file_name : str ) -> None :
378
379
kernel_session_file_path = os .path .join (self ._get_sessions_loc (), file_name )
379
380
if os .path .exists (kernel_session_file_path ):
380
381
self .log .debug (f"Loading saved session(s) from { kernel_session_file_path } " )
381
382
with open (kernel_session_file_path ) as fp :
382
383
self ._sessions .update (KernelSessionManager .post_load_transformation (json .load (fp )))
383
384
fp .close ()
384
385
385
- def _get_sessions_loc (self ):
386
+ def _get_sessions_loc (self ) -> str :
386
387
path = os .path .join (self .persistence_root , KERNEL_SESSIONS_DIR_NAME )
387
388
if not os .path .exists (path ):
388
389
os .makedirs (path , 0o755 )
@@ -406,7 +407,7 @@ class WebhookKernelSessionManager(KernelSessionManager):
406
407
)
407
408
408
409
@default ("webhook_url" )
409
- def webhook_url_default (self ):
410
+ def webhook_url_default (self ) -> str | None :
410
411
return os .getenv (self .webhook_url_env , None )
411
412
412
413
# Webhook Username
@@ -418,7 +419,7 @@ def webhook_url_default(self):
418
419
)
419
420
420
421
@default ("webhook_username" )
421
- def webhook_username_default (self ):
422
+ def webhook_username_default (self ) -> str | None :
422
423
return os .getenv (self .webhook_username_env , None )
423
424
424
425
# Webhook Password
@@ -430,7 +431,7 @@ def webhook_username_default(self):
430
431
)
431
432
432
433
@default ("webhook_password" )
433
- def webhook_password_default (self ):
434
+ def webhook_password_default (self ) -> str | None :
434
435
return os .getenv (self .webhook_password_env , None )
435
436
436
437
# Auth Type
@@ -443,10 +444,10 @@ def webhook_password_default(self):
443
444
)
444
445
445
446
@default ("auth_type" )
446
- def auth_type_default (self ):
447
+ def auth_type_default (self ) -> str | None :
447
448
return os .getenv (self .auth_type_env , None )
448
449
449
- def __init__ (self , kernel_manager , ** kwargs ):
450
+ def __init__ (self , kernel_manager : RemoteMappingKernelManager , ** kwargs ): # noqa: F821
450
451
super ().__init__ (kernel_manager , ** kwargs )
451
452
if self .enable_persistence :
452
453
self .log .info ("Webhook kernel session persistence activated" )
@@ -464,7 +465,7 @@ def __init__(self, kernel_manager, **kwargs):
464
465
else :
465
466
self .log .error ("Username and/or password aren't set" )
466
467
467
- def delete_sessions (self , kernel_ids ) :
468
+ def delete_sessions (self , kernel_ids : list [ str ]) -> None :
468
469
"""
469
470
Deletes kernel sessions from database
470
471
@@ -476,7 +477,7 @@ def delete_sessions(self, kernel_ids):
476
477
if response .status_code != 204 :
477
478
self .log .error (response .raise_for_status ())
478
479
479
- def save_session (self , kernel_id ) :
480
+ def save_session (self , kernel_id : str ) -> None :
480
481
"""
481
482
Saves kernel session to database
482
483
@@ -494,7 +495,7 @@ def save_session(self, kernel_id):
494
495
if response .status_code != 204 :
495
496
self .log .error (response .raise_for_status ())
496
497
497
- def load_sessions (self ):
498
+ def load_sessions (self ) -> None :
498
499
"""
499
500
Loads kernel sessions from database
500
501
"""
@@ -507,7 +508,7 @@ def load_sessions(self):
507
508
else :
508
509
self .log .error (response .raise_for_status ())
509
510
510
- def load_session (self , kernel_id ) :
511
+ def load_session (self , kernel_id : str ) -> None :
511
512
"""
512
513
Loads a kernel session from database
513
514
@@ -522,7 +523,7 @@ def load_session(self, kernel_id):
522
523
else :
523
524
self .log .error (response .raise_for_status ())
524
525
525
- def _load_session_from_response (self , kernel_session : dict ):
526
+ def _load_session_from_response (self , kernel_session : dict ) -> None :
526
527
"""
527
528
Loads kernel session to current session
528
529
0 commit comments