[stable-2.18] dnf5: fix is_installed check (#84275) (#84333)

* dnf5: fix is_installed check (#84275)

Fixes #84259

(cherry picked from commit a27a7a27d1)

* dnf5 - consolidate package resolving settings (#84335)

Fixes #84334

(cherry picked from commit c99493eb3f)
pull/84390/head
Martin Krizek 1 year ago committed by GitHub
parent 8f2cc9d916
commit b88f29ec6d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,2 @@
bugfixes:
- "dnf5 - fix installing a package using ``state=latest`` when a binary of the same name as the package is already installed (https://github.com/ansible/ansible/issues/84259)"

@ -0,0 +1,2 @@
bugfixes:
- dnf5 - matching on a binary can be achieved only by specifying a full path (https://github.com/ansible/ansible/issues/84334)

@ -358,6 +358,21 @@ libdnf5 = None
def is_installed(base, spec): def is_installed(base, spec):
settings = libdnf5.base.ResolveSpecSettings() settings = libdnf5.base.ResolveSpecSettings()
try:
settings.set_group_with_name(True)
# Disable checking whether SPEC is a binary -> `/usr/(s)bin/<SPEC>`,
# this prevents scenarios like the following:
# * the `sssd-common` package is installed and provides `/usr/sbin/sssd` binary
# * the `sssd` package is NOT installed
# * due to `set_with_binaries(True)` being default `is_installed(base, "sssd")` would "unexpectedly" return True
# If users wish to target the `sssd` binary they can by specifying the full path `name=/usr/sbin/sssd` explicitly
# due to settings.set_with_filenames(True) being default.
settings.set_with_binaries(False)
except AttributeError:
# dnf5 < 5.2.0.0
settings.group_with_name = True
settings.with_binaries = False
installed_query = libdnf5.rpm.PackageQuery(base) installed_query = libdnf5.rpm.PackageQuery(base)
installed_query.filter_installed() installed_query.filter_installed()
match, nevra = installed_query.resolve_pkg_spec(spec, settings, True) match, nevra = installed_query.resolve_pkg_spec(spec, settings, True)
@ -646,9 +661,12 @@ class Dnf5Module(YumDnf):
settings = libdnf5.base.GoalJobSettings() settings = libdnf5.base.GoalJobSettings()
try: try:
settings.set_group_with_name(True) settings.set_group_with_name(True)
settings.set_with_binaries(False)
except AttributeError: except AttributeError:
# dnf5 < 5.2.0.0 # dnf5 < 5.2.0.0
settings.group_with_name = True settings.group_with_name = True
settings.with_binaries = False
if self.bugfix or self.security: if self.bugfix or self.security:
advisory_query = libdnf5.advisory.AdvisoryQuery(base) advisory_query = libdnf5.advisory.AdvisoryQuery(base)
types = [] types = []

@ -517,3 +517,73 @@
dnf: dnf:
name: provides_foo* name: provides_foo*
state: absent state: absent
# https://github.com/ansible/ansible/issues/84259
- name: test installing a package named `package-name` while a package providing `/usr/sbin/package-name` is installed
block:
- dnf:
name: package-name
state: absent
- dnf:
name: provides-binary
state: present
- dnf:
name: package-name
state: latest
register: dnf_result
- assert:
that:
- dnf_result is changed
always:
- name: Clean up
dnf:
name:
- provides-binary
- package-name
state: absent
- name: test installing a package that provides a binary by specifying the binary name
block:
- dnf:
name: provides-binary
state: absent
- dnf:
name: /usr/sbin/package-name
state: present
register: dnf_result
- assert:
that:
- dnf_result is changed
always:
- name: Clean up
dnf:
name: provides-binary
state: absent
# https://github.com/ansible/ansible/issues/84334
- name: test that a binary is not matched by its base name
block:
- dnf:
name: provides-binary
state: present
- dnf:
name: package-name
state: absent
register: dnf_result
- assert:
that:
- dnf_result is not changed
always:
- name: Clean up
dnf:
name:
- provides-binary
- package-name
state: absent

@ -15,8 +15,10 @@ try:
from rpmfluff.make import make_gif from rpmfluff.make import make_gif
from rpmfluff.sourcefile import GeneratedSourceFile from rpmfluff.sourcefile import GeneratedSourceFile
from rpmfluff.rpmbuild import SimpleRpmBuild from rpmfluff.rpmbuild import SimpleRpmBuild
from rpmfluff.utils import expectedArch
from rpmfluff.yumrepobuild import YumRepoBuild from rpmfluff.yumrepobuild import YumRepoBuild
except ImportError: except ImportError:
expectedArch = None # define here to avoid NameError as it is used on top level in SPECS
HAS_RPMFLUFF = False HAS_RPMFLUFF = False
@ -30,6 +32,7 @@ class RPM:
recommends: list[str] | None = None recommends: list[str] | None = None
requires: list[str] | None = None requires: list[str] | None = None
file: str | None = None file: str | None = None
binary: str | None = None
SPECS = [ SPECS = [
@ -58,6 +61,8 @@ SPECS = [
RPM(name='broken-b', version='1.0', requires=['broken-a = 1.2.3-1']), RPM(name='broken-b', version='1.0', requires=['broken-a = 1.2.3-1']),
RPM(name='broken-c', version='1.0', requires=['broken-c = 1.2.4-1']), RPM(name='broken-c', version='1.0', requires=['broken-c = 1.2.4-1']),
RPM(name='broken-d', version='1.0', requires=['broken-a']), RPM(name='broken-d', version='1.0', requires=['broken-a']),
RPM(name='provides-binary', version='1.0', arch=[expectedArch], binary='/usr/sbin/package-name'),
RPM(name='package-name', version='1.0'),
] ]
@ -81,10 +86,13 @@ def create_repo():
) )
) )
if spec.binary:
pkg.add_simple_compilation(installPath=spec.binary)
pkgs.append(pkg) pkgs.append(pkg)
repo = YumRepoBuild(pkgs) repo = YumRepoBuild(pkgs)
repo.make('noarch', 'i686', 'x86_64') repo.make('noarch', 'i686', 'x86_64', expectedArch)
for pkg in pkgs: for pkg in pkgs:
pkg.clean() pkg.clean()

Loading…
Cancel
Save