blob: 5adb47ebd7fc1dbb8cba72b7120a8f93354b8015 [file] [log] [blame]
# 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.ensure_tool(
"gcloud",
self.resource("tool_manifest.json"),
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