diff options
Diffstat (limited to 'automation/common/job_group.py')
-rw-r--r-- | automation/common/job_group.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/automation/common/job_group.py b/automation/common/job_group.py new file mode 100644 index 00000000..96912fc1 --- /dev/null +++ b/automation/common/job_group.py @@ -0,0 +1,73 @@ +# Copyright 2010 Google Inc. All Rights Reserved. +# + +import getpass +import os + +from automation.common.state_machine import BasicStateMachine + +STATUS_NOT_EXECUTED = 'NOT_EXECUTED' +STATUS_EXECUTING = 'EXECUTING' +STATUS_SUCCEEDED = 'SUCCEEDED' +STATUS_FAILED = 'FAILED' + + +class JobGroupStateMachine(BasicStateMachine): + state_machine = { + STATUS_NOT_EXECUTED: [STATUS_EXECUTING], + STATUS_EXECUTING: [STATUS_SUCCEEDED, STATUS_FAILED] + } + + final_states = [STATUS_SUCCEEDED, STATUS_FAILED] + + +class JobGroup(object): + HOMEDIR_PREFIX = os.path.join('/home', getpass.getuser(), 'www', 'automation') + + def __init__(self, + label, + jobs=None, + cleanup_on_completion=True, + cleanup_on_failure=False, + description=''): + self._state = JobGroupStateMachine(STATUS_NOT_EXECUTED) + self.id = 0 + self.label = label + self.jobs = [] + self.cleanup_on_completion = cleanup_on_completion + self.cleanup_on_failure = cleanup_on_failure + self.description = description + + if jobs: + for job in jobs: + self.AddJob(job) + + def _StateGet(self): + return self._state + + def _StateSet(self, new_state): + self._state.Change(new_state) + + status = property(_StateGet, _StateSet) + + @property + def home_dir(self): + return os.path.join(self.HOMEDIR_PREFIX, 'job-group-%d' % self.id) + + @property + def time_submitted(self): + try: + return self.status.timeline[1].time_started + except IndexError: + return None + + def __repr__(self): + return '{%s: %s}' % (self.__class__.__name__, self.id) + + def __str__(self): + return '\n'.join(['Job-Group:', 'ID: %s' % self.id] + [str( + job) for job in self.jobs]) + + def AddJob(self, job): + self.jobs.append(job) + job.group = self |