r = True
# remove any?
- while remove_daemon_hosts and not self.cephadm_services[daemon_type].ok_to_stop(
- [d.daemon_id for d in remove_daemon_hosts]):
+ def _ok_to_stop(remove_daemon_hosts: Set[orchestrator.DaemonDescription]) -> bool:
+ daemon_ids = [d.daemon_id for d in remove_daemon_hosts]
+ r = self.cephadm_services[daemon_type].ok_to_stop(daemon_ids)
+ return not r.retval
+
+ while remove_daemon_hosts and not _ok_to_stop(remove_daemon_hosts):
# let's find a subset that is ok-to-stop
remove_daemon_hosts.pop()
for d in remove_daemon_hosts:
from abc import ABCMeta, abstractmethod
from typing import TYPE_CHECKING, List, Callable, Any, TypeVar, Generic, Optional, Dict, Any, Tuple
-from mgr_module import MonCommandFailed
+from mgr_module import HandleCommandResult, MonCommandFailed
from ceph.deployment.service_spec import ServiceSpec, RGWSpec
from orchestrator import OrchestratorError, DaemonDescription
- def ok_to_stop(self, daemon_ids: List[str]) -> bool:
+ def ok_to_stop(self, daemon_ids: List[str]) -> HandleCommandResult:
names = [f'{self.TYPE}.{d_id}' for d_id in daemon_ids]
+ out = f'It is presumed safe to stop {names}'
+ err = f'It is NOT safe to stop {names}'
if self.TYPE not in ['mon', 'osd', 'mds']:
- logger.info('Upgrade: It is presumed safe to stop %s' % names)
- return True
+ logger.info(out)
+ return HandleCommandResult(0, out, None)
- ret, out, err = self.mgr.mon_command({
+ r = HandleCommandResult(*self.mgr.mon_command({
'prefix': f'{self.TYPE} ok-to-stop',
'ids': daemon_ids,
- })
+ }))
- if ret:
- logger.info(f'It is NOT safe to stop {names}: {err}')
- return False
+ if r.retval:
+ err = f'{err}: {r.stderr}' if r.stderr else err
+ logger.error(err)
+ return HandleCommandResult(r.retval, r.stdout, err)
- return True
+ out = f'{out}: {r.stdout}' if r.stdout else out
+ logger.info(out)
+ return HandleCommandResult(r.retval, out, r.stderr)
def pre_remove(self, daemon_id: str) -> None:
"""
if not self.upgrade_state or self.upgrade_state.get('paused'):
return False
- ok = self.mgr.cephadm_services[s.daemon_type].ok_to_stop([s.daemon_id])
+ r = self.mgr.cephadm_services[s.daemon_type].ok_to_stop([s.daemon_id])
- if ok:
- logger.info('Upgrade: It is presumed safe to stop %s.%s' %
- (s.daemon_type, s.daemon_id))
+ if not r.retval:
+ logger.info(f'Upgrade: {r.stdout}')
return True
- logger.info('Upgrade: It is NOT safe to stop %s.%s' %
- (s.daemon_type, s.daemon_id))
+ logger.error('Upgrade: {r.stderr}')
+
time.sleep(15)
tries -= 1
return False