4
4
from jupyter_server .utils import url_path_join as ujoin
5
5
from tornado import web
6
6
7
- from .manager import manager
8
-
9
7
10
8
class ServersInfoHandler (JupyterHandler ):
11
9
def initialize (self , server_processes ):
@@ -36,8 +34,9 @@ async def get(self):
36
34
self .write ({"server_processes" : data })
37
35
38
36
39
- # Took it from JupyterHub LogoHandler
40
- class IconHandler (web .StaticFileHandler ):
37
+ # IconHandler has been copied from JupyterHub's IconHandler:
38
+ # https://github.com/jupyterhub/jupyterhub/blob/4.0.0b2/jupyterhub/handlers/static.py#L22-L31
39
+ class ServersIconHandler (web .StaticFileHandler ):
41
40
"""A singular handler for serving the icon."""
42
41
43
42
def get (self ):
@@ -52,13 +51,22 @@ def get_absolute_path(cls, root, path):
52
51
53
52
54
53
class ServersAPIHandler (JupyterHandler ):
55
- """Handler to get metadata or terminate of a given server"""
54
+ """Handler to get metadata or terminate of a given server or all servers"""
55
+
56
+ def initialize (self , manager ):
57
+ self .manager = manager
56
58
57
59
@web .authenticated
58
60
async def delete (self , name ):
59
61
"""Delete a server proxy by name"""
62
+ if not name :
63
+ raise web .HTTPError (
64
+ 403 , "Please set the name of a running server proxy that "
65
+ "user wishes to terminate"
66
+ )
67
+
60
68
try :
61
- val = await manager .terminate_server_proxy_app (name )
69
+ val = await self . manager .terminate_server_proxy_app (name )
62
70
if val is None :
63
71
raise Exception (
64
72
f"Proxy { name } not found. Are you sure the { name } "
@@ -73,17 +81,48 @@ async def delete(self, name):
73
81
@web .authenticated
74
82
async def get (self , name ):
75
83
"""Get meta data of a running server proxy"""
76
- app = manager .get_server_proxy_app (name )
84
+ if name :
85
+ apps = self .manager .get_server_proxy_app (name )._asdict ()
86
+ # If no server proxy found this will be a dict with empty values
87
+ if not apps ['name' ]:
88
+ raise web .HTTPError (
89
+ 404 , f"Server proxy { name } not found"
90
+ )
91
+ else :
92
+ apps = [app ._asdict () for app in self .manager .list_server_proxy_apps ()]
93
+
77
94
self .set_status (200 )
78
- self .finish (json .dumps (app . _asdict () ))
95
+ self .finish (json .dumps (apps ))
79
96
80
97
81
- class ListServersAPIHandler (JupyterHandler ):
82
- """Handler to list all running server proxies"""
98
+ def setup_api_handlers (web_app , manager , server_processes ):
99
+ base_url = web_app .settings ["base_url" ]
100
+
101
+ # Make a list of icon handlers
102
+ icon_handlers = []
103
+ for sp in server_processes :
104
+ if sp .launcher_entry .enabled and sp .launcher_entry .icon_path :
105
+ icon_handlers .append (
106
+ (
107
+ ujoin (base_url , f"server-proxy/icon/{ sp .name } " ),
108
+ ServersIconHandler ,
109
+ {"path" : sp .launcher_entry .icon_path },
110
+ )
111
+ )
112
+
113
+ web_app .add_handlers (
114
+ ".*" ,
115
+ [
116
+ (
117
+ ujoin (base_url , "server-proxy/api/servers-info" ),
118
+ ServersInfoHandler ,
119
+ {"server_processes" : server_processes },
120
+ ),
121
+ (
122
+ ujoin (base_url , r"server-proxy/api/servers/(?P<name>.*)" ),
123
+ ServersAPIHandler ,
124
+ {"manager" : manager }
125
+ ),
126
+ ] + icon_handlers
127
+ )
83
128
84
- @web .authenticated
85
- async def get (self ):
86
- """list running servers"""
87
- apps = manager .list_server_proxy_apps ()
88
- self .set_status (200 )
89
- self .finish (json .dumps ([app ._asdict () for app in apps ]))
0 commit comments