# 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()