##// END OF EJS Templates
Add support for different kernel specs to kernels REST API
Thomas Kluyver -
Show More
@@ -27,8 +27,16 b' class MainKernelHandler(IPythonHandler):'
27 @web.authenticated
27 @web.authenticated
28 @json_errors
28 @json_errors
29 def post(self):
29 def post(self):
30 model = self.get_json_body()
31 if model is None:
32 raise web.HTTPError(400, "No JSON data provided")
33 try:
34 name = model['name']
35 except KeyError:
36 raise web.HTTPError(400, "Missing field in JSON data: name")
37
30 km = self.kernel_manager
38 km = self.kernel_manager
31 kernel_id = km.start_kernel()
39 kernel_id = km.start_kernel(kernel_name=name)
32 model = km.kernel_model(kernel_id)
40 model = km.kernel_model(kernel_id)
33 location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
41 location = url_path_join(self.base_url, 'api', 'kernels', kernel_id)
34 self.set_header('Location', url_escape(location))
42 self.set_header('Location', url_escape(location))
@@ -72,8 +72,8 b' class MappingKernelManager(MultiKernelManager):'
72 os_path = os.path.dirname(os_path)
72 os_path = os.path.dirname(os_path)
73 return os_path
73 return os_path
74
74
75 def start_kernel(self, kernel_id=None, path=None, **kwargs):
75 def start_kernel(self, kernel_id=None, path=None, kernel_name='python', **kwargs):
76 """Start a kernel for a session an return its kernel_id.
76 """Start a kernel for a session and return its kernel_id.
77
77
78 Parameters
78 Parameters
79 ----------
79 ----------
@@ -84,12 +84,16 b' class MappingKernelManager(MultiKernelManager):'
84 path : API path
84 path : API path
85 The API path (unicode, '/' delimited) for the cwd.
85 The API path (unicode, '/' delimited) for the cwd.
86 Will be transformed to an OS path relative to root_dir.
86 Will be transformed to an OS path relative to root_dir.
87 kernel_name : str
88 The name identifying which kernel spec to launch. This is ignored if
89 an existing kernel is returned, but it may be checked in the future.
87 """
90 """
88 if kernel_id is None:
91 if kernel_id is None:
89 kwargs['extra_arguments'] = self.kernel_argv
92 kwargs['extra_arguments'] = self.kernel_argv
90 if path is not None:
93 if path is not None:
91 kwargs['cwd'] = self.cwd_for_path(path)
94 kwargs['cwd'] = self.cwd_for_path(path)
92 kernel_id = super(MappingKernelManager, self).start_kernel(**kwargs)
95 kernel_id = super(MappingKernelManager, self).start_kernel(
96 kernel_name=kernel_name, **kwargs)
93 self.log.info("Kernel started: %s" % kernel_id)
97 self.log.info("Kernel started: %s" % kernel_id)
94 self.log.debug("Kernel args: %r" % kwargs)
98 self.log.debug("Kernel args: %r" % kwargs)
95 # register callback for failed auto-restart
99 # register callback for failed auto-restart
@@ -111,7 +115,8 b' class MappingKernelManager(MultiKernelManager):'
111 """Return a dictionary of kernel information described in the
115 """Return a dictionary of kernel information described in the
112 JSON standard model."""
116 JSON standard model."""
113 self._check_kernel_id(kernel_id)
117 self._check_kernel_id(kernel_id)
114 model = {"id":kernel_id}
118 model = {"id":kernel_id,
119 "name": self._kernels[kernel_id].kernel_name}
115 return model
120 return model
116
121
117 def list_kernels(self):
122 def list_kernels(self):
@@ -1,6 +1,6 b''
1 """Test the kernels service API."""
1 """Test the kernels service API."""
2
2
3
3 import json
4 import requests
4 import requests
5
5
6 from IPython.html.utils import url_path_join
6 from IPython.html.utils import url_path_join
@@ -30,8 +30,9 b' class KernelAPI(object):'
30 def get(self, id):
30 def get(self, id):
31 return self._req('GET', id)
31 return self._req('GET', id)
32
32
33 def start(self):
33 def start(self, name='python'):
34 return self._req('POST', '')
34 body = json.dumps({'name': name})
35 return self._req('POST', '', body)
35
36
36 def shutdown(self, id):
37 def shutdown(self, id):
37 return self._req('DELETE', id)
38 return self._req('DELETE', id)
@@ -69,6 +70,7 b' class KernelAPITest(NotebookTestBase):'
69 self.assertEqual(r.status_code, 200)
70 self.assertEqual(r.status_code, 200)
70 assert isinstance(r.json(), list)
71 assert isinstance(r.json(), list)
71 self.assertEqual(r.json()[0]['id'], kern1['id'])
72 self.assertEqual(r.json()[0]['id'], kern1['id'])
73 self.assertEqual(r.json()[0]['name'], kern1['name'])
72
74
73 # create another kernel and check that they both are added to the
75 # create another kernel and check that they both are added to the
74 # list of kernels from a GET request
76 # list of kernels from a GET request
@@ -89,6 +91,7 b' class KernelAPITest(NotebookTestBase):'
89 self.assertEqual(r.headers['Location'], '/api/kernels/'+kern2['id'])
91 self.assertEqual(r.headers['Location'], '/api/kernels/'+kern2['id'])
90 rekern = r.json()
92 rekern = r.json()
91 self.assertEqual(rekern['id'], kern2['id'])
93 self.assertEqual(rekern['id'], kern2['id'])
94 self.assertEqual(rekern['name'], kern2['name'])
92
95
93 def test_kernel_handler(self):
96 def test_kernel_handler(self):
94 # GET kernel with given id
97 # GET kernel with given id
@@ -92,7 +92,7 b' class MultiKernelManager(LoggingConfigurable):'
92 def __contains__(self, kernel_id):
92 def __contains__(self, kernel_id):
93 return kernel_id in self._kernels
93 return kernel_id in self._kernels
94
94
95 def start_kernel(self, **kwargs):
95 def start_kernel(self, kernel_name='python', **kwargs):
96 """Start a new kernel.
96 """Start a new kernel.
97
97
98 The caller can pick a kernel_id by passing one in as a keyword arg,
98 The caller can pick a kernel_id by passing one in as a keyword arg,
@@ -111,7 +111,7 b' class MultiKernelManager(LoggingConfigurable):'
111 # including things like its transport and ip.
111 # including things like its transport and ip.
112 km = self.kernel_manager_factory(connection_file=os.path.join(
112 km = self.kernel_manager_factory(connection_file=os.path.join(
113 self.connection_dir, "kernel-%s.json" % kernel_id),
113 self.connection_dir, "kernel-%s.json" % kernel_id),
114 parent=self, autorestart=True, log=self.log
114 parent=self, autorestart=True, log=self.log, kernel_name=kernel_name,
115 )
115 )
116 km.start_kernel(**kwargs)
116 km.start_kernel(**kwargs)
117 self._kernels[kernel_id] = km
117 self._kernels[kernel_id] = km
General Comments 0
You need to be logged in to leave comments. Login now