aboutsummaryrefslogtreecommitdiff
path: root/automation/common/job_group.py
blob: 96912fc1f05003e3415814643cf631dce6153682 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 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