From: Redouane Kachach Date: Tue, 17 May 2022 09:40:15 +0000 (+0200) Subject: mgr/cephadm: adding support to copy ceph conf to per fsid config location X-Git-Tag: v18.0.0~849^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F46301%2Fhead;p=ceph.git mgr/cephadm: adding support to copy ceph conf to per fsid config location Fixes: https://tracker.ceph.com/issues/55685 Signed-off-by: Redouane Kachach --- diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index b6b4211e78a77..8426f98e56bb9 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -2,6 +2,7 @@ import hashlib import json import logging import uuid +import os from collections import defaultdict from typing import TYPE_CHECKING, Optional, List, cast, Dict, Any, Union, Tuple, Set, \ DefaultDict @@ -982,6 +983,7 @@ class CephadmServe: # ceph.conf config = self.mgr.get_minimal_ceph_conf().encode('utf-8') config_digest = ''.join('%02x' % c for c in hashlib.sha256(config).digest()) + cluster_cfg_dir = f'/var/lib/ceph/{self.mgr._cluster_fsid}/config' if self.mgr.manage_etc_ceph_ceph_conf: try: @@ -997,9 +999,9 @@ class CephadmServe: for host in {s.hostname for s in all_slots}: if host not in client_files: client_files[host] = {} - client_files[host]['/etc/ceph/ceph.conf'] = ( - 0o644, 0, 0, bytes(config), str(config_digest) - ) + ceph_conf = (0o644, 0, 0, bytes(config), str(config_digest)) + client_files[host]['/etc/ceph/ceph.conf'] = ceph_conf + client_files[host][f'{cluster_cfg_dir}/ceph.conf'] = ceph_conf except Exception as e: self.mgr.log.warning( f'unable to calc conf hosts: {self.mgr.manage_etc_ceph_ceph_conf_hosts}: {e}') @@ -1027,12 +1029,12 @@ class CephadmServe: for host in {s.hostname for s in all_slots}: if host not in client_files: client_files[host] = {} - client_files[host]['/etc/ceph/ceph.conf'] = ( - 0o644, 0, 0, bytes(config), str(config_digest) - ) - client_files[host][ks.path] = ( - ks.mode, ks.uid, ks.gid, keyring.encode('utf-8'), digest - ) + ceph_conf = (0o644, 0, 0, bytes(config), str(config_digest)) + client_files[host]['/etc/ceph/ceph.conf'] = ceph_conf + client_files[host][f'{cluster_cfg_dir}/ceph.conf'] = ceph_conf + ceph_admin_key = (ks.mode, ks.uid, ks.gid, keyring.encode('utf-8'), digest) + client_files[host][ks.path] = ceph_admin_key + client_files[host][f'{cluster_cfg_dir}/{os.path.basename(ks.path)}'] = ceph_admin_key except Exception as e: self.log.warning( f'unable to calc client keyring {ks.entity} placement {ks.placement}: {e}') diff --git a/src/pybind/mgr/cephadm/tests/test_cephadm.py b/src/pybind/mgr/cephadm/tests/test_cephadm.py index 4d60e6611b25b..1a8307e430473 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -1495,31 +1495,48 @@ class TestCephadm(object): assert cephadm_module.manage_etc_ceph_ceph_conf is True CephadmServe(cephadm_module)._refresh_hosts_and_daemons() - _write_file.assert_called_with('test', '/etc/ceph/ceph.conf', b'', - 0o644, 0, 0, None) - - assert '/etc/ceph/ceph.conf' in cephadm_module.cache.get_host_client_files('test') + # Make sure both ceph conf locations (default and per fsid) are called + _write_file.assert_has_calls([mock.call('test', '/etc/ceph/ceph.conf', b'', + 0o644, 0, 0, None), + mock.call('test', '/var/lib/ceph/fsid/config/ceph.conf', b'', + 0o644, 0, 0, None)] + ) + ceph_conf_files = cephadm_module.cache.get_host_client_files('test') + assert len(ceph_conf_files) == 2 + assert '/etc/ceph/ceph.conf' in ceph_conf_files + assert '/var/lib/ceph/fsid/config/ceph.conf' in ceph_conf_files # set extra config and expect that we deploy another ceph.conf cephadm_module._set_extra_ceph_conf('[mon]\nk=v') CephadmServe(cephadm_module)._refresh_hosts_and_daemons() - _write_file.assert_called_with('test', '/etc/ceph/ceph.conf', - b'\n\n[mon]\nk=v\n', 0o644, 0, 0, None) - + _write_file.assert_has_calls([mock.call('test', + '/etc/ceph/ceph.conf', + b'\n\n[mon]\nk=v\n', 0o644, 0, 0, None), + mock.call('test', + '/var/lib/ceph/fsid/config/ceph.conf', + b'\n\n[mon]\nk=v\n', 0o644, 0, 0, None)]) # reload cephadm_module.cache.last_client_files = {} cephadm_module.cache.load() - assert '/etc/ceph/ceph.conf' in cephadm_module.cache.get_host_client_files('test') + ceph_conf_files = cephadm_module.cache.get_host_client_files('test') + assert len(ceph_conf_files) == 2 + assert '/etc/ceph/ceph.conf' in ceph_conf_files + assert '/var/lib/ceph/fsid/config/ceph.conf' in ceph_conf_files # Make sure, _check_daemons does a redeploy due to monmap change: - before_digest = cephadm_module.cache.get_host_client_files('test')[ + f1_before_digest = cephadm_module.cache.get_host_client_files('test')[ '/etc/ceph/ceph.conf'][0] + f2_before_digest = cephadm_module.cache.get_host_client_files( + 'test')['/var/lib/ceph/fsid/config/ceph.conf'][0] cephadm_module._set_extra_ceph_conf('[mon]\nk2=v2') CephadmServe(cephadm_module)._refresh_hosts_and_daemons() - after_digest = cephadm_module.cache.get_host_client_files('test')[ + f1_after_digest = cephadm_module.cache.get_host_client_files('test')[ '/etc/ceph/ceph.conf'][0] - assert before_digest != after_digest + f2_after_digest = cephadm_module.cache.get_host_client_files( + 'test')['/var/lib/ceph/fsid/config/ceph.conf'][0] + assert f1_before_digest != f1_after_digest + assert f2_before_digest != f2_after_digest def test_etc_ceph_init(self): with with_cephadm_module({'manage_etc_ceph_ceph_conf': True}) as m: