From e55a41ca0cf37e4cc65b282bf2842426a89d79ff Mon Sep 17 00:00:00 2001 From: Rafael Guterres Jeffman <rjeffman@redhat.com> Date: Sun, 17 Sep 2023 22:28:10 -0300 Subject: [PATCH] ansible_freeipa_module: Ensure data type when retrieving parameter Some parameters, in modules, have a specific data type, but allow the use of an empty string to clear the parameter. By providing a method to retrieve the parameter with the correct data type, or optionally an empty string, allows for consistency of parameter handling between different modules. --- .../module_utils/ansible_freeipa_module.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/plugins/module_utils/ansible_freeipa_module.py b/plugins/module_utils/ansible_freeipa_module.py index 1c40fa2c..d64c9e31 100644 --- a/plugins/module_utils/ansible_freeipa_module.py +++ b/plugins/module_utils/ansible_freeipa_module.py @@ -503,6 +503,48 @@ def module_params_get_lowercase(module, name, allow_empty_list_item=False): return value +def module_params_get_with_type_cast( + module, name, datatype, allow_empty=False +): + """ + Retrieve value set for module parameter as a specific data type. + + Parameters + ---------- + module: AnsibleModule + The module from where to get the parameter value from. + name: string + The name of the parameter to retrieve. + datatype: type + The type to convert the value to, if value is not empty. + allow_empty: bool + Allow an empty string for non list parameters or a list + containing (only) an empty string item. This is used for + resetting parameters to the default value. + + """ + value = module_params_get(module, name, allow_empty) + if not allow_empty and value == "": + module.fail_json( + msg="Argument '%s' must not be an empty string" % (name,) + ) + if value is not None and value != "": + try: + if datatype is bool: + # We let Ansible handle bool values + value = boolean(value) + else: + value = datatype(value) + except ValueError: + module.fail_json( + msg="Invalid value '%s' for argument '%s'" % (value, name) + ) + except TypeError as terr: + # If Ansible fails to parse a boolean, it will raise TypeError + module.fail_json(msg="Param '%s': %s" % (name, str(terr))) + return value + + def api_get_domain(): return api.env.domain @@ -1078,6 +1120,29 @@ class IPAAnsibleModule(AnsibleModule): """ return module_params_get_lowercase(self, name, allow_empty_list_item) + def params_get_with_type_cast( + self, name, datatype, allow_empty=True + ): + """ + Retrieve value set for module parameter as a specific data type. + + Parameters + ---------- + name: string + The name of the parameter to retrieve. + datatype: type + The type to convert the value to, if not empty. + datatype: type + The type to convert the value to, if value is not empty. + allow_empty: bool + Allow an empty string for non list parameters or a list + containing (only) an empty string item. This is used for + resetting parameters to the default value. + + """ + return module_params_get_with_type_cast( + self, name, datatype, allow_empty) + def params_fail_used_invalid(self, invalid_params, state, action=None): """ Fail module execution if one of the invalid parameters is not None. -- GitLab