From f26f3325ba625e57b41049fcf75f6d74e587d23e Mon Sep 17 00:00:00 2001 From: Sloane Hertel <19572925+s-hertel@users.noreply.github.com> Date: Thu, 15 Sep 2022 18:24:39 -0400 Subject: [PATCH] apt - fix module short-circuiting when a package is not installed and only_upgrade is True (#78790) --- .../78781-fix-apt-only_upgrade-behavior.yml | 4 +++- lib/ansible/modules/apt.py | 9 +++++++-- test/integration/targets/apt/tasks/repo.yml | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml b/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml index 65558d5ef4a..5b54bf89056 100644 --- a/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml +++ b/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml @@ -1,2 +1,4 @@ bugfixes: - - apt - fix module failure when a package is not installed and only_upgrade=True (https://github.com/ansible/ansible/issues/78762). +- >- + apt - Fix module failure when a package is not installed and only_upgrade=True. + Skip that package and check the remaining requested packages for upgrades. (https://github.com/ansible/ansible/issues/78762) diff --git a/lib/ansible/modules/apt.py b/lib/ansible/modules/apt.py index 6d0f4fcc3da..ac1a0f65b67 100644 --- a/lib/ansible/modules/apt.py +++ b/lib/ansible/modules/apt.py @@ -711,8 +711,13 @@ def install(m, pkgspec, cache, upgrade=False, default_release=None, package_names.append(name) installed, installed_version, version_installable, has_files = package_status(m, name, version_cmp, version, default_release, cache, state='install') - if (not installed_version and not version_installable) or (not installed and only_upgrade): - status = not installed and only_upgrade + if not installed and only_upgrade: + # only_upgrade upgrades packages that are already installed + # since this package is not installed, skip it + continue + + if not installed_version and not version_installable: + status = False data = dict(msg="no available installation candidate for %s" % package) return (status, data) diff --git a/test/integration/targets/apt/tasks/repo.yml b/test/integration/targets/apt/tasks/repo.yml index 40d30e2a013..d4cce78a1b0 100644 --- a/test/integration/targets/apt/tasks/repo.yml +++ b/test/integration/targets/apt/tasks/repo.yml @@ -54,7 +54,7 @@ # https://github.com/ansible/ansible/issues/30638 - block: - - name: Do nothing to install foo=1.0.1 since foo is not installed and only_upgrade is set + - name: Don't install foo=1.0.1 since foo is not installed and only_upgrade is set apt: name: foo=1.0.1 state: present @@ -73,24 +73,30 @@ name: foo=1.0.0 allow_unauthenticated: yes - - name: Upgrade foo to 1.0.1 + - name: Upgrade foo to 1.0.1 but don't upgrade foobar since it is not installed apt: - name: foo=1.0.1 + name: foobar=1.0.1,foo=1.0.1 state: present only_upgrade: yes allow_unauthenticated: yes register: apt_result - name: Check install with dpkg - shell: dpkg-query -l foo + shell: "dpkg-query -l {{ item }}" register: dpkg_result + ignore_errors: yes + loop: + - foobar + - foo - name: Check if install was successful assert: that: - "apt_result is success" - - "dpkg_result is success" - - "'1.0.1' in dpkg_result.stdout" + - "dpkg_result.results[0] is failure" + - "'1.0.1' not in dpkg_result.results[0].stdout" + - "dpkg_result.results[1] is success" + - "'1.0.1' in dpkg_result.results[1].stdout" always: - name: Clean up apt: