mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-22 21:00:22 -07:00
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:
parent
eb882e4b01
commit
db34d3923a
3 changed files with 23 additions and 52 deletions
3
changelogs/fragments/dnf-group-removal.yaml
Normal file
3
changelogs/fragments/dnf-group-removal.yaml
Normal 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"
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue