From: Sebastian Wagner Date: Tue, 9 Jun 2020 12:57:07 +0000 (+0200) Subject: mgr/cephadm: move _check_safe_to_destroy_mon to MonService X-Git-Tag: v15.2.5~147^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7b0d66349b8283de85ace494e7f8da1198c6b85d;p=ceph.git mgr/cephadm: move _check_safe_to_destroy_mon to MonService Signed-off-by: Sebastian Wagner (cherry picked from commit cb92429d52319deb2bc626495ea58ac82e50e558) --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 9b6f4a62056..1963a69b606 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -381,28 +381,6 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule): self.log.debug('_kick_serve_loop') self.event.set() - def _check_safe_to_destroy_mon(self, mon_id): - # type: (str) -> None - ret, out, err = self.check_mon_command({ - 'prefix': 'quorum_status', - }) - try: - j = json.loads(out) - except Exception as e: - raise OrchestratorError('failed to parse quorum status') - - mons = [m['name'] for m in j['monmap']['mons']] - if mon_id not in mons: - self.log.info('Safe to remove mon.%s: not in monmap (%s)' % ( - mon_id, mons)) - return - new_mons = [m for m in mons if m != mon_id] - new_quorum = [m for m in j['quorum_names'] if m != mon_id] - if len(new_quorum) > len(new_mons) / 2: - self.log.info('Safe to remove mon.%s: new quorum should be %s (from %s)' % (mon_id, new_quorum, new_mons)) - return - raise OrchestratorError('Removing %s would break mon quorum (new quorum %s, new mons %s)' % (mon_id, new_quorum, new_mons)) - def _check_host(self, host): if host not in self.inventory: return @@ -1725,15 +1703,8 @@ you may want to run: Remove a daemon """ (daemon_type, daemon_id) = name.split('.', 1) - if daemon_type == 'mon': - self._check_safe_to_destroy_mon(daemon_id) - # remove mon from quorum before we destroy the daemon - self.log.info('Removing monitor %s from monmap...' % name) - ret, out, err = self.check_mon_command({ - 'prefix': 'mon rm', - 'name': daemon_id, - }) + self.cephadm_services[daemon_type].pre_remove(daemon_id) args = ['--name', name, '--force'] self.log.info('Removing daemon %s from %s' % (name, host)) diff --git a/src/pybind/mgr/cephadm/services/cephadmservice.py b/src/pybind/mgr/cephadm/services/cephadmservice.py index b7571ae6f5d..61f9a8983c0 100644 --- a/src/pybind/mgr/cephadm/services/cephadmservice.py +++ b/src/pybind/mgr/cephadm/services/cephadmservice.py @@ -1,3 +1,4 @@ +import json import logging from abc import ABCMeta, abstractmethod from typing import TYPE_CHECKING, List, Callable, Any @@ -139,6 +140,11 @@ class CephadmService(metaclass=ABCMeta): return True + def pre_remove(self, daemon_id: str) -> None: + """ + Called before the daemon is removed. + """ + pass class MonService(CephadmService): TYPE = 'mon' @@ -182,6 +188,39 @@ class MonService(CephadmService): keyring=keyring, extra_config={'config': extra_config}) + def _check_safe_to_destroy(self, mon_id): + # type: (str) -> None + ret, out, err = self.mgr.check_mon_command({ + 'prefix': 'quorum_status', + }) + try: + j = json.loads(out) + except Exception as e: + raise OrchestratorError('failed to parse quorum status') + + mons = [m['name'] for m in j['monmap']['mons']] + if mon_id not in mons: + logger.info('Safe to remove mon.%s: not in monmap (%s)' % ( + mon_id, mons)) + return + new_mons = [m for m in mons if m != mon_id] + new_quorum = [m for m in j['quorum_names'] if m != mon_id] + if len(new_quorum) > len(new_mons) / 2: + logger.info('Safe to remove mon.%s: new quorum should be %s (from %s)' % (mon_id, new_quorum, new_mons)) + return + raise OrchestratorError('Removing %s would break mon quorum (new quorum %s, new mons %s)' % (mon_id, new_quorum, new_mons)) + + + def pre_remove(self, daemon_id: str) -> None: + self._check_safe_to_destroy(daemon_id) + + # remove mon from quorum before we destroy the daemon + logger.info('Removing monitor %s from monmap...' % daemon_id) + ret, out, err = self.mgr.check_mon_command({ + 'prefix': 'mon rm', + 'name': daemon_id, + }) + class MgrService(CephadmService): TYPE = 'mgr'