From: Kefu Chai Date: Sat, 5 Jun 2021 00:44:42 +0000 (+0800) Subject: Merge pull request #40073 from jmolmo/delete_service_causes_osd_removal X-Git-Tag: v17.1.0~1742 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e8f1477da10c56a1888b6f584613054021d3ab66;p=ceph.git Merge pull request #40073 from jmolmo/delete_service_causes_osd_removal mgr/cephadm: Warn about OSDs to remove manually when deleting an OSD service Reviewed-by: Sebastian Wagner Reviewed-by: Adam King --- e8f1477da10c56a1888b6f584613054021d3ab66 diff --cc src/pybind/mgr/cephadm/module.py index af1ae2fa70c,a45e97c1563..cde603154de --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@@ -1939,18 -1797,29 +1939,34 @@@ Then run the following if self.spec_store[service_name].spec.service_type in ('mon', 'mgr'): return f'Unable to remove {service_name} service.\n' \ f'Note, you might want to mark the {service_name} service as "unmanaged"' - found = self.spec_store.rm(service_name) + + # Report list of affected OSDs + osds_msg = {} + if service_name.startswith('osd.'): + for h, dm in self.cache.get_daemons_with_volatile_status(): + osds_to_remove = [] + for name, dd in dm.items(): + if dd.daemon_type == 'osd' and (dd.service_name() == service_name or not dd.osdspec_affinity): + osds_to_remove.append(str(dd.daemon_id)) + if osds_to_remove: + osds_msg[h] = osds_to_remove + + found = self.spec_store.rm(service_name) or osds_msg if found: self._kick_serve_loop() - return 'Removed service %s' % service_name + if osds_msg: + return f'The service {service_name} will be deleted once the following OSDs: {osds_msg} ' \ + f'will be deleted manually.' + else: + return f'Removed service {service_name}' else: # must be idempotent: still a success. - return f'Failed to remove service. <{service_name}> was not found.' + try: + self.cache.get_daemon(service_name) + return (f'Failed to remove service <{service_name}>. "{service_name}" is the name of a daemon, not a service. ' + + 'Running service names can be found with "ceph orch ls"') + except OrchestratorError: + return f'Failed to remove service. <{service_name}> was not found. Running service names can be found with "ceph orch ls"' @handle_orch_error def get_inventory(self, host_filter: Optional[orchestrator.InventoryFilter] = None, refresh: bool = False) -> List[orchestrator.InventoryHost]: