| # 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.16.1-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 |
| self._kubectl_executable = None |
| |
| 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. |
| """ |
| self._ensure() |
| cmd = [self._kubectl_executable] |
| step_name = kwargs.pop('step_name', 'kubectl %s' % args[0]) |
| return self.m.step(step_name, cmd + list(args), **kwargs) |
| |
| def _ensure(self): |
| if self._kubectl_executable: |
| return |
| with self.m.step.nest('ensure kubectl'): |
| with self.m.context(infra_steps=True): |
| pkgs = self.m.cipd.EnsureFile() |
| pkgs.add_package('fuchsia/third_party/kubectl/linux-amd64', |
| KUBECTL_VERSION) |
| cipd_dir = self.m.path['start_dir'].join('cipd', 'kubectl') |
| self.m.cipd.ensure(cipd_dir, pkgs) |
| self._kubectl_executable = cipd_dir.join('kubectl') |
| |
| @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 |