From 14e768ce2e5693ebf6418e7a6e94fe4fb9a71844 Mon Sep 17 00:00:00 2001 From: Jannis Pohlmann Date: Tue, 24 Jan 2012 14:23:34 +0000 Subject: 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. --- morphlib/buildworker.py | 87 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 30 deletions(-) (limited to 'morphlib/buildworker.py') 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() -- cgit v1.2.1