From 9c0bbe2a711c6d3434b369a8679195a597aa8ce5 Mon Sep 17 00:00:00 2001 From: Redouane Kachach Date: Wed, 2 Mar 2022 12:38:42 +0100 Subject: [PATCH] mgr/cephadm: check spec host when adding osd Fixes: https://tracker.ceph.com/issues/47872 Signed-off-by: Redouane Kachach (cherry picked from commit b87c966697d36ef51f1e62425d77200667e651ae) Conflicts: src/pybind/mgr/orchestrator/module.py --- src/pybind/mgr/cephadm/module.py | 4 ++++ src/pybind/mgr/cephadm/tests/test_cephadm.py | 5 +++++ src/pybind/mgr/orchestrator/module.py | 10 ++++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 607afd51b0dac..5a633eae172f7 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -2358,6 +2358,10 @@ Then run the following: @handle_orch_error def create_osds(self, drive_group: DriveGroupSpec) -> str: + hosts: List[HostSpec] = self.inventory.all_specs() + filtered_hosts: List[str] = drive_group.placement.filter_matching_hostspecs(hosts) + if not filtered_hosts: + return "Invalid 'host:device' spec: host not found in cluster. Please check 'ceph orch host ls' for available hosts" return self.osd_service.create_from_spec(drive_group) def _preview_osdspecs(self, diff --git a/src/pybind/mgr/cephadm/tests/test_cephadm.py b/src/pybind/mgr/cephadm/tests/test_cephadm.py index 69d87bdb49d5e..d4875d29a62d5 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -807,6 +807,11 @@ class TestCephadm(object): c = cephadm_module.create_osds(dg) out = wait(cephadm_module, c) assert out == "Created no osd(s) on host test; already created?" + bad_dg = DriveGroupSpec(placement=PlacementSpec(host_pattern='invalid_hsot'), + data_devices=DeviceSelection(paths=[''])) + c = cephadm_module.create_osds(bad_dg) + out = wait(cephadm_module, c) + assert "Invalid 'host:device' spec: host not found in cluster" in out @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}')) def test_create_noncollocated_osd(self, cephadm_module): diff --git a/src/pybind/mgr/orchestrator/module.py b/src/pybind/mgr/orchestrator/module.py index 56612dd8dc6c8..1f4bc5dc7be11 100644 --- a/src/pybind/mgr/orchestrator/module.py +++ b/src/pybind/mgr/orchestrator/module.py @@ -788,10 +788,12 @@ Usage: host_name, block_device = svc_arg.split(":") block_devices = block_device.split(',') devs = DeviceSelection(paths=block_devices) - drive_group = DriveGroupSpec(placement=PlacementSpec( - host_pattern=host_name), data_devices=devs) - except (TypeError, KeyError, ValueError): - msg = "Invalid host:device spec: '{}'".format(svc_arg) + usage + drive_group = DriveGroupSpec( + placement=PlacementSpec(host_pattern=host_name), + data_devices=devs, + ) + except (TypeError, KeyError, ValueError) as e: + msg = f"Invalid 'host:device' spec: '{svc_arg}': {e}" + usage return HandleCommandResult(-errno.EINVAL, stderr=msg) completion = self.create_osds(drive_group) -- 2.39.5