Skip to content

Commit d0faa17

Browse files
Add API handlers to list&del servers from manager
Existing servers-info endpoint is moved with api sub directory to have a consistent end point scheme.
1 parent 085ff47 commit d0faa17

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

jupyter_server_proxy/__init__.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
from jupyter_server.utils import url_path_join as ujoin
22

3-
from .api import IconHandler, ServersInfoHandler
3+
from .api import (
4+
IconHandler, ServersInfoHandler, ServersAPIHandler, ListServersAPIHandler
5+
)
46
from .config import ServerProxy as ServerProxyConfig
5-
from .config import get_entrypoint_server_processes, make_handlers, make_server_process
7+
from .config import (
8+
get_entrypoint_server_processes, make_handlers, make_server_process
9+
)
610
from .handlers import setup_handlers
711

812

@@ -63,11 +67,23 @@ def _load_jupyter_server_extension(nbapp):
6367
".*",
6468
[
6569
(
66-
ujoin(base_url, "server-proxy/servers-info"),
70+
ujoin(base_url, "api/server-proxy/servers-info"),
6771
ServersInfoHandler,
6872
{"server_processes": server_processes},
6973
),
70-
(ujoin(base_url, "server-proxy/icon/(.*)"), IconHandler, {"icons": icons}),
74+
(
75+
ujoin(base_url, r"server-proxy/icon/(?P<name>.*)"),
76+
IconHandler,
77+
{"icons": icons}
78+
),
79+
(
80+
ujoin(base_url, r"api/server-proxy"),
81+
ListServersAPIHandler
82+
),
83+
(
84+
ujoin(base_url, r"api/server-proxy/(?P<name>.*)"),
85+
ServersAPIHandler
86+
),
7187
],
7288
)
7389

jupyter_server_proxy/api.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import mimetypes
2+
import json
23

34
from jupyter_server.base.handlers import JupyterHandler
45
from jupyter_server.utils import url_path_join as ujoin
56
from tornado import web
67

8+
from .manager import manager
9+
710

811
class ServersInfoHandler(JupyterHandler):
912
def initialize(self, server_processes):
@@ -70,3 +73,41 @@ async def get(self, name):
7073
with open(self.icons[name]) as f:
7174
self.write(f.read())
7275
self.set_header("Content-Type", content_type)
76+
77+
78+
class ServersAPIHandler(JupyterHandler):
79+
"""Handler to get metadata or terminate of a given server"""
80+
81+
@web.authenticated
82+
async def delete(self, name):
83+
"""Delete a server proxy by name"""
84+
try:
85+
val = await manager.terminate_server_proxy_app(name)
86+
if val is None:
87+
raise Exception(
88+
f"Proxy {name} not found. Are you sure the {name} "
89+
f"is managed by jupyter-server-proxy?"
90+
)
91+
else:
92+
self.set_status(204)
93+
self.finish()
94+
except Exception as e:
95+
raise web.HTTPError(404, str(e))
96+
97+
@web.authenticated
98+
async def get(self, name):
99+
"""Get meta data of a running server proxy"""
100+
app = manager.get_server_proxy_app(name)
101+
self.set_status(200)
102+
self.finish(json.dumps(app._asdict()))
103+
104+
105+
class ListServersAPIHandler(JupyterHandler):
106+
"""Handler to list all running server proxies"""
107+
108+
@web.authenticated
109+
async def get(self):
110+
"""list running servers"""
111+
apps = manager.list_server_proxy_apps()
112+
self.set_status(200)
113+
self.finish(json.dumps([app._asdict() for app in apps]))

0 commit comments

Comments
 (0)