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 <gabrioux@ibm.com>
(cherry picked from commit
ef810a4ebf91b538f778da4ca3ea0fdc2968e2fe)
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
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))
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:
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
# 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:
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).
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())