Skip to content

Commit b07189b

Browse files
committed
Remove jupyter_client, use KernelFinder in Gateway
1 parent c033afa commit b07189b

File tree

11 files changed

+45
-45
lines changed

11 files changed

+45
-45
lines changed

jupyter_server/gateway/handlers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from tornado.escape import url_escape, json_decode, utf8
1717

1818
from ipython_genutils.py3compat import cast_unicode
19-
from jupyter_client.session import Session
19+
from jupyter_protocol.session import Session, new_id
2020
from traitlets.config.configurable import LoggingConfigurable
2121

2222
from .managers import GatewayClient
@@ -58,7 +58,7 @@ def authenticate(self):
5858

5959
def initialize(self):
6060
self.log.debug("Initializing websocket connection %s", self.request.path)
61-
self.session = Session(config=self.config)
61+
self.session = Session(key=new_id())
6262
self.gateway = GatewayWebSocketClient(gateway_url=GatewayClient.instance().url)
6363

6464
@gen.coroutine

jupyter_server/gateway/managers.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
import os
55
import json
6+
import logging
67

8+
from jupyter_kernel_mgmt.discovery import KernelFinder
79
from socket import gaierror
810
from tornado import gen, web
911
from tornado.escape import json_encode, json_decode, url_escape
@@ -12,7 +14,6 @@
1214
from ..services.kernels.kernelmanager import MappingKernelManager
1315
from ..services.sessions.sessionmanager import SessionManager
1416

15-
from jupyter_client.kernelspec import KernelSpecManager
1617
from ..utils import url_path_join
1718

1819
from traitlets import Instance, Unicode, Float, Bool, default, validate, TraitError
@@ -496,14 +497,16 @@ def shutdown_all(self, now=False):
496497
self.remove_kernel(kernel_id)
497498

498499

499-
class GatewayKernelSpecManager(KernelSpecManager):
500-
501-
def __init__(self, **kwargs):
502-
super(GatewayKernelSpecManager, self).__init__(**kwargs)
500+
class GatewayKernelFinder(KernelFinder):
501+
def __init__(self, parent, providers=[]):
502+
super(GatewayKernelFinder, self).__init__(providers=providers)
503503
self.base_endpoint = url_path_join(GatewayClient.instance().url,
504504
GatewayClient.instance().kernelspecs_endpoint)
505505
self.base_resource_endpoint = url_path_join(GatewayClient.instance().url,
506506
GatewayClient.instance().kernelspecs_resource_endpoint)
507+
# Because KernelFinder is not a taitlet/Configurable, we need to simulate a configurable
508+
self.parent = parent
509+
self.log = logging.getLogger(__name__)
507510

508511
def _get_kernelspecs_endpoint_url(self, kernel_name=None):
509512
"""Builds a url for the kernels endpoint
@@ -517,6 +520,11 @@ def _get_kernelspecs_endpoint_url(self, kernel_name=None):
517520

518521
return self.base_endpoint
519522

523+
@gen.coroutine
524+
def find_kernels(self):
525+
remote_kspecs = yield self.get_all_specs()
526+
raise gen.Return(remote_kspecs)
527+
520528
@gen.coroutine
521529
def get_all_specs(self):
522530
fetched_kspecs = yield self.list_kernel_specs()

jupyter_server/serverapp.py

+11-16
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
from .services.contents.filemanager import FileContentsManager
7575
from .services.contents.largefilemanager import LargeFileManager
7676
from .services.sessions.sessionmanager import SessionManager
77-
from .gateway.managers import GatewayKernelManager, GatewayKernelSpecManager, GatewaySessionManager, GatewayClient
77+
from .gateway.managers import GatewayKernelManager, GatewayKernelFinder, GatewaySessionManager, GatewayClient
7878

7979
from .auth.login import LoginHandler
8080
from .auth.logout import LogoutHandler
@@ -86,8 +86,7 @@
8686
JupyterApp, base_flags, base_aliases,
8787
)
8888
from jupyter_core.paths import jupyter_config_path
89-
from jupyter_client import KernelManager
90-
from jupyter_client.session import Session
89+
from jupyter_protocol.session import Session
9190
from jupyter_kernel_mgmt.discovery import KernelFinder
9291
from nbformat.sign import NotebookNotary
9392
from traitlets import (
@@ -528,7 +527,6 @@ def start(self):
528527
'ip': 'ServerApp.ip',
529528
'port': 'ServerApp.port',
530529
'port-retries': 'ServerApp.port_retries',
531-
'transport': 'KernelManager.transport',
532530
'keyfile': 'ServerApp.keyfile',
533531
'certfile': 'ServerApp.certfile',
534532
'client-ca': 'ServerApp.client_ca',
@@ -554,9 +552,8 @@ class ServerApp(JupyterApp):
554552
flags = flags
555553

556554
classes = [
557-
KernelManager, Session, MappingKernelManager,
558-
ContentsManager, FileContentsManager, NotebookNotary,
559-
GatewayKernelManager, GatewayKernelSpecManager, GatewaySessionManager, GatewayClient,
555+
Session, MappingKernelManager,
556+
ContentsManager, FileContentsManager, NotebookNotary, GatewayClient,
560557
]
561558
flags = Dict(flags)
562559
aliases = Dict(aliases)
@@ -1219,6 +1216,7 @@ def parse_command_line(self, argv=None):
12191216

12201217
def init_configurables(self):
12211218

1219+
12221220
# If gateway server is configured, replace appropriate managers to perform redirection. To make
12231221
# this determination, instantiate the GatewayClient config singleton.
12241222
self.gateway_config = GatewayClient.instance(parent=self)
@@ -1228,15 +1226,12 @@ def init_configurables(self):
12281226
self.session_manager_class = 'jupyter_server.gateway.managers.GatewaySessionManager'
12291227
# FIXME - no more kernel-spec-manager!
12301228
# self.kernel_spec_manager_class = 'jupyter_server.gateway.managers.GatewayKernelSpecManager'
1231-
#
1232-
# self.kernel_spec_manager = self.kernel_spec_manager_class(
1233-
# parent=self,
1234-
# )
1235-
1236-
if self.kernel_providers:
1237-
self.kernel_finder = KernelFinder(self.kernel_providers)
1229+
self.kernel_finder = GatewayKernelFinder(parent=self) # no providers here, alway go remote
12381230
else:
1239-
self.kernel_finder = KernelFinder.from_entrypoints()
1231+
if self.kernel_providers:
1232+
self.kernel_finder = KernelFinder(self.kernel_providers)
1233+
else:
1234+
self.kernel_finder = KernelFinder.from_entrypoints()
12401235

12411236
self.kernel_manager = self.kernel_manager_class(
12421237
parent=self,
@@ -1578,7 +1573,7 @@ def cleanup_kernels(self):
15781573
"""Shutdown all kernels.
15791574
15801575
The kernels will shutdown themselves when this process no longer exists,
1581-
but explicit shutdown allows the KernelManagers to cleanup the connection files.
1576+
but explicit shutdown allows the Kernel Providers to cleanup the connection files.
15821577
"""
15831578
n_kernels = len(self.kernel_manager.list_kernel_ids())
15841579
kernel_msg = trans.ngettext('Shutting down %d kernel', 'Shutting down %d kernels', n_kernels)

jupyter_server/services/contents/handlers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from tornado import gen, web
1212

1313
from jupyter_server.utils import url_path_join, url_escape, maybe_future
14-
from jupyter_client.jsonutil import date_default
14+
from jupyter_protocol.jsonutil import date_default
1515

1616
from jupyter_server.base.handlers import (
1717
JupyterHandler, APIHandler, path_regex,

jupyter_server/services/kernels/handlers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from tornado.ioloop import IOLoop
1717
from tornado.websocket import WebSocketHandler
1818

19-
from jupyter_client.jsonutil import date_default
19+
from jupyter_protocol.jsonutil import date_default
2020
from jupyter_protocol.messages import Message
2121
from ipython_genutils.py3compat import cast_unicode
2222
from jupyter_server.utils import url_path_join, url_escape, maybe_future

jupyter_server/services/kernels/kernelmanager.py

-4
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,6 @@ def stop_buffering(self):
165165
class MappingKernelManager(LoggingConfigurable):
166166
"""A KernelManager that handles notebook mapping and HTTP error handling"""
167167

168-
@default('kernel_manager_class')
169-
def _default_kernel_manager_class(self):
170-
return "jupyter_client.ioloop.IOLoopKernelManager"
171-
172168
default_kernel_name = Unicode('pyimport/kernel', config=True,
173169
help="The name of the default kernel to start"
174170
)

jupyter_server/services/kernels/ws_serialize.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from dateutil.tz import tzutc
1212

1313
from ipython_genutils.py3compat import cast_unicode
14-
from jupyter_client.jsonutil import date_default, extract_dates
14+
from jupyter_protocol.jsonutil import date_default, extract_dates
15+
1516

1617
def serialize_message(msg, channel):
1718
"""Serialize a message from the kernel, using JSON.
@@ -32,6 +33,7 @@ def serialize_message(msg, channel):
3233
smsg = json.dumps(d, default=date_default)
3334
return cast_unicode(smsg)
3435

36+
3537
def serialize_binary_message(msg_dict, buffers):
3638
"""serialize a message as a binary blob
3739
@@ -64,6 +66,7 @@ def serialize_binary_message(msg_dict, buffers):
6466
buffers.insert(0, offsets_buf)
6567
return b''.join(buffers)
6668

69+
6770
def deserialize_message(msg):
6871
"""Deserialize a websocket message, return a dict.
6972
@@ -79,6 +82,7 @@ def deserialize_message(msg):
7982
msg['parent_header'] = convert_tz_utc(extract_dates(msg['parent_header']))
8083
return msg
8184

85+
8286
def deserialize_binary_message(bmsg):
8387
"""deserialize a message from a binary blob
8488
@@ -105,6 +109,7 @@ def deserialize_binary_message(bmsg):
105109
msg['buffers'] = bufs[1:]
106110
return msg
107111

112+
108113
def convert_tz_utc(obj):
109114
"""Replace dateutil tzutc objects with stdlib datetime utc objects"""
110115
if isinstance(obj, dict):

jupyter_server/services/kernelspecs/handlers.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ def get(self):
6363
model = {}
6464
model['default'] = km.default_kernel_name
6565
model['kernelspecs'] = specs = {}
66-
for kernel_name, kernel_info in kf.find_kernels():
66+
67+
found_specs = yield maybe_future(kf.find_kernels())
68+
for kernel_name, kernel_info in found_specs.items():
6769
try:
6870
if is_kernelspec_model(kernel_info):
6971
d = kernel_info
@@ -85,7 +87,8 @@ def get(self, kernel_name):
8587
kf = self.kernel_finder
8688
# TODO: Do we actually want all kernel type names to be case-insensitive?
8789
kernel_name = kernel_name.lower()
88-
for name, info in kf.find_kernels():
90+
found_specs = yield maybe_future(kf.find_kernels())
91+
for name, info in found_specs.items():
8992
if name == kernel_name:
9093
model = kernelspec_model(self, kernel_name, info,
9194
info['resource_dir'])

jupyter_server/services/sessions/handlers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
from tornado import gen, web
1212

1313
from ...base.handlers import APIHandler
14-
from jupyter_client.jsonutil import date_default
14+
from jupyter_protocol.jsonutil import date_default
1515
from jupyter_server.utils import maybe_future, url_path_join
16-
from jupyter_client.kernelspec import NoSuchKernel
16+
from jupyter_kernel_mgmt.kernelspec import NoSuchKernel
1717

1818

1919
class SessionRootHandler(APIHandler):

jupyter_server/tests/test_gateway.py

+4-10
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,12 @@
66
from tornado import gen
77
from tornado.httpclient import HTTPRequest, HTTPResponse, HTTPError
88
from ipython_genutils.py3compat import str_to_unicode
9+
from unittest.mock import patch, Mock
10+
from io import StringIO
11+
912
from .launchserver import ServerTestBase
1013
from jupyter_server.gateway.managers import GatewayClient
1114

12-
try:
13-
from unittest.mock import patch, Mock
14-
except ImportError:
15-
from mock import patch, Mock # py2
16-
17-
try:
18-
from io import StringIO
19-
except ImportError:
20-
import StringIO
2115

2216
import nose.tools as nt
2317

@@ -175,7 +169,7 @@ def test_gateway_class_mappings(self):
175169
# Ensure appropriate class mappings are in place.
176170
nt.assert_equal(self.server.kernel_manager_class.__name__, 'GatewayKernelManager')
177171
nt.assert_equal(self.server.session_manager_class.__name__, 'GatewaySessionManager')
178-
nt.assert_equal(self.server.kernel_spec_manager_class.__name__, 'GatewayKernelSpecManager')
172+
nt.assert_equal(self.server.kernel_finder.__class__.__name__, 'GatewayKernelFinder')
179173

180174
def test_gateway_get_kernelspecs(self):
181175
# Validate that kernelspecs come from gateway.

setup.py

-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
'ipython_genutils',
8282
'traitlets>=4.2.1',
8383
'jupyter_core>=4.4.0',
84-
'jupyter_client>=5.3.1',
8584
'jupyter_kernel_mgmt>=0.4',
8685
'jupyter_protocol',
8786
'nbformat',

0 commit comments

Comments
 (0)