]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Merge pull request #40073 from jmolmo/delete_service_causes_osd_removal
authorKefu Chai <kchai@redhat.com>
Sat, 5 Jun 2021 00:44:42 +0000 (08:44 +0800)
committerGitHub <noreply@github.com>
Sat, 5 Jun 2021 00:44:42 +0000 (08:44 +0800)
mgr/cephadm: Warn about OSDs to remove manually when deleting an OSD service

Reviewed-by: Sebastian Wagner <sewagner@redhat.com>
Reviewed-by: Adam King <adking@redhat.com>
1  2 
src/pybind/mgr/cephadm/module.py

index af1ae2fa70cdcb51bfeb513e71c77a1879606341,a45e97c1563107a5a7aa35546264df8743bf262b..cde603154deb3185e1a1c014062d6f7f4e118f95
@@@ -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]: