Add android sdk module (#9236)

* adds simple implementation of adding and removing android sdk packages

* adds package update

* adds simple installed packages parsing

* moves parsing logic to a separate class

* adds absent state for sdkmanager packages and setup for tests

* adds output for installing and removing packages

* removes version from Package object since it is not possible to specify version for a package while using sdkmanager

* adds 'latest' state

* adds tests

* fixes crash when sdkmanager is invoked from python with LC_ALL=C

* fixes latest state

* adds sdk_root parameter

* adds channel parameter

* simplifies regexps, removes unused named groups

* minor refactoring of sdkmanager parsing

* adds java dependency variable for different distributions

* adds RETURN documentation

* adds check for nonexisting package

* adds check for non-accepted licenses

* removes excessive methods from sdkmanager

* removes unused 'update' module parameter, packages may be updated using 'latest' state

* minor refactoring

* adds EXAMPLES doc section

* adds DOCUMENTATION section and license headers

* fixes formatting issues

* removes diff_params

* adds maintainer

* fixes sanity check issues in sdkmanager

* adds java dependency for macos and moves some tests to a separate FreeBSD configuration

* fixes dependencies setup for OSX

* fixes dependencies setup for OSX (2)

* fixes dependencies setup for OSX (3)

* Apply minor suggestions from code review

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* applies code review suggestions

* changes force_lang from C.UTF-8 to auto in sdkmanager (as per discussion https://github.com/ansible-collections/community.general/pull/9236#discussion_r1881114326)

* Revert "changes force_lang from C.UTF-8 to auto in sdkmanager (as per discussion https://github.com/ansible-collections/community.general/pull/9236#discussion_r1881114326)"

This reverts commit 619f28dd58.

* fixes some more comments from review

* minor sanity issue fix

* uses the 'changed' test instead of checking the 'changed' attribute

* adds 'accept_licenses' parameter. Installation is now performed independently for each package specified.

* removes "Accept licenses" task from examples

* fixes docs sanity issues

* applies minor suggestions from code review

* fixes regexps. The previous version didn't match versions like "32.1.0 rc1". Also, this allows to simplify the parsing logic as there is no need to skip table headers anymore.

* renamed sdkmanager.py to android_sdkmanager.py

* applies minor suggestions from code review

Co-authored-by: Felix Fontein <felix@fontein.de>

* updates BOTMETA

* reordered BOTMETA

---------

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
Stanislav Shamilov 2024-12-20 23:55:12 +02:00 committed by GitHub
commit 2b2872f0ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 711 additions and 0 deletions

View file

@ -0,0 +1,7 @@
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
azp/posix/3
destructive
needs/root

View file

@ -0,0 +1,8 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
dependencies:
- setup_pkg_mgr
- setup_remote_tmp_dir

View file

@ -0,0 +1,92 @@
---
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: Install build-tools;34.0.0
android_sdk:
accept_licenses: true
name: build-tools;34.0.0
state: present
register: build_tools_installed
- name: Install build-tools;34.0.0 second time
android_sdk:
name: build-tools;34.0.0
state: present
register: build_tools_installed2
- name: Stat build-tools
stat:
path: "{{ android_sdk_location }}/build-tools/34.0.0"
register: build_tools_34_0_0
- name: Delete build-tools;34.0.0
android_sdk:
name: build-tools;34.0.0
state: absent
register: build_tools_deleted
- name: Delete build-tools;34.0.0 second time
android_sdk:
name: build-tools;34.0.0
state: absent
register: build_tools_deleted2
- name: Download old platform-tools
unarchive:
src: https://dl.google.com/android/repository/platform-tools_r27.0.0-linux.zip
remote_src: true
dest: "{{ android_sdk_location }}"
- name: Try installing platform-tools from sdkmanager
android_sdk:
name: platform-tools
accept_licenses: true
state: present
register: platform_tools_present
- name: Install (update) platform-tools
android_sdk:
name: platform-tools
state: latest
register: platform_tools_updated
- name: Install a package to a new root
android_sdk:
name: build-tools;34.0.0
accept_licenses: true
state: present
sdk_root: "{{ remote_tmp_dir }}"
register: new_root_package
- name: Check package is installed
stat:
path: "{{ remote_tmp_dir }}/build-tools/34.0.0"
register: new_root_package_stat
- name: Install a package from canary channel
android_sdk:
name: build-tools;33.0.0
state: present
channel: canary
register: package_canary
- name: Run tests
assert:
that:
- build_tools_34_0_0.stat.exists
- build_tools_installed is changed
- build_tools_installed2 is not changed
- build_tools_deleted is changed
- build_tools_deleted2 is not changed
- platform_tools_present is not changed
- platform_tools_updated is changed
- new_root_package is changed
- new_root_package_stat.stat.exists
- package_canary is changed

View file

@ -0,0 +1,72 @@
---
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: Install sources;android-26 (FreeBSD)
android_sdk:
name: sources;android-26
accept_licenses: true
state: present
register: sources_android_26_installed
- name: Install sources;android-26 (FreeBSD)
android_sdk:
name: sources;android-26
state: present
register: sources_android_26_installed2
- name: Stat build-tools (FreeBSD)
stat:
path: "{{ android_sdk_location }}/sources/android-26"
register: sources_android_26
- name: Delete sources;android-26 (FreeBSD)
android_sdk:
name: sources;android-26
state: absent
register: sources_android_26_deleted
- name: Delete sources;android-26 second time (FreeBSD)
android_sdk:
name: sources;android-26
state: absent
register: sources_android_26_deleted2
- name: Install a package to a new root (FreeBSD)
android_sdk:
name: sources;android-26
accept_licenses: true
state: present
sdk_root: "{{ remote_tmp_dir }}"
register: new_root_package
- name: Check package is installed (FreeBSD)
stat:
path: "{{ remote_tmp_dir }}/sources/android-26"
register: new_root_package_stat
- name: Install a package from canary channel (FreeBSD)
android_sdk:
name: sources;android-26
accept_licenses: true
state: present
channel: canary
register: package_canary
- name: Run tests (FreeBSD)
assert:
that:
- sources_android_26.stat.exists
- sources_android_26_installed is changed
- sources_android_26_installed2 is not changed
- sources_android_26_deleted is changed
- sources_android_26_deleted2 is not changed
- new_root_package is changed
- new_root_package_stat.stat.exists
- package_canary is changed

View file

@ -0,0 +1,31 @@
---
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# java >= 17 is not available in RHEL and CentOS7 repos, which is required for sdkmanager to run
- name: Bail out if not supported
when:
- "ansible_os_family == 'RedHat' and ansible_distribution_version is version('8.0', '<')"
ansible.builtin.meta: end_play
- name: Run android_sdk tests
environment:
PATH: '{{ ansible_env.PATH }}:{{ android_sdk_location }}/cmdline-tools/latest/bin'
block:
- import_tasks: setup.yml
- name: Run default tests
import_tasks: default-tests.yml
when: ansible_os_family != 'FreeBSD'
# Most of the important Android SDK packages are not available on FreeBSD (like, build-tools, platform-tools and so on),
# but at least some of the functionality can be tested (like, downloading sources)
- name: Run FreeBSD tests
import_tasks: freebsd-tests.yml
when: ansible_os_family == 'FreeBSD'

View file

@ -0,0 +1,86 @@
---
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: Include OS-specific variables
include_vars: '{{ ansible_os_family }}.yml'
- name: Install dependencies
become: true
package:
name:
- "{{ openjdk_pkg }}"
- unzip
state: present
when: ansible_os_family != 'Darwin'
- name: Install dependencies (OSX)
block:
- name: Find brew binary
command: which brew
register: brew_which
- name: Get owner of brew binary
stat:
path: "{{ brew_which.stdout }}"
register: brew_stat
- name: "Install package"
homebrew:
name:
- "{{ openjdk_pkg }}"
- unzip
state: present
update_homebrew: false
become: true
become_user: "{{ brew_stat.stat.pw_name }}"
environment:
HOMEBREW_NO_AUTO_UPDATE: "True"
- name: Symlink java
become: true
file:
src: "/usr/local/opt/openjdk@17/libexec/openjdk.jdk"
dest: "/Library/Java/JavaVirtualMachines/openjdk-17.jdk"
state: link
when:
- ansible_os_family == 'Darwin'
- name: Create Android SDK directory
file:
path: "{{ android_sdk_location }}"
state: directory
- name: Check that sdkmanager is installed
stat:
path: "{{ android_sdk_location }}/cmdline-tools/latest/bin/sdkmanager"
register: sdkmanager_installed
- name: Install Android command line tools
when: not sdkmanager_installed.stat.exists
block:
- name: Create Android SDK dir structure
file:
path: "{{ item.path }}"
state: "{{ item.state }}"
with_items:
- { path: "{{ android_cmdline_temp_dir }}", state: "directory" }
- { path: "{{ android_sdk_location }}/cmdline-tools/latest", state: "directory" }
- name: Download Android command line tools
unarchive:
src: "{{ commandline_tools_link }}"
dest: "{{ android_cmdline_temp_dir }}"
remote_src: yes
creates: "{{ android_cmdline_temp_dir }}/cmdline-tools"
when: not sdkmanager_installed.stat.exists
- name: Fix directory structure
copy:
src: "{{ android_cmdline_temp_dir }}/cmdline-tools/"
dest: "{{ android_sdk_location }}/cmdline-tools/latest"
remote_src: yes

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: openjdk17-jre-headless

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: jre17-openjdk-headless

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: openjdk@17

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: openjdk-17-jre-headless

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: openjdk17-jre

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: java-17-openjdk-headless

View file

@ -0,0 +1,6 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
openjdk_pkg: java-17-openjdk-headless

View file

@ -0,0 +1,8 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
android_cmdline_temp_dir: "/tmp/cmdlinetools"
android_sdk_location: "/tmp/androidsdk"
commandline_tools_link: https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip