Skip to content

Commit 5bb371e

Browse files
committed
add DatabaseManager class
1 parent 576fecf commit 5bb371e

File tree

5 files changed

+60
-6
lines changed

5 files changed

+60
-6
lines changed

jupyter_scheduler/executors.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ class ExecutionManager(ABC):
2929
_model = None
3030
_db_session = None
3131

32-
def __init__(self, job_id: str, root_dir: str, db_url: str, staging_paths: Dict[str, str]):
32+
def __init__(self, job_id: str, root_dir: str, db_url: str, staging_paths: Dict[str, str], database_manager=None):
3333
self.job_id = job_id
3434
self.staging_paths = staging_paths
3535
self.root_dir = root_dir
3636
self.db_url = db_url
37+
self.database_manager = database_manager
3738

3839
@property
3940
def model(self):
@@ -46,7 +47,7 @@ def model(self):
4647
@property
4748
def db_session(self):
4849
if self._db_session is None:
49-
self._db_session = create_session(self.db_url)
50+
self._db_session = create_session(self.db_url, self.database_manager)
5051

5152
return self._db_session
5253

jupyter_scheduler/extension.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ class SchedulerApp(ExtensionApp):
4545
def _db_url_default(self):
4646
return f"sqlite:///{jupyter_data_dir()}/scheduler.sqlite"
4747

48+
database_manager_class = Type(
49+
default_value=None,
50+
klass="jupyter_scheduler.managers.DatabaseManager",
51+
config=True,
52+
help=_i18n("Database manager class. If None, uses SQLAlchemy with db_url."),
53+
)
54+
4855
environment_manager_class = Type(
4956
default_value="jupyter_scheduler.environments.CondaEnvironmentManager",
5057
klass="jupyter_scheduler.environments.EnvironmentManager",
@@ -69,7 +76,8 @@ def _db_url_default(self):
6976
def initialize_settings(self):
7077
super().initialize_settings()
7178

72-
create_tables(self.db_url, self.drop_tables)
79+
database_manager = self.database_manager_class() if self.database_manager_class else None
80+
create_tables(self.db_url, self.drop_tables, database_manager=database_manager)
7381

7482
environments_manager = self.environment_manager_class()
7583

@@ -78,6 +86,7 @@ def initialize_settings(self):
7886
environments_manager=environments_manager,
7987
db_url=self.db_url,
8088
config=self.config,
89+
database_manager=database_manager,
8190
)
8291

8392
job_files_manager = self.job_files_manager_class(scheduler=scheduler)

jupyter_scheduler/managers.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""Database managers for custom database backends."""
2+
3+
from abc import ABC, abstractmethod
4+
5+
6+
class DatabaseManager(ABC):
7+
"""Base class for database managers.
8+
9+
Database managers handle database operations for jupyter-scheduler.
10+
Subclasses can implement custom storage backends (K8s, Redis, etc.)
11+
while maintaining compatibility with the scheduler's session interface.
12+
"""
13+
14+
@abstractmethod
15+
def create_session(self, db_url: str):
16+
"""Create a database session.
17+
18+
Args:
19+
db_url: Database URL (e.g., "k8s://namespace", "redis://localhost")
20+
21+
Returns:
22+
Session object compatible with SQLAlchemy session interface
23+
"""
24+
pass
25+
26+
@abstractmethod
27+
def create_tables(self, db_url: str, drop_tables: bool = False):
28+
"""Create database tables/schema.
29+
30+
Args:
31+
db_url: Database URL
32+
drop_tables: Whether to drop existing tables first
33+
"""
34+
pass

jupyter_scheduler/orm.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ def update_db_schema(engine, Base):
146146
connection.execute(alter_statement)
147147

148148

149-
def create_tables(db_url, drop_tables=False, Base=Base):
149+
def create_tables(db_url, drop_tables=False, Base=Base, database_manager=None):
150+
if database_manager:
151+
database_manager.create_tables(db_url, drop_tables)
152+
return
153+
150154
engine = create_engine(db_url)
151155
update_db_schema(engine, Base)
152156

@@ -159,7 +163,10 @@ def create_tables(db_url, drop_tables=False, Base=Base):
159163
Base.metadata.create_all(engine)
160164

161165

162-
def create_session(db_url):
166+
def create_session(db_url, database_manager=None):
167+
if database_manager:
168+
return database_manager.create_session(db_url)
169+
163170
engine = create_engine(db_url, echo=False)
164171
Session = sessionmaker(bind=engine)
165172

jupyter_scheduler/scheduler.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,19 +405,21 @@ def __init__(
405405
environments_manager: Type[EnvironmentManager],
406406
db_url: str,
407407
config=None,
408+
database_manager=None,
408409
**kwargs,
409410
):
410411
super().__init__(
411412
root_dir=root_dir, environments_manager=environments_manager, config=config, **kwargs
412413
)
413414
self.db_url = db_url
415+
self.database_manager = database_manager
414416
if self.task_runner_class:
415417
self.task_runner = self.task_runner_class(scheduler=self, config=config)
416418

417419
@property
418420
def db_session(self):
419421
if not self._db_session:
420-
self._db_session = create_session(self.db_url)
422+
self._db_session = create_session(self.db_url, self.database_manager)
421423

422424
return self._db_session
423425

@@ -492,6 +494,7 @@ def create_job(self, model: CreateJob) -> str:
492494
staging_paths=staging_paths,
493495
root_dir=self.root_dir,
494496
db_url=self.db_url,
497+
database_manager=self.database_manager,
495498
).process
496499
)
497500
p.start()

0 commit comments

Comments
 (0)