73 lines
1.7 KiB
Python
73 lines
1.7 KiB
Python
# 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
|