This exposes ipcluster's over the web. The current implementation uses IPClusterLauncher to run ipcluster in a separate process. Here is the URL scheme we are using: GET /clusters => list available clusters GET /cluster/profile => list info for cluster with profile POST /cluster/profile/start => start a cluster POST /cluster/profile/stop => stop a cluster
parent
6b5a5f0b36
commit
f19a63759b
@ -0,0 +1,90 @@
|
||||
"""Manage IPython.parallel clusters in the notebook.
|
||||
|
||||
Authors:
|
||||
|
||||
* Brian Granger
|
||||
"""
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# 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
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
import datetime
|
||||
import os
|
||||
import uuid
|
||||
import glob
|
||||
|
||||
from tornado import web
|
||||
from zmq.eventloop import ioloop
|
||||
|
||||
from IPython.config.configurable import LoggingConfigurable
|
||||
from IPython.utils.traitlets import Unicode, List, Dict, Bool
|
||||
from IPython.parallel.apps.launcher import IPClusterLauncher
|
||||
from IPython.core.profileapp import list_profiles_in, list_bundled_profiles
|
||||
from IPython.utils.path import get_ipython_dir, get_ipython_package_dir
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Classes
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
class ClusterManager(LoggingConfigurable):
|
||||
|
||||
profiles = Dict()
|
||||
|
||||
|
||||
def list_profile_names(self):
|
||||
"""List all profiles in the ipython_dir and cwd.
|
||||
"""
|
||||
profiles = list_profiles_in(get_ipython_dir())
|
||||
profiles += list_profiles_in(os.getcwdu())
|
||||
return profiles
|
||||
|
||||
|
||||
def list_profiles(self):
|
||||
profiles = self.list_profile_names()
|
||||
result = [self.profile_info(p) for p in profiles]
|
||||
return result
|
||||
|
||||
|
||||
def profile_info(self, profile):
|
||||
if profile not in self.list_profile_names():
|
||||
raise web.HTTPError(404, u'profile not found')
|
||||
result = dict(profile=profile)
|
||||
data = self.profiles.get(profile)
|
||||
if data is None:
|
||||
result['status'] = 'stopped'
|
||||
else:
|
||||
result['status'] = 'running'
|
||||
result['n'] = data['n']
|
||||
return result
|
||||
|
||||
def start_cluster(self, profile, n=4):
|
||||
"""Start a cluster for a given profile."""
|
||||
if profile not in self.list_profile_names():
|
||||
raise web.HTTPError(404, u'profile not found')
|
||||
if profile in self.profiles:
|
||||
raise web.HTTPError(409, u'cluster already running')
|
||||
launcher = IPClusterLauncher(ipcluster_profile=profile, ipcluster_n=n)
|
||||
launcher.start()
|
||||
self.profiles[profile] = {
|
||||
'launcher': launcher,
|
||||
'n': n
|
||||
}
|
||||
|
||||
def stop_cluster(self, profile):
|
||||
"""Stop a cluster for a given profile."""
|
||||
if profile not in self.profiles:
|
||||
raise web.HTTPError(409, u'cluster not running')
|
||||
launcher = self.profiles.pop(profile)['launcher']
|
||||
launcher.stop()
|
||||
|
||||
def stop_all_clusters(self):
|
||||
for p in self.profiles.values():
|
||||
p['launcher'].stop()
|
||||
Loading…
Reference in new issue