mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-26 20:31:27 -07:00
Introduce new 'required_by' argument_spec option (#28662)
* Introduce new "required_by' argument_spec option This PR introduces a new **required_by** argument_spec option which allows you to say *"if parameter A is set, parameter B and C are required as well"*. - The difference with **required_if** is that it can only add dependencies if a parameter is set to a specific value, not when it is just defined. - The difference with **required_together** is that it has a commutative property, so: *"Parameter A and B are required together, if one of them has been defined"*. As an example, we need this for the complex options that the xml module provides. One of the issues we often see is that users are not using the correct combination of options, and then are surprised that the module does not perform the requested action(s). This would be solved by adding the correct dependencies, and mutual exclusives. For us this is important to get this shipped together with the new xml module in Ansible v2.4. (This is related to bugfix https://github.com/ansible/ansible/pull/28657) ```python module = AnsibleModule( argument_spec=dict( path=dict(type='path', aliases=['dest', 'file']), xmlstring=dict(type='str'), xpath=dict(type='str'), namespaces=dict(type='dict', default={}), state=dict(type='str', default='present', choices=['absent', 'present'], aliases=['ensure']), value=dict(type='raw'), attribute=dict(type='raw'), add_children=dict(type='list'), set_children=dict(type='list'), count=dict(type='bool', default=False), print_match=dict(type='bool', default=False), pretty_print=dict(type='bool', default=False), content=dict(type='str', choices=['attribute', 'text']), input_type=dict(type='str', default='yaml', choices=['xml', 'yaml']), backup=dict(type='bool', default=False), ), supports_check_mode=True, required_by=dict( add_children=['xpath'], attribute=['value', 'xpath'], content=['xpath'], set_children=['xpath'], value=['xpath'], ), required_if=[ ['count', True, ['xpath']], ['print_match', True, ['xpath']], ], required_one_of=[ ['path', 'xmlstring'], ['add_children', 'content', 'count', 'pretty_print', 'print_match', 'set_children', 'value'], ], mutually_exclusive=[ ['add_children', 'content', 'count', 'print_match','set_children', 'value'], ['path', 'xmlstring'], ], ) ``` * Rebase and fix conflict * Add modules that use required_by functionality * Update required_by schema * Fix rebase issue
This commit is contained in:
parent
be9c75703a
commit
cd9471ef17
12 changed files with 166 additions and 117 deletions
|
@ -98,7 +98,7 @@ options:
|
|||
special_time:
|
||||
description:
|
||||
- Special time specification nickname.
|
||||
choices: [ reboot, yearly, annually, monthly, weekly, daily, hourly ]
|
||||
choices: [ annually, daily, hourly, monthly, reboot, weekly, yearly ]
|
||||
version_added: "1.3"
|
||||
disabled:
|
||||
description:
|
||||
|
@ -566,6 +566,12 @@ def main():
|
|||
['reboot', 'special_time'],
|
||||
['insertafter', 'insertbefore'],
|
||||
],
|
||||
required_by=dict(
|
||||
cron_file=('user'),
|
||||
),
|
||||
required_if=(
|
||||
('state', 'present', ('job')),
|
||||
),
|
||||
)
|
||||
|
||||
name = module.params['name']
|
||||
|
@ -624,13 +630,6 @@ def main():
|
|||
if (special_time or reboot) and get_platform() == 'SunOS':
|
||||
module.fail_json(msg="Solaris does not support special_time=... or @reboot")
|
||||
|
||||
if cron_file and do_install:
|
||||
if not user:
|
||||
module.fail_json(msg="To use cron_file=... parameter you must specify user=... as well")
|
||||
|
||||
if job is None and do_install:
|
||||
module.fail_json(msg="You must specify 'job' to install a new cron job or variable")
|
||||
|
||||
if (insertafter or insertbefore) and not env and do_install:
|
||||
module.fail_json(msg="Insertafter and insertbefore parameters are valid only with env=yes")
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue