]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: add commands to set services to managed/unmanaged 50897/head
authorAdam King <adking@redhat.com>
Mon, 13 Feb 2023 20:01:59 +0000 (15:01 -0500)
committerAdam King <adking@redhat.com>
Tue, 11 Apr 2023 21:01:02 +0000 (17:01 -0400)
Fixes: https://tracker.ceph.com/issues/58713
Signed-off-by: Adam King <adking@redhat.com>
(cherry picked from commit b0d8c0846cbe0ebae69dbdeb3f2982213ab56a58)

Conflicts:
src/pybind/mgr/orchestrator/module.py

doc/cephadm/services/index.rst
src/pybind/mgr/cephadm/inventory.py
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/tests/test_cephadm.py
src/pybind/mgr/orchestrator/_interface.py
src/pybind/mgr/orchestrator/module.py

index 605a0215239a247f6867df5ce04e3a13b6251158..32ad90b20b008000905ede8735ffc26f7e743606 100644 (file)
@@ -676,6 +676,22 @@ To disable the automatic management of dameons, set ``unmanaged=True`` in the
 
    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::
 
@@ -683,6 +699,13 @@ To disable the automatic management of dameons, set ``unmanaged=True`` in the
   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
 -------------------------------------
 
index 9ffc9b1806b041b39a1909b35281334063924bc2..fcbad42b7d929d90400dece4d9d5e8d5e39be3ee 100644 (file)
@@ -349,6 +349,15 @@ class SpecStore():
     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):
     """
index 6c8e7497f5540f7447ead8f6cd1c885619241177..de8beee618709192dcc72639aacb525cf52c9ded 100644 (file)
@@ -2882,6 +2882,10 @@ Then run the following:
     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"):
index 908926c83a9dc325e58036769f4e569fc9fd9224..a45e6744d33a242f145fdb43621501b22ed7fc1a 100644 (file)
@@ -2242,3 +2242,11 @@ Traceback (most recent call last):
         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
index 47009f4f4151fb1847fc95e78a4f0da6f73b3d5b..650c3a7da1b086dc700de4bd853f24e70fb80204 100644 (file)
@@ -494,6 +494,14 @@ class Orchestrator(object):
             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.
index 84fd0c5c10eccb69da7325a9c9ed0a0783e81987..d35711f6ed779792ab5c9e4629288a0e5b9a2078 100644 (file)
@@ -1385,6 +1385,22 @@ Usage:
 
         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:
         """