diff options
| author | Bertrand Lanson <bertrand.lanson@infomaniak.com> | 2026-05-21 10:43:40 +0200 |
|---|---|---|
| committer | Bertrand Lanson <bertrand.lanson@infomaniak.com> | 2026-06-22 14:21:26 +0200 |
| commit | 20a056012273d103ff24b31541b6bbb746b10180 (patch) | |
| tree | 18e0abd5efb751f929e147e97b5181e32fa6062b /tests | |
| parent | 3082ed5b28229389bc47bb5ef03a935ec47e4c59 (diff) | |
| download | kolla-ansible-20a056012273d103ff24b31541b6bbb746b10180.tar.gz kolla-ansible-20a056012273d103ff24b31541b6bbb746b10180.zip | |
fix kolla_toolbox running with wrong HOME env
There is a possibility that the ansible-runner in kolla_toolbox
is executed with the wrong environment variables if run in a specific
way. The cause is not super clear, but the solution is to simply force
it to use the correct HOME value.
Closes-Bug: #2153544
Change-Id: Ibad84e358f21564c570161f7e4f21b117398df3b
Signed-off-by: Bertrand Lanson <bertrand.lanson@infomaniak.com>
(cherry picked from commit 2104f74a2616821c2bd848411ebfce266a3edd69)
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_kolla_toolbox.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/test_kolla_toolbox.py b/tests/test_kolla_toolbox.py index 89eafdebb..818840179 100644 --- a/tests/test_kolla_toolbox.py +++ b/tests/test_kolla_toolbox.py @@ -649,6 +649,66 @@ class TestKollaToolboxWorkerMain(TestKollaToolboxModule): self.fake_ktbw.main) self.assertIn('ansible-runner', error.result['msg']) + def test_runner_exec_uses_ansible_user_when_no_user_param(self): + """user=None must exec ansible-runner as 'ansible', not as root. + + Podman serialises user=None as null in ExecCreate; some daemon + versions interpret null as UID 0 (root), which breaks openstacksdk + lookups because HOME becomes /root instead of /var/lib/ansible. + """ + self.mock_ansible_module.params['user'] = None + + with mock.patch.object(self.fake_ktbw, '_push_private_data_dir'), \ + mock.patch.object(self.fake_ktbw, '_parse_runner_result', + return_value={'changed': False}): + self.fake_ktbw.main() + + # call[0]=check_runner, call[1]=ansible-runner, call[2]=cleanup + runner_call = self.mock_container.exec_run.call_args_list[1] + self.assertEqual('ansible', runner_call.kwargs.get('user')) + + def test_runner_exec_sets_home_to_pdd_basedir_for_ansible_user(self): + """HOME must be set to _PDD_BASEDIR to finds clouds.yaml.""" + self.mock_ansible_module.params['user'] = None + + with mock.patch.object(self.fake_ktbw, '_push_private_data_dir'), \ + mock.patch.object(self.fake_ktbw, '_parse_runner_result', + return_value={'changed': False}): + self.fake_ktbw.main() + + runner_call = self.mock_container.exec_run.call_args_list[1] + env = runner_call.kwargs.get('environment', {}) + self.assertEqual(kolla_toolbox._PDD_BASEDIR, env.get('HOME')) + + def test_runner_exec_uses_explicit_user_param(self): + """When user='rabbitmq', ansible-runner must exec as 'rabbitmq'.""" + self.mock_ansible_module.params['user'] = 'rabbitmq' + + with mock.patch.object(self.fake_ktbw, '_push_private_data_dir'), \ + mock.patch.object(self.fake_ktbw, '_parse_runner_result', + return_value={'changed': False}): + self.fake_ktbw.main() + + runner_call = self.mock_container.exec_run.call_args_list[1] + self.assertEqual('rabbitmq', runner_call.kwargs.get('user')) + + def test_runner_exec_no_home_override_for_non_ansible_user(self): + """HOME must not be overridden for non-ansible users. + + Forcing HOME=/var/lib/ansible when running as rabbitmq causes + PermissionError because rabbitmq cannot write to ansible's home. + """ + self.mock_ansible_module.params['user'] = 'rabbitmq' + + with mock.patch.object(self.fake_ktbw, '_push_private_data_dir'), \ + mock.patch.object(self.fake_ktbw, '_parse_runner_result', + return_value={'changed': False}): + self.fake_ktbw.main() + + runner_call = self.mock_container.exec_run.call_args_list[1] + env = runner_call.kwargs.get('environment', {}) + self.assertNotIn('HOME', env) + class TestModuleInteraction(TestKollaToolboxModule): """Class focused on testing user input data from playbook.""" |
