summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSloane Hertel <19572925+s-hertel@users.noreply.github.com>2022-09-29 19:55:51 -0400
committerGitHub <noreply@github.com>2022-09-29 16:55:51 -0700
commit45abd5b685104d4fa0d5a6501456b5a5372dfeef (patch)
tree7fdf7d6a5b98ef5f38669e122205cbebaaa50d37
parent551ddebeab451c1f158e4ef8b656d60ff57689be (diff)
downloadansible-45abd5b685104d4fa0d5a6501456b5a5372dfeef.tar.gz
[2.13] apt - fix failure when package is not installed and only_upgrade=True (#78791)
* apt - fix failure when package is not installed and only_upgrade=True (#78781) * apt - fix module failure when package is not installed and only_upgrade is True * changelog (cherry picked from commit 4b45b4b09d9257006f7b23237293c8c1a04521d8) * apt - fix module short-circuiting when a package is not installed and only_upgrade is True (cherry picked from commit 14f46845f9e74aac26aa54004c88a414926afc6a)
-rw-r--r--changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml4
-rw-r--r--lib/ansible/modules/apt.py7
-rw-r--r--test/integration/targets/apt/tasks/repo.yml20
3 files changed, 23 insertions, 8 deletions
diff --git a/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml b/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml
new file mode 100644
index 0000000000..5b54bf8905
--- /dev/null
+++ b/changelogs/fragments/78781-fix-apt-only_upgrade-behavior.yml
@@ -0,0 +1,4 @@
+bugfixes:
+- >-
+ 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 b254fb031e..08b3e14729 100644
--- a/lib/ansible/modules/apt.py
+++ b/lib/ansible/modules/apt.py
@@ -711,7 +711,12 @@ 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):
+ 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 e4e39aa357..d4cce78a1b 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: Fail 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
@@ -67,30 +67,36 @@
assert:
that:
- "apt_result is not changed"
- - "apt_result is failed"
+ - "apt_result is success"
- apt:
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: