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-08-28 16:52:09 -05:00 committed by Toshio Kuratomi
commit db34d3923a
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" version_added: "2.7"
notes: 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. - 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: requirements:
- "python >= 2.6" - "python >= 2.6"
- python-dnf - python-dnf
@ -581,35 +585,6 @@ class DnfModule(YumDnf):
else: else:
return False 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): def _is_newer_version_installed(self, pkg_name):
candidate_pkg = self._packagename_dict(pkg_name) candidate_pkg = self._packagename_dict(pkg_name)
if not candidate_pkg: if not candidate_pkg:
@ -833,10 +808,10 @@ class DnfModule(YumDnf):
# Install groups. # Install groups.
for group in groups: for group in groups:
try: 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)) response['results'].append("Group {0} already installed.".format(group))
else: else:
self.base.group_install(group, dnf.const.GROUP_PACKAGE_TYPES)
response['results'].append("Group {0} installed.".format(group)) response['results'].append("Group {0} installed.".format(group))
except dnf.exceptions.DepsolveError as e: except dnf.exceptions.DepsolveError as e:
failure_response['msg'] = "Depsolve Error occured attempting to install group: {0}".format(group) failure_response['msg'] = "Depsolve Error occured attempting to install group: {0}".format(group)
@ -884,8 +859,11 @@ class DnfModule(YumDnf):
except dnf.exceptions.CompsError: except dnf.exceptions.CompsError:
if not self.update_only: if not self.update_only:
# If not already installed, try to install. # 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)
response['results'].append("Group {0} installed.".format(group)) 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: except dnf.exceptions.Error as e:
failure_response['failures'].append(" ".join((group, to_native(e)))) failure_response['failures'].append(" ".join((group, to_native(e))))
@ -931,24 +909,14 @@ class DnfModule(YumDnf):
except dnf.exceptions.CompsError: except dnf.exceptions.CompsError:
# Group is already uninstalled. # Group is already uninstalled.
pass pass
except AttributeError:
# This is necessary until the upstream dnf API bug is fixed where installing # Group either isn't installed or wasn't marked installed at install time
# a group via the dnf API doesn't actually mark the group as installed # because of DNF bug
# https://bugzilla.redhat.com/show_bug.cgi?id=1620324 #
if self._is_group_installed(group): # This is necessary until the upstream dnf API bug is fixed where installing
dnf_group = self.base.comps.group_by_pattern(group) # a group via the dnf API doesn't actually mark the group as installed
try: # https://bugzilla.redhat.com/show_bug.cgi?id=1620324
if dnf_group: pass
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), ],
)
for environment in environments: for environment in environments:
try: try:

View file

@ -68,4 +68,4 @@
# so don't run the yum group remove tests there # so don't run the yum group remove tests there
- include: 'yum_group_remove.yml' - include: 'yum_group_remove.yml'
when: 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)