blob: 6a55acd4df6d26691c063c1f29f6ec21228f2e76 [file]
"""Build step class for setting up a build licenses."""
from __future__ import absolute_import
import logging
import os
import shlex
from slave import base_step
from slave.step import shell_step
_ANDROID_SDK_PATH = [
'chromium/src/third_party/android_sdk/public',
'chromium/src/third_party/android_tools/sdk',
]
_ANDROID_SDK_MANAGER_BIN = 'tools/bin/sdkmanager'
_ANDROID_SDK_MANAGER = 'bash -c "yes {param} | {sdk_manager_bin} --licenses"'
_ONLY_CHECK_LICENSE = 'n'
_AUTO_ACCEPT_LICENSE = 'y'
_ANDROID_SDK_LICENSE_OK = 'All SDK package licenses accepted'
_ANDROID_SDK_LICENSE_FAIL = 'SDK package license not accepted'
_ANDROID_SDK_LICENSES_FAIL = 'SDK package licenses not accepted'
def _get_sdk_manager_command(param):
return shlex.split(_ANDROID_SDK_MANAGER.format(
param=param, sdk_manager_bin=_ANDROID_SDK_MANAGER_BIN))
class LicenseError(base_step.StepError):
"""Exception raised when an unrecognized license status received."""
pass
class AndroidSdkLicenseCheckAccept(shell_step.ShellStep):
"""Build step for checking and accepting Android SDK license."""
def __init__(self, **kwargs):
shell_step.ShellStep.__init__(
self,
name='Android SDK License Installation',
halt_on_failure=True,
**kwargs)
self.command = None
def _android_sdk_status_validator(self, returncode, stdout, stderr):
del returncode, stderr # Unused.
if _ANDROID_SDK_LICENSE_OK in stdout:
logging.info('Android SDK licenses accepted')
return True
if (_ANDROID_SDK_LICENSE_FAIL in stdout
or _ANDROID_SDK_LICENSES_FAIL in stdout):
logging.info('Some Android SDK licenses not accepted')
return False
raise LicenseError('Fail to check status of Android SDK package')
def _prepare_license_accept(self, returncode, stdout, stderr, cwd=''):
"""A function to run before retrying a failed repo sync."""
del returncode, stdout, stderr # Unused.
logging.info('Auto-accepting Android SDK licenses')
self.exec_subprocess(
_get_sdk_manager_command(_AUTO_ACCEPT_LICENSE),
cwd=cwd)
def _valid_sdk_path(self):
return [sdk_path for sdk_path in
_ANDROID_SDK_PATH if os.path.isfile(os.path.join(
sdk_path, _ANDROID_SDK_MANAGER_BIN))]
def get_commands(self):
return [
self.ShellCommand(
_get_sdk_manager_command(_ONLY_CHECK_LICENSE),
cwd=sdk_path,
num_retries=1,
validator=self._android_sdk_status_validator,
setup_for_retry=(
lambda returncode, stdout, stderr, cwd=sdk_path:
self._prepare_license_accept(
returncode, stdout, stderr, cwd=cwd)),
halt_on_failure=True)
for sdk_path in self._valid_sdk_path()
]