From f27d5e7a42a5ab0ce0f493cdbb4ca5044e4454a0 Mon Sep 17 00:00:00 2001 From: Alexei Znamensky <103110+russoz@users.noreply.github.com> Date: Thu, 23 Jan 2025 08:04:38 +1300 Subject: [PATCH] snap: add RV version (#9598) * snap: add RV version * add chglog frag * fix typo * fix docs * add missing import * fix sanity * more fixes * Update plugins/modules/snap.py Co-authored-by: Felix Fontein * Update plugins/modules/snap_alias.py Co-authored-by: Felix Fontein --------- Co-authored-by: Felix Fontein --- changelogs/fragments/9598-snap-version.yml | 3 ++ plugins/module_utils/snap.py | 7 ++++ plugins/modules/snap.py | 8 ++++- plugins/modules/snap_alias.py | 8 ++++- tests/unit/plugins/modules/test_snap.py | 42 +++++++++++++++++----- 5 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 changelogs/fragments/9598-snap-version.yml diff --git a/changelogs/fragments/9598-snap-version.yml b/changelogs/fragments/9598-snap-version.yml new file mode 100644 index 0000000000..d6b5ebb67c --- /dev/null +++ b/changelogs/fragments/9598-snap-version.yml @@ -0,0 +1,3 @@ +minor_changes: + - snap - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). + - snap_alias - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). diff --git a/plugins/module_utils/snap.py b/plugins/module_utils/snap.py index 253269b9a9..e55a3a13a5 100644 --- a/plugins/module_utils/snap.py +++ b/plugins/module_utils/snap.py @@ -41,8 +41,15 @@ def snap_runner(module, **kwargs): options=cmd_runner_fmt.as_list(), info=cmd_runner_fmt.as_fixed("info"), dangerous=cmd_runner_fmt.as_bool("--dangerous"), + version=cmd_runner_fmt.as_fixed("version"), ), check_rc=False, **kwargs ) return runner + + +def get_version(runner): + with runner("version") as ctx: + rc, out, err = ctx.run() + return dict(x.split() for x in out.splitlines() if len(x.split()) == 2) diff --git a/plugins/modules/snap.py b/plugins/modules/snap.py index 3cb34a1548..29fd08394f 100644 --- a/plugins/modules/snap.py +++ b/plugins/modules/snap.py @@ -167,6 +167,11 @@ options_changed: type: list returned: When any options have been changed/set version_added: 4.4.0 +version: + description: Versions of snap components as reported by C(snap version). + type: dict + returned: always + version_added: 10.3.0 """ import re @@ -176,7 +181,7 @@ import numbers from ansible.module_utils.common.text.converters import to_native from ansible_collections.community.general.plugins.module_utils.module_helper import StateModuleHelper -from ansible_collections.community.general.plugins.module_utils.snap import snap_runner +from ansible_collections.community.general.plugins.module_utils.snap import snap_runner, get_version class Snap(StateModuleHelper): @@ -210,6 +215,7 @@ class Snap(StateModuleHelper): def __init_module__(self): self.runner = snap_runner(self.module) + self.vars.version = get_version(self.runner) # if state=present there might be file names passed in 'name', in # which case they must be converted to their actual snap names, which # is done using the names_from_snaps() method calling 'snap info'. diff --git a/plugins/modules/snap_alias.py b/plugins/modules/snap_alias.py index 81a968730d..b7244ed74d 100644 --- a/plugins/modules/snap_alias.py +++ b/plugins/modules/snap_alias.py @@ -80,13 +80,18 @@ snap_aliases: type: list elements: str returned: always +version: + description: Versions of snap components as reported by C(snap version). + type: dict + returned: always + version_added: 10.3.0 """ import re from ansible_collections.community.general.plugins.module_utils.module_helper import StateModuleHelper -from ansible_collections.community.general.plugins.module_utils.snap import snap_runner +from ansible_collections.community.general.plugins.module_utils.snap import snap_runner, get_version class SnapAlias(StateModuleHelper): @@ -112,6 +117,7 @@ class SnapAlias(StateModuleHelper): def __init_module__(self): self.runner = snap_runner(self.module) + self.vars.version = get_version(self.runner) self.vars.set("snap_aliases", self._aliases(), change=True, diff=True) def __quit_module__(self): diff --git a/tests/unit/plugins/modules/test_snap.py b/tests/unit/plugins/modules/test_snap.py index 5ed366d724..97e3e8700e 100644 --- a/tests/unit/plugins/modules/test_snap.py +++ b/tests/unit/plugins/modules/test_snap.py @@ -376,6 +376,16 @@ issue_6803_kubectl_out = ( "\r\u001b[0m\u001b[?25h\u001b[Kkubectl (1.27/stable) v1.27.2 from Canonical** installed\n" ) + +default_env = {'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False} +default_version_out = """\ +snap 2.66.1+24.04 +snapd 2.66.1+24.04 +series 16 +ubuntu 24.04 +kernel 6.8.0-49-generic +""" + TEST_CASES = [ dict( id="simple case", @@ -384,30 +394,37 @@ TEST_CASES = [ flags={}, mocks=dict( run_command=[ + dict( + command=['/testbin/snap', 'version'], + environ=default_env, + rc=0, + out=default_version_out, + err="", + ), dict( command=['/testbin/snap', 'info', 'hello-world'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out='name: hello-world\n', err="", ), dict( command=['/testbin/snap', 'list'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out="", err="", ), dict( command=['/testbin/snap', 'install', 'hello-world'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out="hello-world (12345/stable) v12345 from Canonical** installed\n", err="", ), dict( command=['/testbin/snap', 'list'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out=( "Name Version Rev Tracking Publisher Notes" @@ -428,37 +445,44 @@ TEST_CASES = [ flags={}, mocks=dict( run_command=[ + dict( + command=['/testbin/snap', 'version'], + environ=default_env, + rc=0, + out=default_version_out, + err="", + ), dict( command=['/testbin/snap', 'info', 'microk8s', 'kubectl'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out='name: microk8s\n---\nname: kubectl\n', err="", ), dict( command=['/testbin/snap', 'list'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out=issue_6803_status_out, err="", ), dict( command=['/testbin/snap', 'install', '--classic', 'microk8s'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out=issue_6803_microk8s_out, err="", ), dict( command=['/testbin/snap', 'install', '--classic', 'kubectl'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out=issue_6803_kubectl_out, err="", ), dict( command=['/testbin/snap', 'list'], - environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + environ=default_env, rc=0, out=( "Name Version Rev Tracking Publisher Notes"