Add support for different kernel specs to kernels REST API

Thomas Kluyver 12 years ago
parent 96832f6aca
commit ae6309c122

@ -27,8 +27,16 @@ class MainKernelHandler(IPythonHandler):
@web.authenticated
@json_errors
def post(self):
model = self.get_json_body()
if model is None:
raise web.HTTPError(400, "No JSON data provided")
try:
name = model['name']
except KeyError:
raise web.HTTPError(400, "Missing field in JSON data: name")
km = self.kernel_manager
kernel_id = km.start_kernel()
kernel_id = km.start_kernel(kernel_name=name)
model = km.kernel_model(kernel_id)
location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
self.set_header('Location', url_escape(location))

@ -72,8 +72,8 @@ class MappingKernelManager(MultiKernelManager):
os_path = os.path.dirname(os_path)
return os_path
def start_kernel(self, kernel_id=None, path=None, **kwargs):
"""Start a kernel for a session an return its kernel_id.
def start_kernel(self, kernel_id=None, path=None, kernel_name='python', **kwargs):
"""Start a kernel for a session and return its kernel_id.
Parameters
----------
@ -84,12 +84,16 @@ class MappingKernelManager(MultiKernelManager):
path : API path
The API path (unicode, '/' delimited) for the cwd.
Will be transformed to an OS path relative to root_dir.
kernel_name : str
The name identifying which kernel spec to launch. This is ignored if
an existing kernel is returned, but it may be checked in the future.
"""
if kernel_id is None:
kwargs['extra_arguments'] = self.kernel_argv
if path is not None:
kwargs['cwd'] = self.cwd_for_path(path)
kernel_id = super(MappingKernelManager, self).start_kernel(**kwargs)
kernel_id = super(MappingKernelManager, self).start_kernel(
kernel_name=kernel_name, **kwargs)
self.log.info("Kernel started: %s" % kernel_id)
self.log.debug("Kernel args: %r" % kwargs)
# register callback for failed auto-restart
@ -111,7 +115,8 @@ class MappingKernelManager(MultiKernelManager):
"""Return a dictionary of kernel information described in the
JSON standard model."""
self._check_kernel_id(kernel_id)
model = {"id":kernel_id}
model = {"id":kernel_id,
"name": self._kernels[kernel_id].kernel_name}
return model
def list_kernels(self):

@ -1,6 +1,6 @@
"""Test the kernels service API."""
import json
import requests
from IPython.html.utils import url_path_join
@ -30,8 +30,9 @@ class KernelAPI(object):
def get(self, id):
return self._req('GET', id)
def start(self):
return self._req('POST', '')
def start(self, name='python'):
body = json.dumps({'name': name})
return self._req('POST', '', body)
def shutdown(self, id):
return self._req('DELETE', id)
@ -69,6 +70,7 @@ class KernelAPITest(NotebookTestBase):
self.assertEqual(r.status_code, 200)
assert isinstance(r.json(), list)
self.assertEqual(r.json()[0]['id'], kern1['id'])
self.assertEqual(r.json()[0]['name'], kern1['name'])
# create another kernel and check that they both are added to the
# list of kernels from a GET request
@ -89,6 +91,7 @@ class KernelAPITest(NotebookTestBase):
self.assertEqual(r.headers['Location'], '/api/kernels/'+kern2['id'])
rekern = r.json()
self.assertEqual(rekern['id'], kern2['id'])
self.assertEqual(rekern['name'], kern2['name'])
def test_kernel_handler(self):
# GET kernel with given id

Loading…
Cancel
Save