diff --git a/IPython/html/services/sessions/handlers.py b/IPython/html/services/sessions/handlers.py new file mode 100644 index 000000000..97022bb90 --- /dev/null +++ b/IPython/html/services/sessions/handlers.py @@ -0,0 +1,105 @@ +"""Tornado handlers for the notebooks web service. + +Authors: + +* Zach Sailer +""" + +#----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +from tornado import web + +from zmq.utils import jsonapi + +from IPython.utils.jsonutil import date_default + +from ...base.handlers import IPythonHandler, authenticate_unless_readonly + +#----------------------------------------------------------------------------- +# Session web service handlers +#----------------------------------------------------------------------------- + + + +class SessionRootHandler(IPythonHandler): + + + @authenticate_unless_readonly + def get(self): + sm = self.session_manager + nbm = self.notebook_manager + km = self.kernel_manager + sessions = sm.list_sessions() + self.finish(jsonapi.dumps(sessions)) + + + @web.authenticated + def post(self): + sm = self.session_manager + nbm = self.notebook_manager + km = self.kernel_manager + notebook_path = self.get_argument('notebook_path', default=None) + notebook_name, path = nbm.named_notebook_path(notebook_path) + session_id, model = sm.get_session(notebook_name, path) + if model == None: + kernel_id = km.start_kernel() + kernel = km.kernel_model(kernel_id, self.ws_url) + model = sm.session_model(session_id, notebook_name, path, kernel) + self.finish(jsonapi.dumps(model)) + + +class SessionHandler(IPythonHandler): + + @web.authenticated + def get(self, session_id): + sm = self.session_manager + model = sm.get_session_from_id(session_id) + self.finish(jsonapi.dumps(model)) + + + @authenticate_unless_readonly + def put(self, session_id): + sm = self.session_manager + nbm = self.notebook_manager + km = self.kernel_manager + notebook_path = self.get_argument('notebook_path', default=None) + notebook_name, path = nbm.named_notebook_path(notebook_path) + kernel_id = sm.get_kernel_from_session(session_id) + kernel = km.kernel_model(kernel_id, self.ws_url) + sm.delete_mapping_for_session(session_id) + model = sm.session_model(session_id, notebook_name, path, kernel) + return model + + @web.authenticated + def delete(self, session_id): + sm = self.session_manager + nbm = self.notebook_manager + km = self.kernel_manager + kernel_id = sm.get_kernel_from_session(session_id) + km.shutdown_kernel(kernel_id) + sm.delete_mapping_for_session(session_id) + + +#----------------------------------------------------------------------------- +# URL to handler mappings +#----------------------------------------------------------------------------- + +_session_id_regex = r"(?P\w+-\w+-\w+-\w+-\w+)" + +default_handlers = [ + (r"api/sessions/%s" % _session_id_regex, SessionHandler), + (r"api/sessions", SessionRootHandler) +] + + + + diff --git a/IPython/html/services/sessions/sessionmanager.py b/IPython/html/services/sessions/sessionmanager.py new file mode 100644 index 000000000..358f7b13f --- /dev/null +++ b/IPython/html/services/sessions/sessionmanager.py @@ -0,0 +1,95 @@ +"""A base class session manager. + +Authors: + +* Zach Sailer +""" + +#----------------------------------------------------------------------------- +# Copyright (C) 2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import os +import uuid + +from tornado import web + +from IPython.config.configurable import LoggingConfigurable +from IPython.nbformat import current +from IPython.utils.traitlets import List, Dict, Unicode, TraitError + +#----------------------------------------------------------------------------- +# Classes +#----------------------------------------------------------------------------- + +class SessionManager(LoggingConfigurable): + + # Use session_ids to map notebook names to kernel_ids + sessions = List() + + def get_session(self, nb_name, nb_path=None): + """Get an existing session or create a new one""" + model = None + for session in self.sessions: + if session['notebook_name'] == nb_name and session['notebook_path'] == nb_path: + session_id = session['session_id'] + model = session + if model != None: + return session_id, model + else: + session_id = unicode(uuid.uuid4()) + return session_id, model + + def session_model(self, session_id, notebook_name=None, notebook_path=None, kernel=None): + """ Create a session that links notebooks with kernels """ + model = dict(session_id=session_id, + notebook_name=notebook_name, + notebook_path=notebook_path, + kernel=kernel) + self.sessions.append(model) + return model + + def list_sessions(self): + """List all sessions and their information""" + return self.sessions + + def set_kernel_for_sessions(self, session_id, kernel_id): + """Maps the kernel_ids to the session_id in session_mapping""" + for session in self.sessions: + if session['session_id'] == session_id: + session['kernel_id'] = kernel_id + return self.sessions + + def delete_mapping_for_session(self, session_id): + """Delete the session from session_mapping with the given session_id""" + i = 0 + for session in self.sessions: + if session['session_id'] == session_id: + del self.sessions[i] + i = i + 1 + return self.sessions + + def get_session_from_id(self, session_id): + for session in self.sessions: + if session['session_id'] == session_id: + return session + + def get_notebook_from_session(self, session_id): + """Returns the notebook_path for the given session_id""" + for session in self.sessions: + if session['session_id'] == session_id: + return session['notebook_name'] + + def get_kernel_from_session(self, session_id): + """Returns the kernel_id for the given session_id""" + for session in self.sessions: + if session['session_id'] == session_id: + return session['kernel']['kernel_id'] +