diff --git a/plugins/module_utils/sdkmanager.py b/plugins/module_utils/sdkmanager.py index 04d35f044e..a3dc081878 100644 --- a/plugins/module_utils/sdkmanager.py +++ b/plugins/module_utils/sdkmanager.py @@ -1,3 +1,5 @@ +import re + from ansible_collections.community.general.plugins.module_utils import cmd_runner_fmt from ansible_collections.community.general.plugins.module_utils.cmd_runner import CmdRunner @@ -19,3 +21,63 @@ def sdkmanager_runner(module, **kwargs): ), **kwargs ) + + +class Package: + def __init__(self, name, version, description=''): + self.name = name + self.version = version + self.description = description + + def __str__(self): + return "%s;%s (%s)" % (self.name, self.version, self.description) + + def __eq__(self, other): + if not isinstance(other, Package): + return False + + return self.name == other.name and self.version == other.version and self.description == other.description + + def get_formatted(self): + if self.version is None: + return self.name + else: + return "%s;%s" % (self.name, self.version) + + +class AndroidSdkManager(object): + _RE_INSTALLED_PACKAGES_HEADER = re.compile(r'^\s+Path\s+|\s+Version\s+|\s+Description\s+|\s+Location\s+$') + _RE_INSTALLED_PACKAGES = ( + re.compile(r'^\s+(?P\S+)\s+\|\s+(?P\S+)\s+\|\s(?P.+)\s\|\s+(\S+)$') + ) + + def __init__(self, runner): + self.runner = runner + + def get_installed_packages(self): + with self.runner('installed') as ctx: + rc, stdout, stderr = ctx.run() + + packages = [] + data = stdout.split('\n') + + lines_count = len(data) + + i = 0 + + while i < lines_count: + line = data[i] + if self._RE_INSTALLED_PACKAGES_HEADER.match(line): + i += 1 + else: + p = self._RE_INSTALLED_PACKAGES.search(line) + if p: + package = Package(p.group('name'), p.group('version'), p.group('description')) + packages.append(package) + i += 1 + return packages + + def install_packages(self, packages): + install_command_arg = ''.join(x.get_formatted() for x in packages) + with self.runner('state name') as ctx: + ctx.run(name=install_command_arg) diff --git a/plugins/modules/android_sdk.py b/plugins/modules/android_sdk.py index 5456695f2e..6c7c0f3b11 100644 --- a/plugins/modules/android_sdk.py +++ b/plugins/modules/android_sdk.py @@ -1,12 +1,9 @@ -import re - from ansible_collections.community.general.plugins.module_utils.mh.module_helper import StateModuleHelper -from ansible_collections.community.general.plugins.module_utils.sdkmanager import sdkmanager_runner +from ansible_collections.community.general.plugins.module_utils.sdkmanager import sdkmanager_runner, Package, \ + AndroidSdkManager class AndroidSdk(StateModuleHelper): - _RE_INSTALLED_PACKAGES_HEADER = re.compile(r'^\s+Path\s+|\s+Version\s+|\s+Description\s+|\s+Location\s+$') - _RE_INSTALLED_PACKAGES = re.compile(r'^\s+(\S+)\s+\|\s+(\S+)\s+\|\s(.+)\s\|\s+(\S+)$') module = dict( argument_spec=dict( state=dict(type='str', default='present', choices=['present', 'absent', 'latest']), @@ -17,54 +14,38 @@ class AndroidSdk(StateModuleHelper): use_old_vardict = False output_params = ('installed') - def _get_formatted_packages(self): + def __init_module__(self): + self.sdkmanager = AndroidSdkManager(sdkmanager_runner(self.module)) + + def _parse_packages(self): arg_pkgs = self.vars.package packages = [] for arg_pkg in arg_pkgs: pkg, version = package_split(arg_pkg) - fmt_pkg = format_cmdline_package(pkg, version) - packages.append(fmt_pkg) + package = Package(pkg, version) + packages.append(package) return packages - def _get_installed_packages(self): - with self.sdkmanager('installed') as ctx: - rc, stdout, stderr = ctx.run() - - packages = [] - data = stdout.split('\n') - - lines_count = len(data) - - i = 0 - - while i < lines_count: - line = data[i] - if self._RE_INSTALLED_PACKAGES_HEADER.match(line): - i += 1 - else: - p = self._RE_INSTALLED_PACKAGES.search(line) - if p: - name = p.group(1) - version = p.group(2) - description = p.group(3) - packages.append((name, version, description)) - i += 1 - return packages - def __state_fallback__(self): - packages = self._get_formatted_packages() + packages = self._parse_packages() + installed = self.sdkmanager.get_installed_packages() + pending_installation = [] + for package in packages: + for existing in installed: + if existing.name == package.name: + if existing.version == package.version: + pass#do nothing, package exists + # else: + # package exists, but needs to be updated/downgraded + else: + pending_installation.append(package) - installed = self._get_installed_packages() self.vars.installed = installed - with self.sdkmanager('state name') as ctx: - ctx.run(name=packages) def update_packages(self): - with self.sdkmanager('update') as ctx: - ctx.run() - - def __init_module__(self): - self.sdkmanager = sdkmanager_runner(self.module) + pass + # with self.sdkmanager('update') as ctx: + # ctx.run() def __run__(self): super().__run__() @@ -73,13 +54,6 @@ class AndroidSdk(StateModuleHelper): self.update_packages() -def format_cmdline_package(package, version): - if version is None: - return package - else: - return "%s;%s" % (package, version) - - def package_split(package): parts = package.split('=', maxsplit=1) if len(parts) > 1: