summaryrefslogtreecommitdiff
path: root/morphlib/buildworker.py
diff options
context:
space:
mode:
authorJannis Pohlmann <jannis.pohlmann@codethink.co.uk>2012-01-24 14:23:34 +0000
committerJannis Pohlmann <jannis.pohlmann@codethink.co.uk>2012-01-24 14:40:08 +0000
commit14e768ce2e5693ebf6418e7a6e94fe4fb9a71844 (patch)
tree6c629c56aa6e32092a5745bc6de3b50d5c86fbc5 /morphlib/buildworker.py
parent10122174305ac5c6040212a8b526a77ee473577b (diff)
downloadmorph-14e768ce2e5693ebf6418e7a6e94fe4fb9a71844.tar.gz
Share functionality in BuildWorker, implement SSH, add name/ident concept.
All BuildWorker subclasses are likely to make use of the multiprocessing library anyway, so most of the functionality can be shared. All workers now have an ident (e.g. "user@hostname" or "local") which is used by the BuildController to generate enumerated names for them (e.g. "user@hostname-1", "user@hostname-2" or "local-1" and "local-2"), which makes it easier to identify who does what. The RemoteBuildWorker now runs "ssh HOSTNAME fakeroot morph" for building stuff remotely.
Diffstat (limited to 'morphlib/buildworker.py')
-rw-r--r--morphlib/buildworker.py87
1 files changed, 57 insertions, 30 deletions
diff --git a/morphlib/buildworker.py b/morphlib/buildworker.py
index ad951466..f75177b3 100644
--- a/morphlib/buildworker.py
+++ b/morphlib/buildworker.py
@@ -22,15 +22,15 @@ import morphlib
class BuildWorker(object):
- def __init__(self, name, app):
+ def __init__(self, name, ident, app):
self.name = name
+ self.ident = ident
self.settings = app.settings
self.real_msg = app.msg
self.indent = 2
self.idle_since = datetime.datetime.now()
-
- def __str__(self):
- return self.name
+ self.manager = Manager()
+ self.reset()
def indent_more(self):
self.indent += 1
@@ -42,30 +42,48 @@ class BuildWorker(object):
spaces = ' ' * self.indent
self.real_msg('%s%s' % (spaces, text))
+ def reset(self):
+ self.process = None
+ self.blob = None
+ self._output = self.manager.list()
+
def build(self, blob):
raise NotImplementedError
def check_complete(self, timeout):
- raise NotImplementedError
+ if self.process:
+ self.process.join(timeout)
+ if self.process.is_alive():
+ return False
+ else:
+ self.idle_since = datetime.datetime.now()
+ return True
+ else:
+ return True
+ @property
+ def output(self):
+ try:
+ return self._output[0]
+ except IndexError:
+ return None
-class LocalBuildWorker(BuildWorker):
+ def __str__(self):
+ return self.name
- def __init__(self, name, app):
- BuildWorker.__init__(self, name, app)
- self.manager = Manager()
- self.reset()
- def reset(self):
- self.process = None
- self.blob = None
- self._output = self.manager.list()
+class LocalBuildWorker(BuildWorker):
+
+ def __init__(self, name, ident, app):
+ BuildWorker.__init__(self, name, ident, app)
def run(self, repo, ref, filename, output):
ex = morphlib.execute.Execute('.', self.msg)
stdout = ex.runv(['./morph', '--verbose', '--keep-path',
'build', repo, ref, filename])
output.append(stdout)
+
+ # TODO report errors back to the caller
def build(self, blob):
self.reset()
@@ -77,23 +95,32 @@ class LocalBuildWorker(BuildWorker):
self.process = Process(group=None, target=self.run, args=args)
self.process.start()
- def check_complete(self, timeout):
- if self.process:
- self.process.join(timeout)
- if self.process.is_alive():
- return False
- else:
- self.idle_since = datetime.datetime.now()
- return True
- else:
- return True
- @property
- def output(self):
- return self._output[0]
+class RemoteBuildWorker(BuildWorker):
+ def __init__(self, name, ident, app):
+ BuildWorker.__init__(self, name, ident, app)
+ self.hostname = ident
-class RemoteBuildWorker(BuildWorker):
+ def run(self, repo, ref, filename, output):
+ ex = morphlib.execute.Execute('.', self.msg)
+
+ # generate command line options
+ cmdline = ['ssh', self.hostname]
+ cmdline.extend(['fakeroot', 'morph', 'build', repo, ref, filename])
+
+ # run morph on the other machine
+ stdout = ex.runv(cmdline)
+ output.append(stdout)
+
+ # TODO report errors back to the caller
- def __init__(self, app):
- BuildWorker.__init__(self, app)
+ def build(self, blob):
+ self.reset()
+ self.blob = blob
+ args = (blob.morph.treeish.original_repo,
+ blob.morph.treeish.ref,
+ blob.morph.filename,
+ self._output)
+ self.process = Process(group=None, target=self.run, args=args)
+ self.process.start()