ceph orch apply -i mgr.yaml
+Cephadm also supports setting the unmanaged parameter to true or false
+using the ``ceph orch set-unmanaged`` and ``ceph orch set-managed`` commands.
+The commands take the service name (as reported in ``ceph orch ls``) as
+the only argument. For example,
+
+.. prompt:: bash #
+
+ ceph orch set-unmanaged mon
+
+would set ``unmanaged: true`` for the mon service and
+
+.. prompt:: bash #
+
+ ceph orch set-managed mon
+
+would set ``unmanaged: false`` for the mon service
.. note::
longer deploy any new daemons (even if the placement specification matches
additional hosts).
+.. note::
+
+ The "osd" service used to track OSDs that are not tied to any specific
+ service spec is special and will always be marked unmanaged. Attempting
+ to modify it with ``ceph orch set-unmanaged`` or ``ceph orch set-managed``
+ will result in a message ``No service of name osd found. Check "ceph orch ls" for all known services``
+
Deploying a daemon on a host manually
-------------------------------------
def get_created(self, spec: ServiceSpec) -> Optional[datetime.datetime]:
return self.spec_created.get(spec.service_name())
+ def set_unmanaged(self, service_name: str, value: bool) -> str:
+ if service_name not in self._specs:
+ return f'No service of name {service_name} found. Check "ceph orch ls" for all known services'
+ if self._specs[service_name].unmanaged == value:
+ return f'Service {service_name}{" already " if value else " not "}marked unmanaged. No action taken.'
+ self._specs[service_name].unmanaged = value
+ self.save(self._specs[service_name])
+ return f'Set unmanaged to {str(value)} for service {service_name}'
+
class ClientKeyringSpec(object):
"""
def apply_snmp_gateway(self, spec: ServiceSpec) -> str:
return self._apply(spec)
+ @handle_orch_error
+ def set_unmanaged(self, service_name: str, value: bool) -> str:
+ return self.spec_store.set_unmanaged(service_name, value)
+
@handle_orch_error
def upgrade_check(self, image: str, version: str) -> str:
if self.inventory.get_host_with_state("maintenance"):
assert cephadm_module.inventory.get_addr('host5') == '1.2.3.5'
with pytest.raises(OrchestratorError):
cephadm_module.inventory.get_addr('host5.domain')
+
+ def test_set_unmanaged(self, cephadm_module):
+ cephadm_module.spec_store._specs['crash'] = ServiceSpec('crash', unmanaged=False)
+ assert not cephadm_module.spec_store._specs['crash'].unmanaged
+ cephadm_module.spec_store.set_unmanaged('crash', True)
+ assert cephadm_module.spec_store._specs['crash'].unmanaged
+ cephadm_module.spec_store.set_unmanaged('crash', False)
+ assert not cephadm_module.spec_store._specs['crash'].unmanaged
return OrchResult(l_res)
return raise_if_exception(reduce(merge, [fns[spec.service_type](spec) for spec in specs], OrchResult([])))
+ def set_unmanaged(self, service_name: str, value: bool) -> OrchResult[str]:
+ """
+ Set unmanaged parameter to True/False for a given service
+
+ :return: None
+ """
+ raise NotImplementedError()
+
def plan(self, spec: Sequence["GenericSpec"]) -> OrchResult[List]:
"""
Plan (Dry-run, Preview) a List of Specs.
return self._apply_misc([spec], dry_run, format, no_overwrite)
+ @_cli_write_command('orch set-unmanaged')
+ def _set_unmanaged(self, service_name: str) -> HandleCommandResult:
+ """Set 'unmanaged: true' for the given service name"""
+ completion = self.set_unmanaged(service_name, True)
+ raise_if_exception(completion)
+ out = completion.result_str()
+ return HandleCommandResult(stdout=out)
+
+ @_cli_write_command('orch set-managed')
+ def _set_managed(self, service_name: str) -> HandleCommandResult:
+ """Set 'unmanaged: false' for the given service name"""
+ completion = self.set_unmanaged(service_name, False)
+ raise_if_exception(completion)
+ out = completion.result_str()
+ return HandleCommandResult(stdout=out)
+
@_cli_write_command('orch set backend')
def _set_backend(self, module_name: Optional[str] = None) -> HandleCommandResult:
"""