job_group.py revision c7f1593f9af3ea1b9264b37628c36f3a70e1749a
1#!/usr/bin/python 2# 3# Copyright 2010 Google Inc. All Rights Reserved. 4# 5 6import getpass 7import os 8 9from automation.common.state_machine import BasicStateMachine 10 11STATUS_NOT_EXECUTED = "NOT_EXECUTED" 12STATUS_EXECUTING = "EXECUTING" 13STATUS_SUCCEEDED = "SUCCEEDED" 14STATUS_FAILED = "FAILED" 15 16 17class JobGroupStateMachine(BasicStateMachine): 18 state_machine = { 19 STATUS_NOT_EXECUTED: [STATUS_EXECUTING], 20 STATUS_EXECUTING: [STATUS_SUCCEEDED, STATUS_FAILED]} 21 22 final_states = [STATUS_SUCCEEDED, STATUS_FAILED] 23 24 25class JobGroup(object): 26 HOMEDIR_PREFIX = os.path.join("/home", getpass.getuser(), "www", "automation") 27 28 def __init__(self, label, jobs=None, cleanup_on_completion=True, 29 cleanup_on_failure=False, description=""): 30 self._state = JobGroupStateMachine(STATUS_NOT_EXECUTED) 31 self.id = 0 32 self.label = label 33 self.jobs = [] 34 self.cleanup_on_completion = cleanup_on_completion 35 self.cleanup_on_failure = cleanup_on_failure 36 self.description = description 37 38 if jobs: 39 for job in jobs: 40 self.AddJob(job) 41 42 def _StateGet(self): 43 return self._state 44 45 def _StateSet(self, new_state): 46 self._state.Change(new_state) 47 48 status = property(_StateGet, _StateSet) 49 50 @property 51 def home_dir(self): 52 return os.path.join(self.HOMEDIR_PREFIX, "job-group-%d" % self.id) 53 54 @property 55 def time_submitted(self): 56 try: 57 return self.status.timeline[1].time_started 58 except IndexError: 59 return None 60 61 def __repr__(self): 62 return '{%s: %s}' % (self.__class__.__name__, self.id) 63 64 def __str__(self): 65 return "\n".join(["Job-Group:", 66 "ID: %s" % self.id] + 67 [str(job) for job in self.jobs]) 68 69 def AddJob(self, job): 70 self.jobs.append(job) 71 job.group = self 72