• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import common
6from autotest_lib.client.common_lib import priorities
7
8import base_event, task
9
10
11class BuildEvent(base_event.BaseEvent):
12    """Base class for events that come from the build system.
13
14    For example, a new build completing or a new version of Chromium.
15
16    @var _revision: The last git revision we checked for new build artifacts.
17    """
18
19
20    def __init__(self, keyword, manifest_versions, always_handle):
21        """Constructor.
22
23        @param keyword: the keyword/name of this event, e.g. nightly.
24        @param manifest_versions: ManifestVersions instance to use for querying.
25        @param always_handle: If True, make ShouldHandle() always return True.
26        """
27        super(BuildEvent, self).__init__(keyword, manifest_versions,
28                                         always_handle)
29        self._revision = None
30
31
32    def Merge(self, to_merge):
33        """Merge this event with to_merge, changing all mutable properties.
34
35        self._revision REMAINS UNCHANGED.  That's part of this instance's
36        identity.
37
38        @param to_merge: A BuildEvent instance to merge into this isntance.
39        """
40        super(BuildEvent, self).Merge(to_merge)
41
42
43    def Prepare(self):
44        """Perform any one-time setup that must occur before [Should]Handle().
45
46        Creates initial revision checkpoint.
47        """
48        self._revision = self._mv.GetCheckpoint()
49
50
51    def ShouldHandle(self):
52        """True if there's been a new successful build since |self._revision|
53
54        @return True if there's been a new build, false otherwise.
55        """
56        if super(BuildEvent, self).ShouldHandle():
57            return True
58        else:
59            return self._mv.AnyManifestsSinceRev(self._revision)
60
61
62    def _AllPerBranchBuildsSince(self, board, revision):
63        """Get all per-branch, per-board builds since git |revision|.
64
65        @param board: the board whose builds we want.
66        @param revision: the revision to look back until.
67        @return {branch: [build-name1, build-name2]}
68        """
69        all_branch_manifests = self._mv.ManifestsSinceRev(revision, board)
70        all_branch_builds = {}
71        for (type, milestone), manifests in all_branch_manifests.iteritems():
72            branch_name = task.PickBranchName(type, milestone)
73            for manifest in manifests:
74                build = base_event.BuildName(board, type, milestone, manifest)
75                all_branch_builds.setdefault(branch_name, []).append(build)
76        return all_branch_builds
77
78
79    def GetBranchBuildsForBoard(self, board):
80        return self._AllPerBranchBuildsSince(board, self._revision)
81
82
83    def GetLaunchControlBuildsForBoard(self, board):
84        """Get per-branch, per-board builds since last run of this event.
85
86        @param board: the board whose builds we want.
87
88        @return: A list of Launch Control builds for the given board, e.g.,
89                ['git_mnc_release/shamu-eng/123',
90                 'git_mnc_release/shamu-eng/124'].
91        """
92        return self._LatestLaunchControlBuilds(board)
93
94
95class NewBuild(BuildEvent):
96    """Event to trigger when new builds are available from the build system."""
97    KEYWORD = 'new_build'
98    PRIORITY = priorities.Priority.POSTBUILD
99    TIMEOUT = 12  # 12 hours, and builds come out every 6
100
101
102    def __init__(self, mv, always_handle):
103        """Constructor.
104
105        @param mv: ManifestVersions instance to use for querying.
106        @param always_handle: If True, make ShouldHandle() always return True.
107        """
108        super(NewBuild, self).__init__(self.KEYWORD, mv, always_handle)
109
110
111    def UpdateCriteria(self):
112        self._revision = self._mv.GetCheckpoint()
113