| # Copyright 2019 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 GCloudApi(recipe_api.RecipeApi): |
| """GCloudApi provides support for common gcloud operations.""" |
| |
| def __init__(self, *args, **kwargs): |
| super().__init__(*args, **kwargs) |
| self.gcloud_patched = False |
| |
| @property |
| def _gcloud_executable(self): |
| gcloud_path = self.m.cipd_ensure( |
| self.resource("cipd.ensure"), |
| "infra/3pp/tools/gcloud/${platform}", |
| executable_path="bin/gcloud", |
| ) |
| return gcloud_path |
| |
| def __call__(self, *args, **kwargs): |
| """Executes specified gcloud command.""" |
| step_name = kwargs.pop("step_name", f"gcloud {args[0]}") |
| cmd = [self._gcloud_executable] + list(args) |
| return self.m.step(step_name, cmd, **kwargs) |
| |
| def container_image_exists(self, image): |
| step_result = self( |
| "container", |
| "images", |
| "describe", |
| image, |
| ok_ret="any", |
| step_name=f"check existence of {image}", |
| ) |
| return step_result.retcode == 0 |
| |
| def patch_gcloud_invoker(self): |
| """GCloud invoker has issues when running on bots, this API |
| patches the invoker to make it compatible with bots' python binary. |
| """ |
| if self.gcloud_patched or not self._gcloud_executable: |
| return |
| gcloud_path = self.m.path.join( |
| self.m.path.dirname(self.m.path.dirname(self._gcloud_executable)), |
| "bin/gcloud", |
| ) |
| self.m.file.remove("remove gcloud wrapper", gcloud_path) |
| self.m.file.copy( |
| "copy patched gcloud", |
| self.resource("gcloud"), |
| gcloud_path, |
| ) |
| self.gcloud_patched = True |