You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.7 KiB
73 lines
1.7 KiB
# 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
|
|
|