| # Copyright 2020 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 |
| |
| |
| class LKGApi(recipe_api.RecipeApi): |
| """APIs for retrieving last-known-good entities.""" |
| |
| def revision( |
| self, step_name, builders, gitiles_ref=None, search_range=100, test_data=None |
| ): |
| """Get the last-known-good revision for a set of builders. |
| |
| Args: |
| step_name (str): Name of the step. |
| builders (seq(str)): A sequence of fully-qualified buildbucket |
| builder names. |
| gitiles_ref (str): If specified, filter by this gitiles ref, e.g. |
| refs/heads/main. |
| search_range (int): Number of builds per builder to search. |
| |
| Returns: |
| str: Last-known-good revision. |
| """ |
| args = ["revision", "-search-range", search_range] |
| for builder in builders: |
| args += ["-builder", builder] |
| return self._run( |
| step_name, |
| args, |
| gitiles_ref=gitiles_ref, |
| step_test_data=lambda: self.m.raw_io.test_api.stream_output_text(test_data), |
| ).stdout.strip() |
| |
| def build(self, step_name, builder, gitiles_ref=None, test_data=None): |
| """Get the last-known-good buildbucket ID for a builder. |
| |
| Args: |
| step_name (str): Name of the step. |
| builder (str): A fully-qualified buildbucket builder name. |
| gitiles_ref (str): If specified, filter by this gitiles ref, e.g. |
| refs/heads/main. |
| |
| Returns: |
| str: Last-known-good buildbucket build ID. |
| """ |
| args = ["build", "-builder", builder] |
| return self._run( |
| step_name, |
| args, |
| gitiles_ref=gitiles_ref, |
| step_test_data=lambda: self.m.raw_io.test_api.stream_output_text(test_data), |
| ).stdout.strip() |
| |
| def _run(self, step_name, args, gitiles_ref, step_test_data=None): |
| cmd = [self._lkg_tool] |
| cmd += args |
| if gitiles_ref: |
| cmd += ["-gitiles-ref", gitiles_ref] |
| return self.m.step( |
| step_name, |
| cmd, |
| stdout=self.m.raw_io.output_text(), |
| step_test_data=step_test_data, |
| ) |
| |
| @property |
| def _lkg_tool(self): |
| return self.m.ensure_tool("lkg", self.resource("tool_manifest.json")) |