| # Copyright 2019 The Chromium 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 |
| |
| KUBECTL_VERSION = "version:1.21.0-00" |
| |
| |
| class KubectlApi(recipe_api.RecipeApi): |
| """Provides steps to connect and run Kubectl images.""" |
| |
| def __init__(self, luci_context, *args, **kwargs): |
| super(KubectlApi, self).__init__(*args, **kwargs) |
| self._luci_context = luci_context |
| |
| def __call__(self, *args, **kwargs): |
| """Executes specified kubectl command. |
| |
| Args: |
| args: arguments passed to the 'kubectl' command including subcommand name, |
| e.g. api.kubectl('config', 'view', step_name='view kubectl configuration'). |
| kwargs: arguments passed down to api.step module. |
| """ |
| cmd = [self._kubectl_executable] |
| step_name = kwargs.pop("step_name", "kubectl %s" % args[0]) |
| return self.m.step(step_name, cmd + list(args), **kwargs) |
| |
| @property |
| def _kubectl_executable(self): |
| self.m.gcloud.patch_gcloud_invoker() |
| return self.m.cipd.ensure_tool( |
| "fuchsia/third_party/kubectl/${platform}", KUBECTL_VERSION |
| ) |
| |
| @property |
| def version(self): |
| """Returns kubectl client version installed or None if failed to detect.""" |
| step = self( |
| "version", |
| stdout=self.m.raw_io.output(), |
| step_name="retrieve kubectl version", |
| step_test_data=( |
| lambda: self.m.raw_io.test_api.stream_output( |
| 'Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.1", GitCommit:"d647ddbd755faf07169599a625faf302ffc34458", GitTreeState:"clean", BuildDate:"2019-10-02T17:01:15Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}' |
| ) |
| ), |
| ) |
| if 'GitCommit:"' in step.stdout: |
| index = step.stdout.find('GitCommit:"') |
| index_end = step.stdout.find('"', index + len('GitCommit:"')) |
| version = step.stdout[index + len('GitCommit:"') : index_end] |
| else: |
| version = "unknown" |
| step.presentation.step_text = version |
| return version |