summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Miller <admiller@redhat.com>2018-11-05 15:00:42 -0600
committerToshio Kuratomi <a.badger@gmail.com>2018-11-05 15:15:43 -0800
commit3a14fe35e9233c94e69b6d3ef01e452a4464f479 (patch)
tree0df413064b07b3f987f5e25254e38f92f7df621e
parentbab062d6391322828cfd7fd82a4310f5d567af2a (diff)
downloadansible-3a14fe35e9233c94e69b6d3ef01e452a4464f479.tar.gz
Correct yum and dnf autoremove behavior (#47902)
* Correct yum and dnf autoremove behavior Sanity check args passed to autoremove Fixes #47184 Signed-off-by: Adam Miller <admiller@redhat.com> * fix docs Signed-off-by: Adam Miller <admiller@redhat.com> (cherry picked from commit 1c777976c5134f310a97609da12776fc08551271)
-rw-r--r--changelogs/fragments/yumdnf-autoremove.yaml3
-rw-r--r--lib/ansible/module_utils/yumdnf.py15
-rw-r--r--lib/ansible/modules/packaging/os/dnf.py8
-rw-r--r--lib/ansible/modules/packaging/os/yum.py3
4 files changed, 21 insertions, 8 deletions
diff --git a/changelogs/fragments/yumdnf-autoremove.yaml b/changelogs/fragments/yumdnf-autoremove.yaml
new file mode 100644
index 0000000000..264356b688
--- /dev/null
+++ b/changelogs/fragments/yumdnf-autoremove.yaml
@@ -0,0 +1,3 @@
+---
+minor_changes:
+ - "fix yum and dnf autoremove input sanitization to properly warn user if invalid options passed and update documentation to match"
diff --git a/lib/ansible/module_utils/yumdnf.py b/lib/ansible/module_utils/yumdnf.py
index ba3037ebcc..734f710c58 100644
--- a/lib/ansible/module_utils/yumdnf.py
+++ b/lib/ansible/module_utils/yumdnf.py
@@ -38,7 +38,7 @@ yumdnf_argument_spec = dict(
security=dict(type='bool', default=False),
skip_broken=dict(type='bool', default=False),
# removed==absent, installed==present, these are accepted as aliases
- state=dict(type='str', default='present', choices=['absent', 'installed', 'latest', 'present', 'removed']),
+ state=dict(type='str', default=None, choices=['absent', 'installed', 'latest', 'present', 'removed']),
update_cache=dict(type='bool', default=False, aliases=['expire-cache']),
update_only=dict(required=False, default="no", type='bool'),
validate_certs=dict(type='bool', default=True),
@@ -101,6 +101,19 @@ class YumDnf(with_metaclass(ABCMeta, object)):
'string of packages or a list of packages.'
)
+ # Sanity checking for autoremove
+ if self.state is None:
+ if self.autoremove:
+ self.state = "absent"
+ else:
+ self.state = "present"
+
+ if self.autoremove and (self.state != "absent"):
+ self.module.fail_json(
+ msg="Autoremove should be used alone or with state=absent",
+ results=[],
+ )
+
def listify_comma_sep_strings_in_list(self, some_list):
"""
method to accept a list of strings as the parameter, find any strings
diff --git a/lib/ansible/modules/packaging/os/dnf.py b/lib/ansible/modules/packaging/os/dnf.py
index fee5f5d2c6..5a15eeb73c 100644
--- a/lib/ansible/modules/packaging/os/dnf.py
+++ b/lib/ansible/modules/packaging/os/dnf.py
@@ -41,8 +41,9 @@ options:
state:
description:
- Whether to install (C(present), C(latest)), or remove (C(absent)) a package.
+ - Default is C(None), however in effect the default action is C(present) unless the C(autoremove) option is
+ enabled for this module, then C(absent) is inferred.
choices: ['absent', 'present', 'installed', 'removed', 'latest']
- default: "present"
enablerepo:
description:
@@ -1017,11 +1018,6 @@ class DnfModule(YumDnf):
msg="Autoremove requires dnf>=2.0.1. Current dnf version is %s" % dnf.__version__,
results=[],
)
- if self.state not in ["absent", None]:
- self.module.fail_json(
- msg="Autoremove should be used alone or with state=absent",
- results=[],
- )
# Set state as installed by default
# This is not set in AnsibleModule() because the following shouldn't happend
diff --git a/lib/ansible/modules/packaging/os/yum.py b/lib/ansible/modules/packaging/os/yum.py
index f6b93d5ea1..a5780742f7 100644
--- a/lib/ansible/modules/packaging/os/yum.py
+++ b/lib/ansible/modules/packaging/os/yum.py
@@ -56,8 +56,9 @@ options:
- C(present) and C(installed) will simply ensure that a desired package is installed.
- C(latest) will update the specified package if it's not of the latest available version.
- C(absent) and C(removed) will remove the specified package.
+ - Default is C(None), however in effect the default action is C(present) unless the C(autoremove) option isĀ¬
+ enabled for this module, then C(absent) is inferred.
choices: [ absent, installed, latest, present, removed ]
- default: present
enablerepo:
description:
- I(Repoid) of repositories to enable for the install/update operation.