From: Adam King Date: Mon, 9 Jan 2023 19:50:12 +0000 (-0500) Subject: mgr/cephadm: fix extra container/entrypoint args with spaces X-Git-Tag: v16.2.12~3^2~17^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6d1b37ce3e68eb092c3dac3db45e955d32589cd9;p=ceph.git mgr/cephadm: fix extra container/entrypoint args with spaces Fixes: https://tracker.ceph.com/issues/57338 Prior, doing extra container args like - "--cpus" - "2" would work fine as the two args would be passed separately and eventually placed in the final podman/docker run command with a space between them. However, trying to do something like - "--cpus 2" instead would fail, as it would be translated to --extra-container-args=--cpus 2 causing "2" to be considered its own arg, which cephadm wouldn't know how to handle. Another way this can cause problems is listed in the linked tracker. Either way, leaving the spaces in the args was causing problems, and the simplest way to handle it seems to be to just split on the original arg on the spaces into multiple args Signed-off-by: Adam King (cherry picked from commit a161381ba816609b5041d2072e7e6cec39eaa753) --- diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index 42e25a9b962be..888c889c2b193 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -1214,14 +1214,24 @@ class CephadmServe: eca = daemon_spec.extra_container_args if eca: for a in eca: - daemon_spec.extra_args.append(f'--extra-container-args={a}') + # args with spaces need to be split into multiple args + # in order to work properly + args = a.split(' ') + for arg in args: + if arg: + daemon_spec.extra_args.append(f'--extra-container-args={arg}') except AttributeError: eca = None try: eea = daemon_spec.extra_entrypoint_args if eea: for a in eea: - daemon_spec.extra_args.append(f'--extra-entrypoint-args={a}') + # args with spaces need to be split into multiple args + # in order to work properly + args = a.split(' ') + for arg in args: + if arg: + daemon_spec.extra_args.append(f'--extra-entrypoint-args={arg}') except AttributeError: eea = None return daemon_spec, eca, eea diff --git a/src/pybind/mgr/cephadm/tests/test_cephadm.py b/src/pybind/mgr/cephadm/tests/test_cephadm.py index aa237e089e1c6..890dfa6a84d82 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -525,6 +525,35 @@ class TestCephadm(object): image='', ) + @mock.patch("cephadm.serve.CephadmServe._run_cephadm") + def test_extra_entrypoint_and_container_args_with_spaces(self, _run_cephadm, cephadm_module: CephadmOrchestrator): + _run_cephadm.return_value = ('{}', '', 0) + with with_host(cephadm_module, 'test'): + with with_service(cephadm_module, ServiceSpec(service_type='node-exporter', + extra_entrypoint_args=['--entrypoint-arg-with-value value', '--some-other-arg 3'], + extra_container_args=['--cpus 2', '--container-arg-with-value value']), + CephadmOrchestrator.apply_node_exporter): + _run_cephadm.assert_called_with( + 'test', 'node-exporter.test', 'deploy', [ + '--name', 'node-exporter.test', + '--meta-json', ('{"service_name": "node-exporter", "ports": [9100], "ip": null, "deployed_by": [], "rank": null, ' + '"rank_generation": null, "extra_container_args": ["--cpus 2", "--container-arg-with-value value"], ' + '"extra_entrypoint_args": ["--entrypoint-arg-with-value value", "--some-other-arg 3"]}'), + '--config-json', '-', + '--tcp-ports', '9100', + '--extra-container-args=--cpus', + '--extra-container-args=2', + '--extra-container-args=--container-arg-with-value', + '--extra-container-args=value', + '--extra-entrypoint-args=--entrypoint-arg-with-value', + '--extra-entrypoint-args=value', + '--extra-entrypoint-args=--some-other-arg', + '--extra-entrypoint-args=3' + ], + stdin='{}', + image='', + ) + @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}')) def test_daemon_check_post(self, cephadm_module: CephadmOrchestrator): with with_host(cephadm_module, 'test'):