})
@handle_orch_error
- def daemon_action(self, action: str, daemon_name: str, image: Optional[str] = None) -> str:
+ def daemon_action(self, action: str, daemon_name: str, image: Optional[str] = None, force: bool = False) -> str:
d = self.cache.get_daemon(daemon_name)
assert d.daemon_type is not None
assert d.daemon_id is not None
raise OrchestratorError(
f'Unable to schedule redeploy for {daemon_name}: No standby MGRs')
+ if action == 'restart' and not force:
+ r = service_registry.get_service(daemon_type_to_service(
+ d.daemon_type)).ok_to_stop([d.daemon_id], force=False)
+ if r.retval:
+ raise OrchestratorError(f'Unable to {action} daemon {d.name()}: {r.stderr} \nNote: Warnings can be bypassed with the --force flag')
+
if action == 'rotate-key':
if d.daemon_type not in ['mgr', 'osd', 'mds',
'rgw', 'crash', 'nfs', 'rbd-mirror', 'iscsi']:
# assert action in ["start", "stop", "reload, "restart", "redeploy"]
raise NotImplementedError()
- def daemon_action(self, action: str, daemon_name: str, image: Optional[str] = None) -> OrchResult[str]:
+ def daemon_action(self, action: str, daemon_name: str, image: Optional[str] = None, force: bool = False) -> OrchResult[str]:
"""
Perform an action (start/stop/reload) on a daemon.
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command('orch daemon')
- def _daemon_action(self, action: DaemonAction, name: str) -> HandleCommandResult:
+ def _daemon_action(self, action: DaemonAction, name: str, force: bool = False) -> HandleCommandResult:
"""Start, stop, restart, redeploy, reconfig, or rotate-key for a specific daemon"""
if '.' not in name:
raise OrchestratorError('%s is not a valid daemon name' % name)
- completion = self.daemon_action(action.value, name)
+ completion = self.daemon_action(action.value, name, force=force)
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())