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: v17.2.6~37^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F49851%2Fhead;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 d0676d8a6f26..b0060c75c2a6 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -1244,14 +1244,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 5deddb983dd1..ad3b119d97f4 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -529,6 +529,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.side_effect = async_side_effect(('{}', '', 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") def test_custom_config(self, _run_cephadm, cephadm_module: CephadmOrchestrator): _run_cephadm.side_effect = async_side_effect(('{}', '', 0))