I’m new to Ansible and this forum, so uncertain if this is the right place to post. I’m learning how to contribute to the project. Before making any changes, I ran a unit test, which failed. Here are the steps to reproduce the issue:
- Install the required dependencies, and execute
source hacking/env-setup
. - Execute
ansible-test units -v iptables --python=3.12
. - Received an
AssertionError: assert 'Failed to find required executable' in 'Either chain or flush parameter must be specified.'
The output is as follows. (All home directory paths are replaced with ~
.)
=================================== FAILURES ===================================
_______________________ test_without_required_parameters _______________________
[gw0] linux -- Python 3.12.4 ~/ansible/venv/bin/python
mocker = <pytest_mock.plugin.MockerFixture object at 0x7fd09e207ef0>
def test_without_required_parameters(mocker):
"""Test module without any parameters."""
mocker.patch(
"ansible.module_utils.basic.AnsibleModule.fail_json",
side_effect=fail_json,
)
set_module_args({})
with pytest.raises(AnsibleFailJson) as exc:
iptables.main()
assert exc.value.args[0]["failed"]
> assert "Failed to find required executable" in exc.value.args[0]["msg"]
E AssertionError: assert 'Failed to find required executable' in 'Either chain or flush parameter must be specified.'
test/units/modules/test_iptables.py:36: AssertionError
- generated xml file: ~/ansible/test/results/junit/python3.12-modules-units.xml -
Here’s my local environment:
-
OS: Ubuntu 22.04.4 LTS (5.10.16.3-microsoft-standard-WSL2)
-
Python: 3.12.4
-
Ansible:
ansible [core 2.18.0.dev0] (devel edce798713) last updated 2024/07/08 09:26:42 (GMT +800) config file = ~/.ansible.cfg configured module search path = ['~/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = ~/ansible/lib/ansible ansible collection location = ~/.ansible/collections:/usr/share/ansible/collections executable location = ~/ansible/bin/ansible python version = 3.12.4 (main, Jun 8 2024, 18:29:57) [GCC 11.4.0] (~/ansible/venv/bin/python) jinja version = 3.1.4 libyaml = True
I’ve checked the result from Azure Pipeline, and the test passed, so the issue is likely on my end. However, after some investigation, the output seemed quite logical to me. The execution flow is as follows:
iptables.main()
is called without module arguments.- With
ip_version
defaulting to'ipv4'
,BINS[ip_version]
resolves to'iptables'
. module.get_bin_path(BINS[ip_version], True)
is invoked, which in turn callsget_bin_path(arg=arg, opt_dirs=opt_dirs)
, wherearg
is'iptables'
.- Within
get_bin_path
(located inprocess.py
), the path includes'/usr/sbin'
, leading to the discovery of/usr/sbin/iptables
, and thus not triggering aValueError
. - Returning back to
iptables.main()
, bothargs['flush'] is False
andargs['chain'] is None
hold true, resulting in an error message stating:Either chain or flush parameter must be specified.
- An
AssertionError
is raised with the messageassert 'Failed to find required executable' in 'Either chain or flush parameter must be specified.'
, as the error message does not match.
I’m wondering if I’ve missed something or if my code analysis is flawed. As a non-native speaker, I apologize for any grammatical inaccuracies. Any assistance would be appreciated. Thanks in advance!