Add support for creating terminals via GET

pull/5813/head
Kevin Bates 6 years ago
parent 1550410229
commit ac50d2e530
No known key found for this signature in database
GPG Key ID: ADCCD5840EE5145F

@ -10,7 +10,7 @@ if not check_version(terminado.__version__, '0.8.3'):
from ipython_genutils.py3compat import which
from notebook.utils import url_path_join as ujoin
from .terminalmanager import TerminalManager
from .handlers import TerminalHandler, TermSocket
from .handlers import TerminalHandler, TermSocket, NewTerminalHandler
from . import api_handlers
@ -45,6 +45,7 @@ def initialize(nb_app):
(ujoin(base_url, r"/terminals/(\w+)"), TerminalHandler),
(ujoin(base_url, r"/terminals/websocket/(\w+)"), TermSocket,
{'term_manager': terminal_manager}),
(ujoin(base_url, r"/terminals/new/(\w+)"), NewTerminalHandler),
(ujoin(base_url, r"/api/terminals"), api_handlers.TerminalRootHandler),
(ujoin(base_url, r"/api/terminals/(\w+)"), api_handlers.TerminalHandler),
]

@ -18,6 +18,15 @@ class TerminalHandler(IPythonHandler):
ws_path="terminals/websocket/%s" % term_name))
class NewTerminalHandler(IPythonHandler):
"""Render the terminal interface."""
@web.authenticated
def get(self, term_name):
self.terminal_manager.create_with_name(term_name)
new_path = self.request.path.replace("new/{}".format(term_name), term_name)
self.redirect(new_path)
class TermSocket(WebSocketMixin, IPythonHandler, terminado.TermSocket):
def origin_check(self):

@ -44,6 +44,16 @@ class TerminalManager(LoggingConfigurable, NamedTermManager):
def create(self):
"""Create a new terminal."""
name, term = self.new_named_terminal()
return self._finish_create(name, term)
def create_with_name(self, name):
"""Create a new terminal."""
if name in self.terminals:
raise web.HTTPError(409, "A terminal with name '{}' already exists.".format(name))
term = self.get_terminal(name)
return self._finish_create(name, term)
def _finish_create(self, name, term):
# Monkey-patch last-activity, similar to kernels. Should we need
# more functionality per terminal, we can look into possible sub-
# classing or containment then.

@ -54,7 +54,7 @@ class TerminalAPITest(NotebookTestBase):
self.term_api.shutdown(k['name'])
def test_no_terminals(self):
# Make sure there are no terminals running at the start
# Make sure there are no terminals are running at the start
terminals = self.term_api.list().json()
self.assertEqual(terminals, [])
@ -65,6 +65,27 @@ class TerminalAPITest(NotebookTestBase):
self.assertEqual(r.status_code, 200)
self.assertIsInstance(term1, dict)
def test_create_terminal_via_get(self):
# Test creation of terminal via GET against terminals/new/<name>
r = self.term_api._req('GET', 'terminals/new/foo')
self.assertEqual(r.status_code, 200)
r = self.term_api.get('foo')
foo_term = r.json()
self.assertEqual(r.status_code, 200)
self.assertIsInstance(foo_term, dict)
self.assertEqual(foo_term['name'], 'foo')
with assert_http_error(409):
self.term_api._req('GET', 'terminals/new/foo')
r = self.term_api.shutdown('foo')
self.assertEqual(r.status_code, 204)
# Make sure there are no terminals are running
terminals = self.term_api.list().json()
self.assertEqual(terminals, [])
def test_terminal_root_handler(self):
# POST request
r = self.term_api.start()

Loading…
Cancel
Save