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
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))
+import json
import logging
from abc import ABCMeta, abstractmethod
from typing import TYPE_CHECKING, List, Callable, Any
return True
+ def pre_remove(self, daemon_id: str) -> None:
+ """
+ Called before the daemon is removed.
+ """
+ pass
class MonService(CephadmService):
TYPE = 'mon'
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'