| # Copyright 2018 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from recipe_engine import recipe_api |
| |
| BUILDSETLOOKUP_VERSION = 'git_revision:6d396fabbcf4777d512466990d247bdde55c3e46' |
| |
| |
| class BuildSetLookupApi(recipe_api.RecipeApi): |
| """APIs for retrieving the build ID for a given buildset and builder ID.""" |
| |
| def __init__(self, *args, **kwargs): |
| super(BuildSetLookupApi, self).__init__(*args, **kwargs) |
| self._buildset_lookup_tool = None |
| |
| def __call__(self, |
| step_name, |
| builder, |
| buildset, |
| build_status=None, |
| leak_to=None, |
| retries=0, |
| interval=0): |
| """Retrieves the build ID for a given buildset and builder ID. |
| |
| Args: |
| step_name (str): The name of the step produced. |
| builder (str): A fully-qualified buildbucket v2 builder ID, |
| consisting of <project>/<project-namespaced bucket>/<builder name>. For example: |
| 'fuchsia/ci/garnet-x64-release-qemu_kvm'. |
| buildset (str): A fully-qualified buildbucket V2 buildset tag, |
| consisting of commit/gitiles/<host>/<repo>/+/<commit ID>. For example: |
| 'commit/gitiles/fuchsia.googlesource.com/topaz/+/e3127e0bd6d57da7a5959ee70eb0a396590e6d53'. |
| build_status (int): The expected buildbucket status code of the build. If |
| None, use tool's default (12, SUCCESS). |
| leak_to (Path): If leak_to is provided, it must be a Path object. This path will be used in |
| place of a random temporary file, and the file will not be deleted at the end of the step. |
| retries (int): Number of times to retry lookup, in case builds are not yet |
| triggered. |
| interval (int): Interval between retries in seconds. |
| """ |
| self.ensure() |
| step_args = [ |
| self._buildset_lookup_tool, |
| '-builder-id', |
| builder, |
| '-build-set', |
| buildset, |
| ] |
| if build_status is not None: |
| step_args.extend(['-build-status', build_status]) |
| |
| for attempt in xrange(retries + 1): |
| try: |
| return self.m.step( |
| step_name, |
| step_args, |
| stdout=self.m.raw_io.output(leak_to=leak_to), |
| ) |
| except self.m.step.StepFailure: |
| if attempt < retries: |
| self.m.time.sleep(interval) |
| else: |
| raise |
| |
| def ensure(self): |
| """Ensures that the buildset lookup tool is installed.""" |
| if not self._buildset_lookup_tool: |
| with self.m.step.nest('ensure buildset lookup'): |
| with self.m.context(infra_steps=True): |
| pkgs = self.m.cipd.EnsureFile() |
| pkgs.add_package('fuchsia/infra/buildsetlookup/${platform}', |
| BUILDSETLOOKUP_VERSION) |
| cipd_dir = self.m.path['start_dir'].join('cipd', 'buildsetlookup') |
| self.m.cipd.ensure(cipd_dir, pkgs) |
| self._buildset_lookup_tool = cipd_dir.join('buildsetlookup') |