diff options
Diffstat (limited to 'morphlib/buildworker.py')
-rw-r--r-- | morphlib/buildworker.py | 87 |
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() |