| # 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 |