From 1d39bbefd9b8fcba7779f3c9b47673602ca2b6de Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Thu, 2 Mar 2023 07:15:28 +0100 Subject: [PATCH] [PR #6119/345a6930 backport][stable-6] opkg: fix bug when update_cache=true (#6124) opkg: fix bug when update_cache=true (#6119) * opkg: fix bug when update_cache=true * add changelog fragment (cherry picked from commit 345a69304adb56fd0fdd961583b03e2c3d7ecc30) Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> --- changelogs/fragments/6119-opkg-update.yaml | 2 + plugins/modules/opkg.py | 17 ++++---- tests/unit/plugins/modules/test_opkg.py | 48 ++++++++++++++++++++++ 3 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 changelogs/fragments/6119-opkg-update.yaml diff --git a/changelogs/fragments/6119-opkg-update.yaml b/changelogs/fragments/6119-opkg-update.yaml new file mode 100644 index 0000000000..b7450074d1 --- /dev/null +++ b/changelogs/fragments/6119-opkg-update.yaml @@ -0,0 +1,2 @@ +bugfixes: + - opkg - fixes bug when using ``update_cache=true`` (https://github.com/ansible-collections/community.general/issues/6004). diff --git a/plugins/modules/opkg.py b/plugins/modules/opkg.py index 360bf453b7..d2ac314d03 100644 --- a/plugins/modules/opkg.py +++ b/plugins/modules/opkg.py @@ -148,6 +148,11 @@ class Opkg(StateModuleHelper): ), ) + if self.vars.update_cache: + rc, dummy, dummy = self.runner("update_cache").run() + if rc != 0: + self.do_raise("could not update package db") + @staticmethod def split_name_and_version(package): """ Split the name and the version when using the NAME=VERSION syntax """ @@ -164,10 +169,6 @@ class Opkg(StateModuleHelper): return want_installed == has_package def state_present(self): - if self.vars.update_cache: - dummy, rc, dummy = self.runner("update_cache").run() - if rc != 0: - self.do_raise("could not update package db") with self.runner("state force package") as ctx: for package in self.vars.name: pkg_name, pkg_version = self.split_name_and_version(package) @@ -176,16 +177,14 @@ class Opkg(StateModuleHelper): if not self._package_in_desired_state(pkg_name, want_installed=True, version=pkg_version): self.do_raise("failed to install %s" % package) self.vars.install_c += 1 + if self.verbosity >= 4: + self.vars.run_info = ctx.run_info if self.vars.install_c > 0: self.vars.msg = "installed %s package(s)" % (self.vars.install_c) else: self.vars.msg = "package(s) already present" def state_absent(self): - if self.vars.update_cache: - dummy, rc, dummy = self.runner("update_cache").run() - if rc != 0: - self.do_raise("could not update package db") with self.runner("state force package") as ctx: for package in self.vars.name: package, dummy = self.split_name_and_version(package) @@ -194,6 +193,8 @@ class Opkg(StateModuleHelper): if not self._package_in_desired_state(package, want_installed=False): self.do_raise("failed to remove %s" % package) self.vars.remove_c += 1 + if self.verbosity >= 4: + self.vars.run_info = ctx.run_info if self.vars.remove_c > 0: self.vars.msg = "removed %s package(s)" % (self.vars.remove_c) else: diff --git a/tests/unit/plugins/modules/test_opkg.py b/tests/unit/plugins/modules/test_opkg.py index f11347facc..8e52368ff9 100644 --- a/tests/unit/plugins/modules/test_opkg.py +++ b/tests/unit/plugins/modules/test_opkg.py @@ -150,6 +150,54 @@ TEST_CASES = [ ), ], ), + ModuleTestCase( + id="install_vim_updatecache", + input={"name": "vim-fuller", "state": "present", "update_cache": True}, + output={ + "msg": "installed 1 package(s)" + }, + run_command_calls=[ + RunCmdCall( + command=["/testbin/opkg", "update"], + environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + rc=0, + out="", + err="", + ), + RunCmdCall( + command=["/testbin/opkg", "list-installed", "vim-fuller"], + environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + rc=0, + out="", + err="", + ), + RunCmdCall( + command=["/testbin/opkg", "install", "vim-fuller"], + environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + rc=0, + out=( + "Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.\n" + "Installing vim-fuller (9.0-1) to root...\n" + "Downloading https://downloads.openwrt.org/snapshots/packages/x86_64/packages/vim-fuller_9.0-1_x86_64.ipk\n" + "Installing terminfo (6.4-2) to root...\n" + "Downloading https://downloads.openwrt.org/snapshots/packages/x86_64/base/terminfo_6.4-2_x86_64.ipk\n" + "Installing libncurses6 (6.4-2) to root...\n" + "Downloading https://downloads.openwrt.org/snapshots/packages/x86_64/base/libncurses6_6.4-2_x86_64.ipk\n" + "Configuring terminfo.\n" + "Configuring libncurses6.\n" + "Configuring vim-fuller.\n" + ), + err="", + ), + RunCmdCall( + command=["/testbin/opkg", "list-installed", "vim-fuller"], + environ={'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': False}, + rc=0, + out="vim-fuller - 9.0-1 \n", # This output has the extra space at the end, to satisfy the behaviour of Yocto/OpenEmbedded's opkg + err="", + ), + ], + ), ] TEST_CASES_IDS = [item.id for item in TEST_CASES]