summaryrefslogtreecommitdiff
path: root/morphlib/buildworker.py
diff options
context:
space:
mode:
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()