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 = self.mgr.wait_async(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
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())
}
self.set_store("drive_group_map", json.dumps(json_drive_group_map))
- def remove_osds(self, osd_ids: List[str], replace: bool = False, force: bool = False, zap: bool = False) -> OrchResult[str]:
+ def remove_osds(self,
+ osd_ids: List[str],
+ replace: bool = False,
+ force: bool = False,
+ zap: bool = False,
+ no_destroy: bool = False) -> OrchResult[str]:
assert self._rook_cluster is not None
if zap:
raise RuntimeError("Rook does not support zapping devices during OSD removal.")