Skip to content

Commit bd5be17

Browse files
Instantiate manager during extension loading
We add manager as a traitlet to ServerApp and add monitor as a callback to ServerApp IO lopp Simplify API handlers setup
1 parent 5002625 commit bd5be17

File tree

2 files changed

+33
-38
lines changed

2 files changed

+33
-38
lines changed

jupyter_server_proxy/__init__.py

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
from jupyter_server.utils import url_path_join as ujoin
2-
3-
from .api import (
4-
IconHandler,
5-
ListServersAPIHandler,
6-
ServersAPIHandler,
7-
ServersInfoHandler,
8-
)
1+
import traitlets
2+
3+
from .manager import ServerProxyAppManager
94
from .config import ServerProxy as ServerProxyConfig
105
from .config import get_entrypoint_server_processes, make_handlers, make_server_process
116
from .handlers import setup_handlers
7+
from .api import setup_api_handlers
128

139

1410
# Jupyter Extension points
@@ -43,14 +39,33 @@ def _jupyter_labextension_paths():
4339
def _load_jupyter_server_extension(nbapp):
4440
# Set up handlers picked up via config
4541
base_url = nbapp.web_app.settings["base_url"]
42+
43+
# Add server_proxy_manager trait to ServerApp and Instantiate a manager
44+
nbapp.add_traits(
45+
server_proxy_manager=traitlets.Instance(ServerProxyAppManager)
46+
)
47+
manager = nbapp.server_proxy_manager = ServerProxyAppManager()
4648
serverproxy_config = ServerProxyConfig(parent=nbapp)
4749

50+
# Add a long running background task that monitors the running proxies
51+
try:
52+
nbapp.io_loop.call_later(
53+
serverproxy_config.monitor_interval,
54+
manager.monitor,
55+
serverproxy_config.monitor_interval
56+
)
57+
except AttributeError:
58+
nbapp.log.debug(
59+
"[jupyter-server-proxy] Server proxy manager is only supportted "
60+
"for Notebook >= 7",
61+
)
62+
4863
server_processes = [
4964
make_server_process(name, server_process_config, serverproxy_config)
5065
for name, server_process_config in serverproxy_config.servers.items()
5166
]
5267
server_processes += get_entrypoint_server_processes(serverproxy_config)
53-
server_handlers = make_handlers(base_url, server_processes)
68+
server_handlers = make_handlers(base_url, manager, server_processes)
5469
nbapp.web_app.add_handlers(".*", server_handlers)
5570

5671
# Set up default non-server handler
@@ -59,29 +74,10 @@ def _load_jupyter_server_extension(nbapp):
5974
serverproxy_config,
6075
)
6176

62-
icon_handlers = []
63-
for sp in server_processes:
64-
if sp.launcher_entry.enabled and sp.launcher_entry.icon_path:
65-
icon_handlers.append(
66-
(
67-
ujoin(base_url, f"server-proxy/icon/{sp.name}"),
68-
IconHandler,
69-
{"path": sp.launcher_entry.icon_path},
70-
)
71-
)
72-
73-
nbapp.web_app.add_handlers(
74-
".*",
75-
[
76-
(
77-
ujoin(base_url, "api/server-proxy/servers-info"),
78-
ServersInfoHandler,
79-
{"server_processes": server_processes},
80-
),
81-
(ujoin(base_url, r"api/server-proxy"), ListServersAPIHandler),
82-
(ujoin(base_url, r"api/server-proxy/(?P<name>.*)"), ServersAPIHandler),
83-
]
84-
+ icon_handlers,
77+
setup_api_handlers(
78+
nbapp.web_app,
79+
manager,
80+
server_processes,
8581
)
8682

8783
nbapp.log.debug(

jupyter_server_proxy/handlers.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from traitlets import Bytes, Dict, Instance, Integer, Unicode, Union, default, observe
2121
from traitlets.traitlets import HasTraits
2222

23-
from .manager import manager
2423
from .unixsock import UnixResolver
2524
from .utils import call_with_asked_args
2625
from .websocket import WebSocketHandlerMixin, pingable_ws_connect
@@ -712,8 +711,9 @@ def __init__(self, *args, **kwargs):
712711
self.command = list()
713712
super().__init__(*args, **kwargs)
714713

715-
def initialize(self, state):
714+
def initialize(self, state, manager):
716715
self.state = state
716+
self.manager = manager
717717
if "proc_lock" not in state:
718718
state["proc_lock"] = Lock()
719719

@@ -803,7 +803,7 @@ async def ensure_process(self):
803803
async with self.state["proc_lock"]:
804804
# If the server process is terminated via Runningsessions or killed
805805
# outside of jsp, we should be able to restart the process. If
806-
# process is not in running stated, remove proc object and restart
806+
# process is not in running state, remove proc object and restart
807807
# the process
808808
if "proc" in self.state:
809809
if not self.state["proc"].running:
@@ -846,9 +846,8 @@ async def ensure_process(self):
846846
raise web.HTTPError(500, f"could not start {self.name} in time")
847847

848848
# If process started succesfully, add it to manager
849-
# Add the server proxy app to manager
850-
await manager.add_server_proxy_app(
851-
self.name, self.base_url, cmd, self.port, proc
849+
self.manager.add_server_proxy_app(
850+
self.name, self.base_url, cmd, self.port, proc, self.unix_socket
852851
)
853852
except:
854853
# Make sure we remove proc from state in any error condition

0 commit comments

Comments
 (0)