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( |
|
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