engineconnector.py
92 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
Brian E Granger
|
r1234 | # encoding: utf-8 | ||
"""A class that manages the engines connection to the controller.""" | ||||
__docformat__ = "restructuredtext en" | ||||
#------------------------------------------------------------------------------- | ||||
# Copyright (C) 2008 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 cPickle as pickle | ||||
Brian Granger
|
r1769 | from twisted.python import log, failure | ||
from twisted.internet import defer | ||||
Brian E Granger
|
r1234 | |||
from IPython.kernel.fcutil import find_furl | ||||
from IPython.kernel.enginefc import IFCEngine | ||||
#------------------------------------------------------------------------------- | ||||
# The ClientConnector class | ||||
#------------------------------------------------------------------------------- | ||||
class EngineConnector(object): | ||||
"""Manage an engines connection to a controller. | ||||
This class takes a foolscap `Tub` and provides a `connect_to_controller` | ||||
method that will use the `Tub` to connect to a controller and register | ||||
the engine with the controller. | ||||
""" | ||||
def __init__(self, tub): | ||||
self.tub = tub | ||||
def connect_to_controller(self, engine_service, furl_or_file): | ||||
""" | ||||
Make a connection to a controller specified by a furl. | ||||
This method takes an `IEngineBase` instance and a foolcap URL and uses | ||||
the `tub` attribute to make a connection to the controller. The | ||||
foolscap URL contains all the information needed to connect to the | ||||
controller, including the ip and port as well as any encryption and | ||||
authentication information needed for the connection. | ||||
After getting a reference to the controller, this method calls the | ||||
`register_engine` method of the controller to actually register the | ||||
engine. | ||||
:Parameters: | ||||
engine_service : IEngineBase | ||||
An instance of an `IEngineBase` implementer | ||||
furl_or_file : str | ||||
A furl or a filename containing a furl | ||||
""" | ||||
if not self.tub.running: | ||||
self.tub.startService() | ||||
self.engine_service = engine_service | ||||
self.engine_reference = IFCEngine(self.engine_service) | ||||
Brian Granger
|
r1769 | try: | ||
self.furl = find_furl(furl_or_file) | ||||
except ValueError: | ||||
return defer.fail(failure.Failure()) | ||||
# return defer.fail(failure.Failure(ValueError('not a valid furl or furl file: %r' % furl_or_file))) | ||||
Brian E Granger
|
r1234 | d = self.tub.getReference(self.furl) | ||
d.addCallbacks(self._register, self._log_failure) | ||||
return d | ||||
def _log_failure(self, reason): | ||||
Brian Granger
|
r1769 | log.err('EngineConnector: engine registration failed:') | ||
Brian E Granger
|
r1234 | log.err(reason) | ||
return reason | ||||
def _register(self, rr): | ||||
self.remote_ref = rr | ||||
# Now register myself with the controller | ||||
desired_id = self.engine_service.id | ||||
d = self.remote_ref.callRemote('register_engine', self.engine_reference, | ||||
desired_id, os.getpid(), pickle.dumps(self.engine_service.properties,2)) | ||||
return d.addCallbacks(self._reference_sent, self._log_failure) | ||||
def _reference_sent(self, registration_dict): | ||||
self.engine_service.id = registration_dict['id'] | ||||
log.msg("engine registration succeeded, got id: %r" % self.engine_service.id) | ||||
return self.engine_service.id | ||||