dnf5 - handle all specific libdnf5 exceptions (#85175)

Fixes #84634

(cherry picked from commit 99a3346de6)
pull/85255/head
Martin Krizek 6 months ago committed by Matt Davis
parent 6f7215ca36
commit 2adc8ae1cd

@ -0,0 +1,2 @@
bugfixes:
- "dnf5 - handle all libdnf5 specific exceptions (https://github.com/ansible/ansible/issues/84634)"

@ -365,7 +365,7 @@ from ansible.module_utils.yumdnf import YumDnf, yumdnf_argument_spec
libdnf5 = None libdnf5 = None
# Through dnf5-5.2.12 all exceptions raised through swig became RuntimeError # Through dnf5-5.2.12 all exceptions raised through swig became RuntimeError
LIBDNF5_ERROR = RuntimeError LIBDNF5_ERRORS = RuntimeError
def is_installed(base, spec): def is_installed(base, spec):
@ -423,7 +423,9 @@ def is_newer_version_installed(base, spec):
try: try:
spec_nevra = next(iter(libdnf5.rpm.Nevra.parse(spec))) spec_nevra = next(iter(libdnf5.rpm.Nevra.parse(spec)))
except (LIBDNF5_ERROR, StopIteration): except LIBDNF5_ERRORS:
return False
except StopIteration:
return False return False
spec_version = spec_nevra.get_version() spec_version = spec_nevra.get_version()
@ -517,7 +519,7 @@ class Dnf5Module(YumDnf):
os.environ["LANGUAGE"] = os.environ["LANG"] = locale os.environ["LANGUAGE"] = os.environ["LANG"] = locale
global libdnf5 global libdnf5
global LIBDNF5_ERROR global LIBDNF5_ERRORS
has_dnf = True has_dnf = True
try: try:
import libdnf5 # type: ignore[import] import libdnf5 # type: ignore[import]
@ -526,7 +528,7 @@ class Dnf5Module(YumDnf):
try: try:
import libdnf5.exception # type: ignore[import-not-found] import libdnf5.exception # type: ignore[import-not-found]
LIBDNF5_ERROR = libdnf5.exception.Error LIBDNF5_ERRORS = (libdnf5.exception.Error, libdnf5.exception.NonLibdnf5Exception)
except (ImportError, AttributeError): except (ImportError, AttributeError):
pass pass
@ -581,15 +583,7 @@ class Dnf5Module(YumDnf):
if self.conf_file: if self.conf_file:
conf.config_file_path = self.conf_file conf.config_file_path = self.conf_file
try: base.load_config()
base.load_config()
except LIBDNF5_ERROR as e:
self.module.fail_json(
msg=str(e),
conf_file=self.conf_file,
failures=[],
rc=1,
)
if self.releasever is not None: if self.releasever is not None:
variables = base.get_vars() variables = base.get_vars()
@ -745,19 +739,13 @@ class Dnf5Module(YumDnf):
goal.add_install(spec, settings) goal.add_install(spec, settings)
elif self.state in {"absent", "removed"}: elif self.state in {"absent", "removed"}:
for spec in self.names: for spec in self.names:
try: goal.add_remove(spec, settings)
goal.add_remove(spec, settings)
except LIBDNF5_ERROR as e:
self.module.fail_json(msg=str(e), failures=[], rc=1)
if self.autoremove: if self.autoremove:
for pkg in get_unneeded_pkgs(base): for pkg in get_unneeded_pkgs(base):
goal.add_rpm_remove(pkg, settings) goal.add_rpm_remove(pkg, settings)
goal.set_allow_erasing(self.allowerasing) goal.set_allow_erasing(self.allowerasing)
try: transaction = goal.resolve()
transaction = goal.resolve()
except LIBDNF5_ERROR as e:
self.module.fail_json(msg=str(e), failures=[], rc=1)
if transaction.get_problems(): if transaction.get_problems():
failures = [] failures = []
@ -833,7 +821,11 @@ def main():
auto_install_module_deps=dict(type="bool", default=True), auto_install_module_deps=dict(type="bool", default=True),
) )
) )
Dnf5Module(AnsibleModule(**yumdnf_argument_spec)).run() module = AnsibleModule(**yumdnf_argument_spec)
try:
Dnf5Module(module).run()
except LIBDNF5_ERRORS as e:
module.fail_json(msg=str(e), failures=[], rc=1)
if __name__ == "__main__": if __name__ == "__main__":

@ -629,3 +629,30 @@
loop: loop:
- provides-package - provides-package
- provided-package - provided-package
- name: Test failures occured during loading repositories are properly handled
vars:
repo_name: test-non-existing-gpgkey-file
block:
- yum_repository:
name: "{{ repo_name }}"
baseurl: "file://{{ repodir }}"
description: "{{ repo_name }}"
repo_gpgcheck: true
skip_if_unavailable: false
- dnf:
name: dinginessentail
enablerepo: "{{ repo_name }}"
disablerepo: "*"
ignore_errors: true
register: r
- assert:
that:
- r is failed
- r.msg is contains("Couldn't open file")
always:
- file:
name: /etc/yum.repos.d/{{ repo_name }}.repo
state: absent

Loading…
Cancel
Save