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