From: Guillaume Abrioux Date: Fri, 31 Mar 2023 09:27:13 +0000 (+0200) Subject: cephadm: osd replacement improvement X-Git-Tag: v16.2.14~168^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d1d832fcd436c9b6e10b5fc1a0e1bb10f65d4ff5;p=ceph.git cephadm: osd replacement improvement This adds a new parameter `--no-destroy` to the command `ceph orch osd rm`. By default, it removes any VGs/LVs related to the osd being removed. For specific workflows, this can be useful to preserve them. Fixes: https://tracker.ceph.com/issues/59289 Signed-off-by: Guillaume Abrioux (cherry picked from commit ef810a4ebf91b538f778da4ca3ea0fdc2968e2fe) --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 9134ce2bdc08..66e55a53d201 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -2879,7 +2879,8 @@ Then run the following: def remove_osds(self, osd_ids: List[str], replace: bool = False, force: bool = False, - zap: bool = False) -> str: + zap: bool = False, + no_destroy: bool = False) -> str: """ Takes a list of OSDs and schedules them for removal. The function that takes care of the actual removal is @@ -2901,6 +2902,7 @@ Then run the following: replace=replace, force=force, zap=zap, + no_destroy=no_destroy, hostname=daemon.hostname, process_started_at=datetime_now(), remove_util=self.to_remove_osds.rm_util)) diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index 5899ba49a98e..93ebb7c7667f 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -537,9 +537,12 @@ class RemoveUtil(object): def zap_osd(self, osd: "OSD") -> str: "Zaps all devices that are associated with an OSD" if osd.hostname is not None: + cmd = ['--', 'lvm', 'zap', '--osd-id', str(osd.osd_id)] + if not osd.no_destroy: + cmd.append('--destroy') out, err, code = CephadmServe(self.mgr)._run_cephadm( osd.hostname, 'osd', 'ceph-volume', - ['--', 'lvm', 'zap', '--destroy', '--osd-id', str(osd.osd_id)], + cmd, error_ok=True) self.mgr.cache.invalidate_host_devices(osd.hostname) if code: @@ -602,7 +605,8 @@ class OSD: replace: bool = False, force: bool = False, hostname: Optional[str] = None, - zap: bool = False): + zap: bool = False, + no_destroy: bool = False): # the ID of the OSD self.osd_id = osd_id @@ -641,6 +645,8 @@ class OSD: # Whether devices associated with the OSD should be zapped (DATA ERASED) self.zap = zap + # Whether all associated LV devices should be destroyed. + self.no_destroy = no_destroy def start(self) -> None: if self.started: diff --git a/src/pybind/mgr/orchestrator/_interface.py b/src/pybind/mgr/orchestrator/_interface.py index 148b8990968f..db6945907682 100644 --- a/src/pybind/mgr/orchestrator/_interface.py +++ b/src/pybind/mgr/orchestrator/_interface.py @@ -571,12 +571,14 @@ class Orchestrator(object): def remove_osds(self, osd_ids: List[str], replace: bool = False, force: bool = False, - zap: bool = False) -> OrchResult[str]: + zap: bool = False, + no_destroy: bool = False) -> OrchResult[str]: """ :param osd_ids: list of OSD IDs :param replace: marks the OSD as being destroyed. See :ref:`orchestrator-osd-replace` :param force: Forces the OSD removal process without waiting for the data to be drained first. :param zap: Zap/Erase all devices associated with the OSDs (DESTROYS DATA) + :param no_destroy: Do not destroy associated VGs/LVs with the OSD. .. note:: this can only remove OSDs that were successfully created (i.e. got an OSD ID). diff --git a/src/pybind/mgr/orchestrator/module.py b/src/pybind/mgr/orchestrator/module.py index eff48e8ca7a0..ff360bb0503e 100644 --- a/src/pybind/mgr/orchestrator/module.py +++ b/src/pybind/mgr/orchestrator/module.py @@ -846,9 +846,11 @@ Usage: osd_id: List[str], replace: bool = False, force: bool = False, - zap: bool = False) -> HandleCommandResult: + zap: bool = False, + no_destroy: bool = False) -> HandleCommandResult: """Remove OSD daemons""" - completion = self.remove_osds(osd_id, replace=replace, force=force, zap=zap) + completion = self.remove_osds(osd_id, replace=replace, force=force, + zap=zap, no_destroy=no_destroy) raise_if_exception(completion) return HandleCommandResult(stdout=completion.result_str())