factory.py
95 lines
| 3.7 KiB
| text/x-python
|
PythonLexer
MinRK
|
r3604 | """Base config factories.""" | ||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2008-2009 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 logging | ||||
MinRK
|
r3631 | import os | ||
MinRK
|
r3604 | |||
from zmq.eventloop.ioloop import IOLoop | ||||
from IPython.config.configurable import Configurable | ||||
MinRK
|
r3988 | from IPython.utils.traitlets import Int, Instance, Unicode | ||
MinRK
|
r3604 | |||
MinRK
|
r3666 | import IPython.parallel.streamsession as ss | ||
MinRK
|
r3673 | from IPython.parallel.util import select_random_ports | ||
MinRK
|
r3604 | |||
#----------------------------------------------------------------------------- | ||||
# Classes | ||||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r3610 | class LoggingFactory(Configurable): | ||
"""A most basic class, that has a `log` (type:`Logger`) attribute, set via a `logname` Trait.""" | ||||
log = Instance('logging.Logger', ('ZMQ', logging.WARN)) | ||||
MinRK
|
r3988 | logname = Unicode('ZMQ') | ||
MinRK
|
r3610 | def _logname_changed(self, name, old, new): | ||
self.log = logging.getLogger(new) | ||||
MinRK
|
r3604 | |||
MinRK
|
r3610 | class SessionFactory(LoggingFactory): | ||
MinRK
|
r3666 | """The Base factory from which every factory in IPython.parallel inherits""" | ||
MinRK
|
r3604 | |||
# not configurable: | ||||
context = Instance('zmq.Context', (), {}) | ||||
MinRK
|
r3666 | session = Instance('IPython.parallel.streamsession.StreamSession') | ||
MinRK
|
r3610 | loop = Instance('zmq.eventloop.ioloop.IOLoop', allow_none=False) | ||
MinRK
|
r3604 | def _loop_default(self): | ||
return IOLoop.instance() | ||||
MinRK
|
r3610 | |||
MinRK
|
r3604 | def __init__(self, **kwargs): | ||
super(SessionFactory, self).__init__(**kwargs) | ||||
# construct the session | ||||
MinRK
|
r3985 | self.session = ss.StreamSession(**kwargs) | ||
MinRK
|
r3604 | |||
class RegistrationFactory(SessionFactory): | ||||
"""The Base Configurable for objects that involve registration.""" | ||||
MinRK
|
r3988 | url = Unicode('', config=True, | ||
MinRK
|
r3985 | help="""The 0MQ url used for registration. This sets transport, ip, and port | ||
in one variable. For example: url='tcp://127.0.0.1:12345' or | ||||
url='epgm://*:90210'""") # url takes precedence over ip,regport,transport | ||||
MinRK
|
r3988 | transport = Unicode('tcp', config=True, | ||
MinRK
|
r3985 | help="""The 0MQ transport for communications. This will likely be | ||
the default of 'tcp', but other values include 'ipc', 'epgm', 'inproc'.""") | ||||
MinRK
|
r3988 | ip = Unicode('127.0.0.1', config=True, | ||
MinRK
|
r3985 | help="""The IP address for registration. This is generally either | ||
'127.0.0.1' for loopback only or '*' for all interfaces. | ||||
[default: '127.0.0.1']""") | ||||
regport = Int(config=True, | ||||
help="""The port on which the Hub listens for registration.""") | ||||
MinRK
|
r3604 | def _regport_default(self): | ||
MinRK
|
r3614 | return select_random_ports(1)[0] | ||
MinRK
|
r3604 | |||
def __init__(self, **kwargs): | ||||
super(RegistrationFactory, self).__init__(**kwargs) | ||||
self._propagate_url() | ||||
self._rebuild_url() | ||||
self.on_trait_change(self._propagate_url, 'url') | ||||
self.on_trait_change(self._rebuild_url, 'ip') | ||||
self.on_trait_change(self._rebuild_url, 'transport') | ||||
self.on_trait_change(self._rebuild_url, 'regport') | ||||
def _rebuild_url(self): | ||||
self.url = "%s://%s:%i"%(self.transport, self.ip, self.regport) | ||||
def _propagate_url(self): | ||||
"""Ensure self.url contains full transport://interface:port""" | ||||
if self.url: | ||||
iface = self.url.split('://',1) | ||||
if len(iface) == 2: | ||||
self.transport,iface = iface | ||||
iface = iface.split(':') | ||||
self.ip = iface[0] | ||||
if iface[1]: | ||||
self.regport = int(iface[1]) | ||||