| # 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 |
| |
| # Pinned gcloud version. |
| GCLOUD_VERSION = 'version:266.0.0.chromium0' |
| |
| |
| class GCloudApi(recipe_api.RecipeApi): |
| """GCloudApi provides support for common gcloud operations.""" |
| |
| def __init__(self, *args, **kwargs): |
| super(GCloudApi, self).__init__(*args, **kwargs) |
| self._gcloud_executable = None |
| |
| def __call__(self, *args, **kwargs): |
| """Executes specified gcloud command.""" |
| self._ensure() |
| step_name = kwargs.pop('step_name', 'gcloud %s' % args[0]) |
| cmd = [self._gcloud_executable] |
| return self.m.step(step_name, cmd + list(args), **kwargs) |
| |
| def _ensure(self): |
| if self._gcloud_executable: |
| return |
| with self.m.step.nest('ensure gcloud'): |
| with self.m.context(infra_steps=True): |
| pkgs = self.m.cipd.EnsureFile() |
| pkgs.add_package('infra/gcloud/${platform}', GCLOUD_VERSION) |
| cipd_dir = self.m.path['start_dir'].join('cipd', 'gcloud') |
| self.m.cipd.ensure(cipd_dir, pkgs) |
| self.m.file.remove('remove gcloud wrapper', |
| cipd_dir.join('bin', 'gcloud')) |
| self.m.file.copy('copy patched gcloud', self.resource('gcloud'), |
| cipd_dir.join('bin', 'gcloud')) |
| self._gcloud_executable = cipd_dir.join('bin').join('gcloud') |
| |
| def container_image_exists(self, image): |
| step_result = self( |
| 'container', |
| 'images', |
| 'describe', |
| image, |
| ok_ret='any', |
| step_name='check existence of %s' % image) |
| return step_result.retcode == 0 |