From ee0084dbcf074ee3dddd9ec78e3eb8ddc14d43ae Mon Sep 17 00:00:00 2001 From: Jordan Borean Date: Tue, 21 Jan 2025 06:16:41 +1000 Subject: [PATCH] Ansible.Basic - Fix required_if check (#84562) (#84582) Fixes the Ansible.Basic `required_if` check when the option to check is either unset or explicitly set to null. (cherry picked from commit 8c5e33cd3aa604124234d407044d317a028e84ed) --- .../Ansible.Basic-required_if-null.yml | 3 ++ .../module_utils/csharp/Ansible.Basic.cs | 2 +- .../library/ansible_basic_tests.ps1 | 28 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/Ansible.Basic-required_if-null.yml diff --git a/changelogs/fragments/Ansible.Basic-required_if-null.yml b/changelogs/fragments/Ansible.Basic-required_if-null.yml new file mode 100644 index 00000000000..8cffba09405 --- /dev/null +++ b/changelogs/fragments/Ansible.Basic-required_if-null.yml @@ -0,0 +1,3 @@ +bugfixes: + - >- + Ansible.Basic - Fix ``required_if`` check when the option value to check is unset or set to null. diff --git a/lib/ansible/module_utils/csharp/Ansible.Basic.cs b/lib/ansible/module_utils/csharp/Ansible.Basic.cs index 085958270d7..51c7b534634 100644 --- a/lib/ansible/module_utils/csharp/Ansible.Basic.cs +++ b/lib/ansible/module_utils/csharp/Ansible.Basic.cs @@ -1210,7 +1210,7 @@ namespace Ansible.Basic object val = requiredCheck[1]; IList requirements = (IList)requiredCheck[2]; - if (ParseStr(param[key]) != ParseStr(val)) + if (param[key] == null || ParseStr(param[key]) != ParseStr(val)) continue; string term = "all"; diff --git a/test/integration/targets/module_utils_Ansible.Basic/library/ansible_basic_tests.ps1 b/test/integration/targets/module_utils_Ansible.Basic/library/ansible_basic_tests.ps1 index 27b0d107d77..6dcbc07fd99 100644 --- a/test/integration/targets/module_utils_Ansible.Basic/library/ansible_basic_tests.ps1 +++ b/test/integration/targets/module_utils_Ansible.Basic/library/ansible_basic_tests.ps1 @@ -3054,6 +3054,34 @@ test_no_log - Invoked with: $actual.invocation | Assert-DictionaryEqual -Expected @{module_args = $complex_args } } + "Required if for unset option" = { + $spec = @{ + options = @{ + state = @{ choices = "absent", "present" } + name = @{} + path = @{} + } + required_if = @(, @("state", "absent", @("name", "path"))) + } + Set-Variable -Name complex_args -Scope Global -Value @{} + $m = [Ansible.Basic.AnsibleModule]::Create(@(), $spec) + + $failed = $false + try { + $m.ExitJson() + } + catch [System.Management.Automation.RuntimeException] { + $failed = $true + $_.Exception.Message | Assert-Equal -Expected "exit: 0" + $actual = [Ansible.Basic.AnsibleModule]::FromJson($_.Exception.InnerException.Output) + } + $failed | Assert-Equal -Expected $true + + $actual.Keys.Count | Assert-Equal -Expected 2 + $actual.changed | Assert-Equal -Expected $false + $actual.invocation | Assert-DictionaryEqual -Expected @{ module_args = $complex_args } + } + "PS Object in return result" = { $m = [Ansible.Basic.AnsibleModule]::Create(@(), @{})