Source code for cobra.dcode
"""
Cobra's distributed code module capable of allowing
serialization of code from one system to another.
Particularly useful for clustering and workunit stuff.
"""
import os
import sys
import imp
import cobra
[docs]class DcodeFinder(object):
"""
This is the module finder which is exposed by a dcode
server to allow clients to attempt to find modules.
"""
[docs] def find_module(self, fullname, uri, path=None):
# If there are nested module names, they are
# accounted for in path, so grab just the end
fullname = fullname.split(".")[-1]
fobj, filename, typeinfo = imp.find_module(fullname, path)
if os.path.isdir(filename):
filename = os.path.join(filename, "__init__.py")
if not os.path.exists(filename):
return None
path = "%s|%s" % (uri,os.path.dirname(filename))
fbytes = file(filename, "rU").read()
return DcodeLoader(fbytes, filename, path)
[docs]class DcodeLoader(object):
"""
This object gets pickled by the DcodeFinder and returned
to the client who calls load_module.
"""
def __init__(self, fbytes, filename, path):
object.__init__(self)
self.fbytes = fbytes
self.filename = filename
self.path = path
[docs] def get_source(self, name):
return self.fbytes
[docs] def load_module(self, fullname):
mod = sys.modules.get(fullname)
if mod == None:
mod = imp.new_module(fullname)
sys.modules[fullname] = mod
mod.__file__ = self.filename
mod.__loader__ = self
if self.path != None:
mod.__path__ = [self.path]
exec self.fbytes in mod.__dict__
return mod
[docs]class DcodeImporter(object):
"""
This object goes into the client side import path_hooks
to allow cobra:// uri's to be added to the import path.
"""
def __init__(self, uri, retrymax=3, timeout=10):
object.__init__(self)
if not cobra.isCobraUri(uri):
raise ImportError
path = None
if uri.find("|") != -1:
uri,path = uri.split("|")
path = [path,]
self.uri = uri
self.path = path
try:
self.cobra = cobra.CobraProxy(uri, retrymax=retrymax, timeout=timeout)
except Exception, e:
raise ImportError
[docs] def find_module(self, fullname, path=None):
if path == None:
path = self.path
return self.cobra.find_module(fullname, self.uri, path)
[docs]def enableDcodeClient():
"""
Once having called this, a client will be able to add cobra URIs
to sys.path (one will be added automatically for the optional
server parameter) and code will be imported via the distributed method.
"""
if DcodeImporter not in sys.path_hooks:
sys.path_hooks.append(DcodeImporter)
[docs]def addDcodeServer(server, port=None, override=False, ssl=False):
scheme = "cobra"
if ssl:
scheme = "cobrassl"
if port == None:
port = cobra.COBRA_PORT
uri = "%s://%s:%d/DcodeServer" % (scheme, server, port)
if uri not in sys.path:
if override:
sys.path.insert(0, uri)
else:
sys.path.append(uri)
[docs]def enableDcodeServer():
cobra.shareObject(DcodeFinder(), "DcodeServer")