# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import common
from autotest_lib.client.common_lib import priorities
import base_event, task
class BuildEvent(base_event.BaseEvent):
"""Base class for events that come from the build system.
For example, a new build completing or a new version of Chromium.
@var _revision: The last git revision we checked for new build artifacts.
"""
def __init__(self, keyword, manifest_versions, always_handle):
"""Constructor.
@param keyword: the keyword/name of this event, e.g. nightly.
@param manifest_versions: ManifestVersions instance to use for querying.
@param always_handle: If True, make ShouldHandle() always return True.
"""
super(BuildEvent, self).__init__(keyword, manifest_versions,
always_handle)
self._revision = None
def Merge(self, to_merge):
"""Merge this event with to_merge, changing all mutable properties.
self._revision REMAINS UNCHANGED. That's part of this instance's
identity.
@param to_merge: A BuildEvent instance to merge into this isntance.
"""
super(BuildEvent, self).Merge(to_merge)
def Prepare(self):
"""Perform any one-time setup that must occur before [Should]Handle().
Creates initial revision checkpoint.
"""
self._revision = self._mv.GetCheckpoint()
def ShouldHandle(self):
"""True if there's been a new successful build since |self._revision|
@return True if there's been a new build, false otherwise.
"""
if super(BuildEvent, self).ShouldHandle():
return True
else:
return self._mv.AnyManifestsSinceRev(self._revision)
def _AllPerBranchBuildsSince(self, board, revision):
"""Get all per-branch, per-board builds since git |revision|.
@param board: the board whose builds we want.
@param revision: the revision to look back until.
@return {branch: [build-name1, build-name2]}
"""
all_branch_manifests = self._mv.ManifestsSinceRev(revision, board)
all_branch_builds = {}
for (type, milestone), manifests in all_branch_manifests.iteritems():
branch_name = task.PickBranchName(type, milestone)
for manifest in manifests:
build = base_event.BuildName(board, type, milestone, manifest)
all_branch_builds.setdefault(branch_name, []).append(build)
return all_branch_builds
def GetBranchBuildsForBoard(self, board):
return self._AllPerBranchBuildsSince(board, self._revision)
def GetLaunchControlBuildsForBoard(self, board):
"""Get per-branch, per-board builds since last run of this event.
@param board: the board whose builds we want.
@return: A list of Launch Control builds for the given board, e.g.,
['git_mnc_release/shamu-eng/123',
'git_mnc_release/shamu-eng/124'].
"""
return self._LatestLaunchControlBuilds(board)
class NewBuild(BuildEvent):
"""Event to trigger when new builds are available from the build system."""
KEYWORD = 'new_build'
PRIORITY = priorities.Priority.POSTBUILD
TIMEOUT = 12 # 12 hours, and builds come out every 6
def __init__(self, mv, always_handle):
"""Constructor.
@param mv: ManifestVersions instance to use for querying.
@param always_handle: If True, make ShouldHandle() always return True.
"""
super(NewBuild, self).__init__(self.KEYWORD, mv, always_handle)
def UpdateCriteria(self):
self._revision = self._mv.GetCheckpoint()