Improve dnf group output for clarity

Add note about group removal bug upstream dnf

Signed-off-by: Adam Miller <admiller@redhat.com>
This commit is contained in:
Adam Miller 2018-09-04 23:54:07 -05:00 committed by Toshio Kuratomi
parent 576700a8a1
commit e857157072
3 changed files with 23 additions and 52 deletions

View file

@ -0,0 +1,3 @@
---
minor_changes:
- "dnf - group removal does not work if group was installed with Ansible because of dnf upstream bug https://bugzilla.redhat.com/show_bug.cgi?id=1620324"

View file

@ -186,6 +186,10 @@ options:
version_added: "2.7"
notes:
- When used with a `loop:` each package will be processed individually, it is much more efficient to pass the list directly to the `name` option.
- Group removal doesn't work if the group was installed with Ansible because
upstream dnf's API doesn't properly mark groups as installed, therefore upon
removal the module is unable to detect that the group is installed
(https://bugzilla.redhat.com/show_bug.cgi?id=1620324)
requirements:
- "python >= 2.6"
- python-dnf
@ -581,35 +585,6 @@ class DnfModule(YumDnf):
else:
return False
def _is_group_installed(self, group):
"""
Check if a group is installed (the sum of the package set that makes up a group)
This is necessary until the upstream dnf API bug is fixed where installing
a group via the dnf API doesn't actually mark the group as installed
https://bugzilla.redhat.com/show_bug.cgi?id=1620324
"""
pkg_set = []
dnf_group = self.base.comps.group_by_pattern(group)
try:
if dnf_group:
for pkg_type in dnf.const.GROUP_PACKAGE_TYPES:
for pkg in getattr(dnf_group, '{0}_packages'.format(pkg_type)):
pkg_set.append(pkg.name)
except AttributeError as e:
self.module.fail_json(
msg="Error attempting to determine package group installed status: {0}".format(group),
results=[],
rc=1,
failures=[to_native(e), ],
)
for pkg in pkg_set:
if not self._is_installed(pkg):
return False
return True
def _is_newer_version_installed(self, pkg_name):
candidate_pkg = self._packagename_dict(pkg_name)
if not candidate_pkg:
@ -833,10 +808,10 @@ class DnfModule(YumDnf):
# Install groups.
for group in groups:
try:
if self._is_group_installed(group):
group_pkg_count_installed = self.base.group_install(group, dnf.const.GROUP_PACKAGE_TYPES)
if group_pkg_count_installed == 0:
response['results'].append("Group {0} already installed.".format(group))
else:
self.base.group_install(group, dnf.const.GROUP_PACKAGE_TYPES)
response['results'].append("Group {0} installed.".format(group))
except dnf.exceptions.DepsolveError as e:
failure_response['msg'] = "Depsolve Error occured attempting to install group: {0}".format(group)
@ -884,7 +859,10 @@ class DnfModule(YumDnf):
except dnf.exceptions.CompsError:
if not self.update_only:
# If not already installed, try to install.
self.base.group_install(group, dnf.const.GROUP_PACKAGE_TYPES)
group_pkg_count_installed = self.base.group_install(group, dnf.const.GROUP_PACKAGE_TYPES)
if group_pkg_count_installed == 0:
response['results'].append("Group {0} already installed.".format(group))
else:
response['results'].append("Group {0} installed.".format(group))
except dnf.exceptions.Error as e:
failure_response['failures'].append(" ".join((group, to_native(e))))
@ -931,24 +909,14 @@ class DnfModule(YumDnf):
except dnf.exceptions.CompsError:
# Group is already uninstalled.
pass
except AttributeError:
# Group either isn't installed or wasn't marked installed at install time
# because of DNF bug
#
# This is necessary until the upstream dnf API bug is fixed where installing
# a group via the dnf API doesn't actually mark the group as installed
# https://bugzilla.redhat.com/show_bug.cgi?id=1620324
if self._is_group_installed(group):
dnf_group = self.base.comps.group_by_pattern(group)
try:
if dnf_group:
for pkg_type in dnf.const.GROUP_PACKAGE_TYPES:
for pkg_spec in getattr(dnf_group, '{0}_packages'.format(pkg_type)):
self.base.remove(pkg_spec.name)
except AttributeError as e:
self.module.fail_json(
msg="Error attempting to determine package group installed status: {0}".format(group),
results=[],
rc=1,
failures=[to_native(e), ],
)
pass
for environment in environments:
try:

View file

@ -68,4 +68,4 @@
# so don't run the yum group remove tests there
- include: 'yum_group_remove.yml'
when:
- (ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and ansible_distribution_major_version|int > 6) or ansible_distribution in ['Fedora']
- (ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and ansible_distribution_major_version|int > 6)