You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ansible/lib/ansible
Dag Wieers cd9471ef17 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
5 years ago
..
cli Restore behavior for detecting only localhost, and no limit match. Fixes #52152 (#52172) 5 years ago
compat Have update-bundled check for updates to all bundled code 5 years ago
config docs: update docs about pipelining (#51856) 5 years ago
errors Catch sshpass authentication errors and don't retry multiple times to prevent account lockout (#50776) 6 years ago
executor Fix pycodestyle E117 issues. 5 years ago
galaxy Consistent typesetting of "GitHub" (#50929) 6 years ago
inventory make missing pattern ansibleerror (#51397) 5 years ago
module_utils Introduce new 'required_by' argument_spec option (#28662) 5 years ago
modules Introduce new 'required_by' argument_spec option (#28662) 5 years ago
parsing Fix pycodestyle E117 issues. 5 years ago
playbook Become plugins (#50991) 5 years ago
plugins Feature/alphanumeric password in passwordstore (#38121) 5 years ago
template Fix safe_eval on Python 3.8. 5 years ago
utils move extravars and option vars loading into VM (#51070) 5 years ago
vars Remove unused imports and variable in hostvars.py (#51609) 5 years ago
__init__.py Fix ziploader for the cornercase of ansible invoking ansible. 8 years ago
constants.py Become plugins (#50991) 5 years ago
context.py Become plugins (#50991) 5 years ago
release.py Codename: How Many More Times 6 years ago