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"