From 852ca83933bd49a5b0df0be37a2cd1574bbc2ea7 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 23 Feb 2021 12:28:27 -0500 Subject: [PATCH] mgr/cephadm: put service_name in unit.meta and use it when available Inferring service_name from the daemon name is error-prone. Fixes: https://tracker.ceph.com/issues/46219 Signed-off-by: Sage Weil --- src/pybind/mgr/cephadm/serve.py | 7 +++++-- src/pybind/mgr/cephadm/tests/test_cephadm.py | 15 ++++++++++----- src/pybind/mgr/orchestrator/_interface.py | 11 +++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index 5d8de604ce91d..001c26a3a06d9 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -274,6 +274,7 @@ class CephadmServe: sd.memory_usage = d.get('memory_usage') sd.memory_request = d.get('memory_request') sd.memory_limit = d.get('memory_limit') + sd._service_name = d.get('service_name') sd.version = d.get('version') if sd.daemon_type == 'osd': sd.osdspec_affinity = self.mgr.osd_service.get_osdspec_affinity(sd.daemon_id) @@ -799,8 +800,6 @@ class CephadmServe: self._registry_login(daemon_spec.host, self.mgr.registry_url, self.mgr.registry_username, self.mgr.registry_password) - daemon_spec.extra_args.extend(['--config-json', '-']) - self.log.info('%s daemon %s on %s' % ( 'Reconfiguring' if reconfig else 'Deploying', daemon_spec.name(), daemon_spec.host)) @@ -809,6 +808,10 @@ class CephadmServe: daemon_spec.host, daemon_spec.name(), 'deploy', [ '--name', daemon_spec.name(), + '--meta-json', json.dumps({ + 'service_name': daemon_spec.service_name, + }), + '--config-json', '-', ] + daemon_spec.extra_args, stdin=json.dumps(daemon_spec.final_config), image=image) diff --git a/src/pybind/mgr/cephadm/tests/test_cephadm.py b/src/pybind/mgr/cephadm/tests/test_cephadm.py index 310c763827542..58d10e8fd7f14 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -291,11 +291,16 @@ class TestCephadm(object): CephadmServe(cephadm_module)._check_daemons() - _run_cephadm.assert_called_with('test', 'mon.test', 'deploy', [ - '--name', 'mon.test', '--reconfig', '--config-json', '-'], - stdin='{"config": "\\n\\n[mon]\\nk=v\\n[mon.test]\\npublic network = 127.0.0.0/8\\n", ' - + '"keyring": "", "files": {"config": "[mon.test]\\npublic network = 127.0.0.0/8\\n"}}', - image='') + _run_cephadm.assert_called_with( + 'test', 'mon.test', 'deploy', [ + '--name', 'mon.test', + '--meta-json', '{"service_name": "mon"}', + '--config-json', '-', + '--reconfig', + ], + stdin='{"config": "\\n\\n[mon]\\nk=v\\n[mon.test]\\npublic network = 127.0.0.0/8\\n", ' + + '"keyring": "", "files": {"config": "[mon.test]\\npublic network = 127.0.0.0/8\\n"}}', + image='') @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}')) def test_daemon_check_post(self, cephadm_module: CephadmOrchestrator): diff --git a/src/pybind/mgr/orchestrator/_interface.py b/src/pybind/mgr/orchestrator/_interface.py index 6fdfeea5c5a4d..0865b00ed33c7 100644 --- a/src/pybind/mgr/orchestrator/_interface.py +++ b/src/pybind/mgr/orchestrator/_interface.py @@ -1290,6 +1290,7 @@ class DaemonDescription(object): memory_usage: Optional[int] = None, memory_request: Optional[int] = None, memory_limit: Optional[int] = None, + service_name: Optional[str] = None, ) -> None: # Host is at the same granularity as InventoryHost @@ -1314,6 +1315,8 @@ class DaemonDescription(object): # in the FSMap/ServiceMap. self.daemon_id: Optional[str] = daemon_id + self._service_name: Optional[str] = service_name + # Service version that was deployed self.version = version @@ -1358,6 +1361,12 @@ class DaemonDescription(object): if self.daemon_type == 'osd' and self.osdspec_affinity: return self.osdspec_affinity + if self._service_name: + if '.' in self._service_name: + return self._service_name.split('.', 1)[1] + else: + return '' + def _match() -> str: assert self.daemon_id is not None err = OrchestratorError("DaemonDescription: Cannot calculate service_id: " @@ -1405,6 +1414,8 @@ class DaemonDescription(object): return self.daemon_id def service_name(self) -> str: + if self._service_name: + return self._service_name assert self.daemon_type is not None if daemon_type_to_service(self.daemon_type) in ServiceSpec.REQUIRES_SERVICE_ID: return f'{daemon_type_to_service(self.daemon_type)}.{self.service_id()}' -- 2.39.5