| """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() |
| ] |