apt: include arch in check for installed packages on multi-arch systems (#24846)

* apt: include arch in check for installed packages on multi-arch systems

Thanks: Stefan Löwen <stefan.loewen@gmail.com>

Fixes: #24673

* add an integration test for apt's multi-arch handling
This commit is contained in:
Evgeni Golov 2017-05-30 22:09:43 +02:00 committed by Brian Coca
parent 758cfeb73e
commit 1f78715848
4 changed files with 42 additions and 1 deletions

View file

@ -571,8 +571,13 @@ def install_deb(m, debs, cache, force, install_recommends, allow_unauthenticated
pkg = apt.debfile.DebPackage(deb_file)
pkg_name = get_field_of_deb(m, deb_file, "Package")
pkg_version = get_field_of_deb(m, deb_file, "Version")
if len(apt_pkg.get_architectures()) > 1:
pkg_arch = get_field_of_deb(m, deb_file, "Architecture")
pkg_key = "%s:%s" % (pkg_name, pkg_arch)
else:
pkg_key = pkg_name
try:
installed_pkg = apt.Cache()[pkg_name]
installed_pkg = apt.Cache()[pkg_key]
installed_version = installed_pkg.installed.version
if package_version_compare(pkg_version, installed_version) == 0:
# Does not need to down-/upgrade, move on to next package

View file

@ -0,0 +1 @@
apt_foreign_arch: i386

View file

@ -0,0 +1,32 @@
# verify that apt is handling multi-arch systems properly
- name: add architecture {{ apt_foreign_arch }}
command: dpkg --add-architecture {{ apt_foreign_arch }}
- name: install hello:{{ apt_foreign_arch }} with apt
apt: pkg=hello:{{ apt_foreign_arch }} state=present update_cache=yes
- name: uninstall hello:{{ apt_foreign_arch }} with apt
apt: pkg=hello:{{ apt_foreign_arch }} state=absent purge=yes
- name: install deb file
apt: deb="/var/cache/apt/archives/hello_{{ hello_version.stdout }}_{{ apt_foreign_arch }}.deb"
register: apt_multi_initial
- name: install deb file again
apt: deb="/var/cache/apt/archives/hello_{{ hello_version.stdout }}_{{ apt_foreign_arch }}.deb"
register: apt_multi_secondary
- name: verify installation of hello:{{ apt_foreign_arch }}
assert:
that:
- "apt_multi_initial.changed"
- "not apt_multi_secondary.changed"
- name: remove all {{ apt_foreign_arch }} packages
apt:
name: "*:{{ apt_foreign_arch }}"
state: absent
purge: yes
- name: remove {{ apt_foreign_arch }} architecture
command: dpkg --remove-architecture {{ apt_foreign_arch }}

View file

@ -18,5 +18,8 @@
- include: 'apt.yml'
when: ansible_distribution in ('Ubuntu', 'Debian')
- include: 'apt-multiarch.yml'
when: ansible_distribution in ('Ubuntu', 'Debian') and ansible_userspace_architecture != apt_foreign_arch
- include: 'apt-builddep.yml'
when: ansible_distribution in ('Ubuntu', 'Debian')